生成器和推导式

def func():
    print('哈哈哈')
    yield 1 # return 和 yield 都可以返回数据
    print('呵呵呵')
gen = func()  # 不会执行你的函数,拿到的是生成器
ret = gen.__next__() # 会执行到下一个yield
print(ret)
gen.__next__() # 继续执行函数到下一个yield
函数中如果有yield 这个函数就是生成器函数,生成器函数() 获取的是生成器,这个时候不执行函数
yield:相当于return,可以返回数据,但是yield不会彻底中断函数,分段执行函数
def order():
    for i in range(100000):
        yield '衣服'+ str(i)
g = order() # 获取生成器
mingwei = g.__next__()
print(mingwei)
zhaoyinning = g.__next__()
print(zhaoyinning)

 send() 和 __next__()的区别:

1.send和next都是让生成器向下走一次

2.send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()

def eat():
    print("我吃什么啊")
    a = yield "馒头"
    print("a=",a)
    b = yield "大"
    print("b=",b)
    c = yield "韭菜盒子"
    print("c=",c)
    yield "GAME OVER"
gen = eat() # 获取生成器
ret1 = gen.__next__()
print(ret1) # 馒头
ret2 = gen.send("胡辣汤") # a = 胡辣汤
print(ret2) # 大饼
ret3 = gen.send("狗粮") # b = 狗粮
print(ret3) # 韭菜盒子
ret4 = gen.send("猫粮") # c = 猫粮
print(ret4) # GAME OVER

 

推导式:用一句话生成一个列表

lst = ['python'+str(i) for i in range(1,16)]
print(lst)

语法:[ 结果  for循环  判断]

lst = [i for i in range(100) if i%2 == 1]
print(lst)
# 100 以内能被3整除的数的平方
lst = [i*i for i in range(100) if i%3==0]
print(lst)
# 寻找名字中带有两个e的人的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# 不用推导式的方法
lst = []
for line in names:
    for name in line:
        if name.count('e') == 2:
            lst.append(name)
print(lst)

#推导式的方法
lst = [name for line in names for name in line if name.count('e') == 2]
print(lst)

字典推导式

语法:{k:v for循环 条件筛选}

#[11,22,33,44] => {0:11,1:22,2:33,3:44}
lst = [11,22,33,44]
dic = {i:lst[i] for i in range(len(lst))}
print(dic)
# 键值对互换
dic = {'jj':'林俊杰','jay':'周杰伦','zs':'赵四','ln':'刘能'}
dic2 = {v:k for k,v in dic.items()}
print(dic2)

集合推导式(可以去重复)

lst = [1,1,4,6,7,4,2,2]

s = {el for el in lst}

print(s)

 

生成器表达式(由于惰性机制)

tu = (i for i in range(10)) # 没有元组推导式,生成器表达式
print(tu) # 生成器
print(tu.__next__())
def func():
    print(111)
    yield 222
g = func()
g1 = (i for i in g)
g2 = (i for i in g1)

print(list(g)) # [222] 源头,从源头把数据拿走了 
print(list(g1)) # []   这里执行的时候,源头已经没有数据了
print(list(g2)) # []   这里也没有值
def add(a,b):
    return a + b
# 生成器函数 # 0-3
def test(): for j in range(4): yield j
# 0,1,2,3 g
= test() # 获取生成器

# 懒
for n in [1,10,5]: g = (add(n,i) for i in g)
# 到最后往里面放数据就对了
print(list(g)) # [15,16,17,18]
print(list(g)) # []

 

posted on 2019-05-08 21:11  Little_Raccoon  阅读(164)  评论(0编辑  收藏  举报