生成器和生成器表达式

 

 

 

 

实例

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

 

posted @ 2018-11-01 20:31  柳帅  阅读(143)  评论(0编辑  收藏  举报
//替换成自己路径的js文件