生成器和生成器表达式
Posted bigc008
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器和生成器表达式相关的知识,希望对你有一定的参考价值。
什么是生成器?
def func(): print("含有yield的是生成器") yield 10#返回值 ret=func()#函数并不执行 而是记录代码 print(ret)#当使用到函数时 开始执行 获取到的是生成器 #生成器和迭代器类似,可以使用__next__来获取到下一个值
例如
def func(): print("111") yield 222 gen=func() ret=gen.__next__() print(ret) 》》》111 222
列表推导式
取1-100的奇数
lst=[i for i in range(1,101) if i%2==1] print(lst)
对比之前的想法
lst=[] for i in range(1,101): if i %2==1: lst.append(i) print(lst)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
字典推导式
lst1=["东北","山西","山东"] lst2=["大乱炖","老陈醋","大饼"] dic={lst1[i]:lst2[i] for i in range(len(lst1))} print(dic)
一个面试题. 难度系数500000000颗星:
def add(a, b): return a + b def test(): for r_i in range(4): yield r_i g = test() for n in [2, 10]: g = (add(n, i) for i in g) print(list(g))
推导过程思路主要利用生成器的特性 不调用或者执行的时候不会给值
def add(a, b):#a+b return a + b def test():#0-3 for r_i in range(4): yield r_i g = test()#函数不执行,获取到的是生成器 for n in [2, 10]:#这个循环获取到列表中的两个值,(巨坑开始) g = (add(n, i) for i in g) print(list(g))
把for循环拆开分析
n=2 g = (add(n, i) for i in g)#注意 这里并不执行代码 而是记录代码 n=10 g = (add(n, i) for i in g)#这里的第二个g,已经替换成n=2时的g = (add(n, i) for i in g)
即
n=2 g = (add(n, i) for i in g)#注意 这里并不执行代码 而是记录代码 n=10 g = (add(n, i) for i in (add(n, i) for i in g))#这里的第二个g,已经替换成n=2时的g = (add(n, i) for i in g)
即
def add(a, b):#a+b return a + b def test():#0-3 for r_i in range(4): yield r_i g = test()#函数不执行,获取到的是生成器 n=10 g = (add(n, i) for i in (add(n, i) for i in g)) print(list(g))#函数开始执行
》》》[20, 21, 22, 23]
友情提示: 惰性机制, 不到最后不会拿值
这个题要先读一下. 然后自己分析出结果. 最后用机器跑一下.
以上是关于生成器和生成器表达式的主要内容,如果未能解决你的问题,请参考以下文章