生成器是一种可迭代的类型,如列表或元组。(都可以使用for 循环来获取其中的每一个元素)
与列表不同的是,他们不允许使用任意索引,但是他们仍然可以通过for循环迭代。
可以使用函数和yield 语句来创建他们。
例如:
def countdown():
i=5
while i >0:
yield i #注意 遇到yield 阻塞 每次调用遇到yield都阻塞(目的是不让他一次性执行完 需要
# 使用在执行) 最终结果返回的是生成器
i-=1 #遇到 return 返回的是函数的结果 遇到return函数结束
for i in countdown():
print(i)
由于他们一次产生一个项目,所有生成器不具有列表的内存限制。事实上他们可以是无限的。
(创建生成器的目的就是他们省内存,在做大文件读取时,如果一次性都读取完,内存占用太大,使用生成器的方式,比较省内存)
def infinite_sevences():
while true :
yield 7
for i in infiniter_sevences():
rint(i)
#结果 7 7 7 7 7 7 7 7 7
简而言之,生成器允许你声明一个像迭代器一样的函数,也就是说他可以在for 循环中使用。
有限的生成器可以通过将他们作为参数传递给list函数来装换成列表。
def numbers(x):
for i in range (x):
if i %2==0:
yield i
print(list(numbers(11)))
#[0,2,4,6,8,10]
使用生成器可以提高性能,这是懒惰(按需)生成值的结果,这意味着更低的内存使用率.而且,在开始使用之前,我们不需要等到所有的元素都被生成。
标签:函数,生成器,yield,内存,使用,def 来源: https://blog.csdn.net/asdfddsasf/article/details/122404245
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。