
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用__iter__方法),所以生成器就是一种迭代器。
二、生成器的两种形式 1. 生成器函数使用yIEld代替return返回结果,yIEld语句一次返回一个结果,返回一个结果后,挂起函数的状态,下次继续执行。
def fib(max): n,a,b = 0,1 while n < max: yIEld b a,b = b,a + b n = n + 1 return ‘done‘f = fib(10)print(next(f))print(next(f))print(next(f))print(next(f))
# 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yIEld语句返回,再次执行时从上次返回的yIEld语句处继续执行。def odd(): print(‘step 1‘) yIEld 1 print(‘step 2‘) yIEld(3) print(‘step 3‘) yIEld(5)>>> o = odd()>>> next(o)step 11>>> next(o)step 23>>> next(o)step 35>>> next(o)Traceback (most recent call last): file "<stdin>",line 1,in <module>stopiteration2. 生成器表达式
# 三元表达式name = ‘alex‘res = ‘SB‘ if name == ‘alex‘ else ‘123‘print(res)SB# 列表解析l1 = [‘鸡蛋%s‘ % i for i in range(1,10)]l2 = [‘鸡蛋%s‘ % i for i in range(1,10) if i > 5]# l3 = [‘鸡蛋%s‘ % i for i in range(1,10) if i > 5 else i] # 没有四元表达式print(l1)print(l2)[‘鸡蛋1‘,‘鸡蛋2‘,‘鸡蛋3‘,‘鸡蛋4‘,‘鸡蛋5‘,‘鸡蛋6‘,‘鸡蛋7‘,‘鸡蛋8‘,‘鸡蛋9‘][‘鸡蛋6‘,‘鸡蛋9‘]# 生成器表达式g = (‘鸡蛋%s‘ % i for i in range(1,10) if i > 5)print(next(g))print(next(g))print(next(g))print(next(g))鸡蛋6鸡蛋7鸡蛋8鸡蛋9总结
以上是内存溢出为你收集整理的Python-11-生成器全部内容,希望文章能够帮你解决Python-11-生成器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)