生成器;
def func(): print("111") return 222 ret = func() print(ret) #结果: # 111 # 222 #将return 换成 yield就是生成器 def func(): print("111") yield 222 ret = func() print(ret) #结果: #<generator object func at 0x0000025256283A40>
以上两段代码执行的结果不一样. 因为下面的代码有yield,所以这个函数就是一个生成器函数.这个时候再执行这个函数,就不在是函数的执行了.而是获取这个生成器.
所以要想运行这个函数,就要执行__next__()函数来执行函数
生成器表达式和列表推导式的区别:
1. 列表推导式比较耗内存. ⼀次性加载. 生成器表达式几乎不占用内存. 使用的时候才分配和使用内存
2. 得到的值不⼀样. 列表推导式得到的是⼀个列表. 生成器表达式获取的是⼀个生成器.
生成器的惰性机制:生成器只有在访问的时候才取值. 说白了就是找他要他才给值,不要的话,他是不会执行的
生成器可以使用for循环来循环获取内部的元素:
def func(): print(111) yield 222 print(333) yield 444 print(555) yield 666 gen = func() for i in gen: print(i) #结果: # 111 # 222 # 333 # 444 # 555 # 666
2、列表推导式
列表推导式:最终给的是列表
语法: [最终结果(变量) for 变量 in 可迭代对象]
lst = [] for i in range(1,15): lst.append("python%s" % i) print(lst) #结果: #['python1', 'python2', 'python3', 'python4', 'python5', 'python6', 'python7', 'python8', 'python9', 'python10', 'python11', 'python12', 'python13', 'python14']
总结:
推导式有列表推导式,字典推导式,集合推导式,没有元组推导式
生成器表达式:(结果 for 变量 in 可迭代对象 if 条件筛选)
生成器表达式可以直接获取到生成器对象,生成器可以直接进行for循环. 生成器具有惰性机制