生成器和生成器表达式

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)) # []

 

以上是关于生成器和生成器表达式的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Codegen 没有找到生成代码的操作或片段

vscode代码片段生成vue模板

前端开发工具vscode如何快速生成代码片段

前端开发工具vscode如何快速生成代码片段

VS Code配置snippets代码片段快速生成html模板,提高前端编写效率

OnSaveInstaceState 和动态生成的布局和片段