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) 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 init(func): #func = average() ③def inner(*args,**kwargs): ⑦g = func(*args,**kwargs) #g=average() ⑧g.__next__() #注意哦 ⑩③return g ④return inner ②@init⑤ #average = init(averrage) = inner def average(): ⑨sum = 0 ⑩count = 0 ⑩①avg = 0 while 1: ⑩⑥num = ⑩②yield avg⑩⑩ ⑩⑦sum += num ⑩⑧count += 1 ⑩⑨avg = sum/count ⑩④avg_g = average()⑥ ⑩⑩①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 == 0] #完整的列表推导式 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)