生成器和生成器表达式
Posted angle6-liu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器和生成器表达式相关的知识,希望对你有一定的参考价值。
实例
1、生成器函数:就是把函数中的return换成了yield
def gen(): print("爽歪歪") yield "娃哈哈" # 将此处的return换成yield print("酸酸乳") yield "AD钙奶" #可以让我们的函数分段运行 print("黄焖鸡米饭")
2、生成器的的取值方法:__next__( )和send( )
func(): print("水饺") a = yield "大馅水饺" print("a=", a) print("烧饼") b = yield "武大郎烧饼" print("b=",b) print("老婆饼") c = yield "只要老婆不要饼" print("c=", c) gen = func() # 生成器 print("返回值是:", gen.__next__()) print("返回值是:",gen.send("混沌面")) # 和__next__()一样也是向下找yield. 给上一个yield传值 print("返回值是:",gen.send("胡辣汤")) # 和__next__()一样也是向下找yield. 给上一个yield传值 print("返回值是:",gen.send("马拉")) # 和__next__()一样也是向下找yield. 给上一个yield传值
注:send( )先将括号内部的内容复制给前面yield的变量,再继续寻找下一个yield,找不到,报错StopIteration
send( )不能放在开头,也不能放置在末尾。
3、yield from语法
def gen(): lst = ["?花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"] lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"] yield from lst #等价于 ‘’‘ yield lst[0] yield lst[1] vield lst[2] yield lst[3] ’‘’ yield from lst2
4、迭代器存有的数值为222,而不是111 222
def func(): print(111) yield 222 g = func() print(lst(g))#[222] print(g.__next__()) #报错StopIteration
5、列表推导式格式[结果 for循环1 for循环2 if判断 ]
# 寻找名字中带有两个e的?的名字 name.count("e") == 2 names = [[‘Tom‘, ‘Billy‘, ‘Jefferson‘, ‘Andrew‘, ‘Wesley‘, ‘Steven‘,‘Joe‘], [‘Alice‘, ‘Jill‘, ‘Ana‘, ‘Wendy‘, ‘Jennifer‘, ‘Sherry‘, ‘Eva‘]] lst = [name for el in names for name in el if name.count("e") == 2] print(lst)
6、字典和集合的推导式与列表相同:{结果 for循环 if判断}
dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"} # 把字典中的key和value互换 dic = {"赵敏":"张无忌", "小龙女":"杨过", "黄蓉":"郭靖"} dic1 = { v:k for k, v in dic.items()} print(dic1)
7、生成器的特点:
本质是迭代器. __next__() 1. 省内存 2. 惰性机制 3. 只能向前
8、深坑
def func(): # 生成器函数 print(111) yield 222 g = func() # 生成器 -> 没有执行过__next__() g1 = (i for i in g) # 生成器表达式. 也没有__Next__() g2 = (i for i in g1) # 生成器表达式. 也没有__Next__() # 到此为止, 没有人拿过值 print(list(g2)) # 111 [222] print(list(g)) # [] print(list(g1)) # []
以上是关于生成器和生成器表达式的主要内容,如果未能解决你的问题,请参考以下文章