1.生成器初始
# 1.1 生成器
1.迭代器: 迭代器是底层实现了__next__和__iter__方法的对象, 一般我们调用某些方法会返回迭代器, 或者通过iter()函数返回可迭代对象的迭代器. 迭代器的好处是节省内存
2.在程序中为了节省内存而编写的具有迭代器功能的东西叫做生成器
# 1.2 生成器的产生
python中提供构造生成器的方法有两种: 生成器函数 与 生成器表达式
1.生成器函数:
常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
2.生成器表达式
类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
# 1.3 生成器本质与优势
1.本质: 生成器的本质就是迭代器(生成器是一种特殊的迭代器)
2.优势: 惰性运算, 节省内存
2.生成器的构造
# 1.生成器函数: 个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
import time
def genrator_fun1():
a = 1
print('现在定义了a变量')
yield a
b = 2
print('现在又定义了b变量')
yield b
g1 = genrator_fun1()
print('g1 : ',g1) #打印g1可以发现g1就是一个生成器
print('-'*20) #我是华丽的分割线
print(next(g1))
time.sleep(1) #sleep一秒看清执行过程
print(next(g1))
# 2.生成器表达式: 将列表推导式的[]换做()即可
g = (i for i in range(10))
print(type(g))
# 重点掌握:
1.yield关键字的作用
2.生成器函数的定义
3.生成器表达式的定义
4.构建生成器
5.使用next从生成器取值
3.生成器面试题
# 1.生成器面试题(-)
def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g = test()
for n in [1,10,5]:
g = (add(n,i) for i in g)
print(list(g))
# 2.生成器面试题(二)
def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)