生成器,推导式,表达式

一.生成器

1生成器的定义

  生成器的本质是迭代器

  生成器一般由生成器函数或者生成器表达式来创建

  生成器是手写的迭代器

2.生成器的特点

  生成器的特点和迭代器一样.

(1)惰性机制

(2)节省内存

(3)只向下进行

3.生成器的取值方式

扫描二维码关注公众号,回复: 2741456 查看本文章

  生成取值方式和迭代器一样

(1)__next__()

(2)send():给上一个yield传值.

二.生成器函数

1.和普通的函数没有什么区别.里面有yield的函数就是生成器函数.

def func():
    print("哈哈")
    yield 1
gen = func()  #不会执行函数,拿到的是生成器

2.生成器函数在执行的时候.默认不会执行函数体,而会形成生成器,通过生成器的__next__()分段执行这个函数

def order():
    for i in range(10000):
        yield "衣服"+str(i)
g = order() # 获取生成器
mingwei = g.__next__()
print(mingwei)
zhaoyining = g.__next__()
print(zhaoyining)

3.send()给上一个yield传值,不能开头(没有上一个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("胡辣汤")
print(ret2)

ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send( "猫粮")
print(ret4)
for i in func(): # for的内部一定有__next__()
    print(i)

print(list(func())) # 内部都有__next__()

三.推导式

1.列表推导式  [结果 for循环 条件筛选]

lst = []
for i in range(1, 16):
    lst.append("python"+str(i))
print(lst)
lst = ["python"+str(j) for j in range(1,16)]
print(lst)
lst = ["pytjon"+str(j) for j in range(1,6)]
print(lst)
View Code
lst = [i for i in range(1000) if i%2==1]
print(lst)
奇数
lst = [i*i for i in range(100) if i%3==0]
print(lst)
100以内能被3整除的数的平方
#寻找名字中带两个e的人的名字
name = [["Tom","Billy","Jefferson","Andrew","Wesley","Steven","Joe"],
["Alice","Jill","Ana","Wendy","Jennifer","Sherry"]]
lst = [name for line in names for name in line if type(name)==str and name.count("e")==2]
print(lst)

2.字典推导式  {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)) if i < 2}
print(dic)



dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}
d = {v : k for k,v in dic.items()}
print(d)

3.集合推导式 {k    for循环  条件筛选}

s = {i for i in range(100)} # 可去除重复
print(s)

四.生成器表达式

(结果  for循环  条件)

特点:
1. 惰性机制
2. 只能向前
3. 节省内存(鸡蛋)
#生成器函数
def func():
    print(111)
    yield 222
    yield 333
g = func #获取生成器
g1 = (i for i in g)#生成器
g2 = (i for i in g1) #生成器
print(list(g))  #[222,333] 源头,从源头把数据拿走了
print(list(g1))  #[]    这里执行的时候,源头已经没有数据了
print(list(g2))  #[]   这里也没有值了
# 求和
def add(a, b):
    return a  + b

# 生成器函数 #  0-3
def test():
    for r_i in range(4):
        yield  r_i

# 0,1,2,3
g = test() # 获取生成器

for n in  [2, 10]:
    g = (add(n, i) for i in g)
print(g)


# 到最后往里面放数据就对了
# print(list(g))
# print(list(g)) # []

当生成器没执行的时候,无论生成器里的值,还是别的值都不拿

猜你喜欢

转载自www.cnblogs.com/Bug66/p/9467532.html
今日推荐