生成器
生成器的本质是迭代器.
生成器的3种创建方法
1.通过生成器函数
2.通过生成器表达式创建生成器
3.通过数据转换
生成器函数:
def func():
print("我是周杰伦")
return "昆凌"
print("我是王力宏")
return "李云迪"
#return直接返回结果,结束函数的调用,所以我是王力宏就不会打印出来。
yield返回结果,可以让函数分段执行
如果把return改成yield,当前这个函数就是生成器函数
func() #通过函数func()来创建一个生成器,
print(func()) #generator object func at 0x 000000237B8E0,换成yield后的结果
g = func() #通过函数func()来创建一个生成器,要使用的话 需要用__next()__来使用。
print(g.__next__()) #我是周杰伦 昆凌
print(g.__next__()) #我是王力宏 李云迪
最后一个yield之后,如果在进行__next__()会报错。
#return直接返回结果,结束函数的调用;yield也是返回结果,可以让函数分段执行
send()函数:
def func():
print(“大渣粥”)
a = yield “11”
print(“狗不理”)
b = yield “22”
print(“大麻花”)
c = yield “33”
g = func()
print(g.__next__()) # 大渣粥 11
print(g.send(1)) # 狗不理 22,从上一个yield结束的当前位置接着走,走到下一个yield;把1发送到a=后面,那么a=1
print(g.__next__()) # 大麻花 33,
__next__():让生成器向下执行一次
send():也可以让生成器向下执行一次
#next()可以让生成器向下执行一次
send()也可以让生成器向下执行一次,给上一个yield传一个值,第一个位置不能用send(),必须用next();最后一个也不要用send()传值
推倒式
不用推倒式的方法:
lst = [ ]
for i in range(1,15):
lst.append(i)
print(lst)
采用推倒式的方法:
语法[最终结果(变量) for 变量 in 可迭代对象]
lst = 【‘python%s’ % i for i in range(1,15)】
#[‘python1’,‘python2’,‘python3’,‘python4’。。。‘python14’]
筛选模式:[结果 for 变量 in 可迭代对象 if 条件]
#获取1-100内所有偶数
lst = [i for i in range(1,100) if i % 2 == 0]
print(lst)
#寻找下面名字中有两个带e的人的名字
names=[['Tom','Billy','Jefferson','Steven'],['Alice','Jilly',‘sheery’]]
lst = [name for first in names for name in first if name.count('e') == 2]
print(lst)
生成器表达式和列表推倒式的语法基本上是一样的,只是把【】替换成()
gen = (i for i in range(10))
print(gen) # generator object at 0x00000bb12
for el in gen:
print(el) # 0 1 2 3 9
print(list(gen)) #[0,1,2,3 9]