生成器的本质就是一个迭代器
生成器和迭代器的区别:
迭代器python自带
生成器程序员自己写的
生成器和迭代器通过send和内存地址进行区分
文件句柄是一个迭代器 具有__iter__ 和 __next__两种方法
# 基于函数编写
def func(): print("func") yield func # 函数体中出现yield代表要声明一个生成器 g = func() # 生成一个生成器 print(g) # 获取到的是一个生成器的内存地址 ret = g.__next__() # 启动生成器 print(ret) print(next(g))
优点:list,tuple,str节省时间,取值方便,使用灵活(具有自己私有方法)
缺点:大量消耗内存
优点:节省空间
缺点:不能直接查看值,使用不灵活,消耗时间,一次性,不可逆行
优点:节省空间,人为定义
缺点:不能直接查看,消耗时间,一次性,不可逆行
生成器的应用场景:当数据量较大时,推荐使用生成器
相同点:
都具有返回内容
都可以返回多个,但是return写多个只会执行一个
不同点:
return 终止循环 yield是暂停生成器
yield能够记录当前执行位置
一个yield对应一个next
yield form 将可迭代对象中的元素逐个返回
yield 一次性返回
普通循环和筛选
列表
普通循环
print([i for i in range(10)])
print([变量 for循环])
?
筛选模式
print([i for i in range(10) if i % 2 ==0])
print([i for i in range(10) if i > 2])
[加工后的变量 for循环 加工条件]
字典
普通循环
print({i: i+1 for i in range(10)})
{键:值 for循环}
?
筛选模式
print({i: i+1 for i in range(10) if i % 2 == 0})
{加工后的键:值 for循环 加工条件}
集合
普通循环
print({i for i in range(10)})
{变量 for循环}
?
筛选模式
print({i for i in range(10) if i % 2 == 1})
{加工后的变量 for循环 加工条件}
生成器
普通模式
tu = (i for i in range(10))
( 变量 for循环)
?
筛选模式
tu = (i for i in range(10) if i > 5)
(加工后的变量 for循环 加工条件)
for i in tu:
print(i)
"""
all() any() bytes() callable() chr() complex() divmod() eval()
exec() frozenset() globals() hash() help() id() input()
int() iter() locals() next() oct() ord() pow() repr() round()
"""
原文:https://www.cnblogs.com/womenzt/p/12283591.html