? Python 生成器和推导式_Linux编程_Linux公社-Linux系统门户网站 bet36手机投注_bet36 无法登陆 解决_bet36体育投注平台
手机版
你好,游客 登录 注册
背景:
阅读新闻

Python 生成器和推导式

[日期:2019-10-07] 来源:Linux社区? 作者:wangtp [字体: ]

一、Python生成器和生成器函数
1、生成器和生成器函数的概念
? ? 1、生成器的本质是迭代器
? ? 2、函数中包含yield,就是生成器函数

2、生成器函数的写法
? ? def func():
? ? ? ? a =10
? ? ? ? yield 20
? ? gen = func()? #没有执行,而是生成一个生成器
? ? 普通函数和生成器函数的不同
? ? 1、普通函数名()表示函数的的执行
? ? 2、生成器函数名()不是函数的执行,而是生成一个生成器

? ? yield和return的不同
? ? 1、retun表示返回,同时函数执行终止,return之后的代码不会执行
? ? 2、yield也表示返回,函数暂停,函数分段执行

? ? def func():
? ? ? ? a =10
? ? ? ? yield 20
? ? ? ? b = 30
? ? ? ? yield 40
? ? gen = func()? #生成一个生成器
? ? gen.__next__() #返回20 执行到第一个yield
? ? gen.__next__() #返回40 从第一个yeild开始执行到第二个yield

3、如何得到生成器
? ? 1、生成器函数
? ? ? 生成器函数名()
? ? 2、生成器表达式
? ? 3、类型转换

4、生成器的特点
? ? 1、节省内存
? ? 2、惰性机制(每执行一次__next__()方法,取值一次)
? ? 3、只能向前取值,不能退后

5、生成器的取值
? ? __next__()方法和send()方法的区别
? ? ? 前者表示向下取值
? ? ? 后者除了表示向下取值,还可以给上一个yield传递值
? ? ? 注意:send()方法不能用在第一个取值,第一个取值只能用__next__()
? ? ? ? ? ? 最后一个yield也不能用send()

6、生成器的好处
? ? 节约内存
'''

#关于__next__()方法和send()方法的例子
def func():
? ? a = 1
? ? a2 = yield 2
? ? print(a2)
? ? c = 3
? ? c2 = yield 4
? ? print(c2)
? ? yield 5
gen = func() #生成一个生成器
gen.__next__()? #执行到了第一个yield
gen.send('test') #把参数传递到第一个yield
gen.send('娃哈哈') #把参数传递到第2个yield

#生成器的好处-节约内存的例子
#一次性买100件衣服,需要地方保存,比较浪费内存
li1 = []
def func2():
? ? for i in range(1,11):
? ? ? ? li1.append('衣服 %s' % i)
? ? return li1
ret = func2()
print(ret)? #100件衣服一次性生成出来,放到列表到了
print('----------1')

#最好的方式是下一个100件衣服的订单,但是呢,需要一件,送一件,就不需要专门的地方保存了,节约内存
#方法1 生成器函数
def func3():
? ? for i in range(1,11):
? ? ? ? yield ('衣服 %s' %i)
gen = func3()? #生成一个生成器
print(gen.__next__()) #第一件
print(gen.__next__()) #第二件
for i in gen: #生成器本质是迭代器,支持for循环
? ? print(i)

#方法2 生成器表达式
# gen = (i for i in range(1,11))
# print(gen)? #生成一个生成器(类比:就是买衣服订单)
# print(gen.__next__()) #第一件
# print(gen.__next__()) #第二件
# for i in gen: #生成器本质是迭代器,支持for循环
#? ? print(i)

二、推导式
推导式(列表推导式,字典推导式等)
1、列表推导式:[结果? ? ? for循环 if条件]
2、字典推导式:{key: value for循环 if条件}
3、集合推导式:{key? ? ? ? for循环 if条件}
注意:没有元组推导式

三、生成器表达式
1、生成器表达式:(结果 for循环 if条件)
2、惰性机制(类比:弹夹没子弹了,不能将同一个值,生成2次)
? 生成器是记录在内存中的一段代码,产生的时候,没有执行

生成器表达式和列表推导式的区别类比:
1、买100个鸡蛋,列表推导式:是一次性把100个鸡蛋买回来,需要地方存储
2、生成器表达式:是买一只母鸡,需要鸡蛋就给下蛋

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-10/160935.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款