openstack   了解即可

def generator():
print(123)
yield 1
print(456)
yield 2
print(789) #按道理print(789)不执行,但是最下面遇到next了,就会打印,但是会报错

g = generator()
ret = g.__next__()
print('***',ret)
ret = g.__next__()
print('***',ret)= g.__next__()
注意这个程序和上边程序的对比
def generator():
print(123)
content = yield 1 # 遇见= 等号,先执行等号右边的。
print('***',content)
print(456)
yield 2


g = generator()
ret = g.__next__()
print('***',ret)
ret = g.send('hello') #send效果和next效果一样
print('***',ret)

send 

send作用范围与next一样

send的获取下一个值得效果和next效果基本一致,只是在获取下一个值得时候,给上一个的yiled的位置传一个值。

 

使用send注意事项

1,第一次使用生成器的时候,是用next获取下一个值。

2,最后一个yiled不能接收外部的值

3,send用的少,next用的多

 

#获取移动平均值
def average():
sum = 0
count = 0
avg = 0
while 1:
num = yield avg
sum += num
count += 1
avg = sum/count

avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)

 

预激生成器的装饰器

①def③def inner(*args,**kwargs):
⑦g = func(*args,**kwargs) #g=average()
⑧g.__next__() #注意哦
⑩③return④return②@init⑤ #average = init(averrage)def⑨sum =⑩count =⑩①avg = 0
while 1:
⑩⑥num = ⑩②yield⑩⑩
⑩⑦sum +=⑩⑧count += 1
⑩⑨avg = sum/count

⑩④avg_g =⑥
⑩⑩①ret = ⑩⑤avg_g.send(10)
⑩⑩②print(ret)

 

yield from

def generator():
a = '12345'
b = 'abcde'
yield from a #yiled from a = #for i in a:
yield from b #yiled i

g = generator()
for i in g:
print(i)

 

列表推导式

print([i for i in range(10)])

结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
egg_list = (['鸡蛋%s' %i for i in range(10)])
print(egg_list)

结果 ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

 

生成器表达式

g = (i for i in range(10))   #注意与列表推导式区别就在括号变了
g = (i for i in range(10))     #这时的g就是生成器了,打印g结果是<generator object <genexpr> at 0x000001F1442CEF10>
print(g)
for i in g :
print(i)

 

注意,列表推导式和生成器表达式的区别

1,括号不一样

2,返回值不一样

3,生成器表达式返回的是内存地址,所以几乎不占内存

 

各种推导式:列表推导式   集合推导式   字典推导式    (元祖没有推导式)

 

列表推导式

print([i for i in range(10)])

结果 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
egg_list = (['鸡蛋%s' %i for i in range(10)])
print(egg_list)

结果 ['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']

[每一个元素或者相关元素的操作  for  元素  in  可迭代的数据类型]

[满足条件的元素相关操作  for  元素  in  可迭代的数据类型  if  元素相关条件]    完整的列表推导式

ret = [i for i in range(30) if i%30 ==#完整的列表推导式
print(ret)

注意:在列表推导式中先看if

1,如果有if ,列表里元素的个数不一定都在新列表里

2,如果没有if,列表里元素对应的个数会和新列表里元素的个数一样

列表嵌套

names = [['jake','tom','steven'],['alice','jill','eva']]
ret = [name for li in names for name in li if name.count('e') == 2]
print(ret)

 

字典推导式

例一:将一个字典的key和value对调

dic = {'a':1,'b':2}
dic1 = {dic[k]:k for k in dic}
print(dic1)

 

集合推导式

例:计算列表中每个值的平方,自带去重功能

squared = {x**2 for x in [1, -1, 2]}
print(squared)
# Output: set([1, 4])

 

 

练习题:

例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

li = ['abcd','edft','asd']
li1 = [i.upper() for i in li if len(i) >= 3]
print(li1)