面试题收集
1. 生成器的惰性机制: 生成器只有在访问的时候才取值. 说白了. 你找他要他才给你值. 找他要. 他是不会执行的.
def func():
print(111)
yield 222
g = func() # ⽣成器g
g1 = (i for i in g) # 生成器g1. 但是g1的数据来源于g
g2 = (i for i in g1) # ⽣成器g2. 来源g1
print(list(g)) # 获取g中的数据. 这时func()才会被执行. 打印111.获取到222. g完毕.
print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据了
print(list(g2)) # 和g1同理
深坑==> 生成器. 要值得时候才拿值.
2.
def add(a, b):
return a + b
def test():
for r_i in range(4):
yield r_i # 0、1、2、3
g = test()
for n in [2, 10]:
g = (add(n, i) for i in g)
print(list(g))
把for循环拆分 对g进行分别命名 比较好理解
def add(a, b):
return a + b
def test():
for r_i in range(4):
yield r_i # 0、1、2、3
g = test()
n=2
g2 = (add(n, i) for i in g1)
n=10
g2 = (add(n, i) for i in g1)
print(list(g2))
3. 一种可以直接把可迭代对象中的每一个数据作为⽣成器的结果进⾏返回——yield from
⼩坑: yield from是将列表中的每⼀个元素返回. 所以. 如果写两个yield from 并不会产生交替的效果.
def gen():
lst = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]
lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"]
yield from lst
yield from lst2
g = gen()
for el in g:
print(el)