1生成器
生成器的本质就是迭代器,生成器的特点和迭代器一样,取值方式也有相同之处(__next__ send()是给上一个yiel传值
生成器一般是由生成器函数或者生成器表达式创建
2生成器函数
和普通函数一样,只是函数中含有yield的函数就是生成器函数,
生成器函数在执行的时候,默认返回的是生成器,不会执行函数的内容操作.执行内容操作需要用__next__才可以
send()给上一个yield传值,第一次执行生成器代码的时候不能使用send(),最后yield结束程序时也不能使用send()传值
send()与__next相同之处是都是向前运行一步,区别是send()传值,__next__是读取函数
def s(): print("111") q = yield 222 print(q) print("333") w =yield 444 print(w) print("555") e = yield 666 print(e) print("777") r = yield "完了" print(r) a = s() # print(a)# 结果<generator object s at 0x000001EBBA7D0F10> 获取生成器 b = a.__next__()# 111 print(b)# 222 c = a.__next__() # None 333 print(c) #444 d = a.send(888) #888 555 print(d) #666 e = a.send("牛肉汤")# 牛肉汤 777 print(e) # 完了 f = a.__next__()# f = a.__next__()#StopIteration print(f)
3推导式:通过一行代码来构建你要的列表, 看起来代码简单,但是出错误以后排错很难.
<1>列表推导式:lst=[结果,for循环,条件筛选]
lst = [i for i in range(100) if i % 2 == 0] print(lst) #结果为[0,2,4,6...98] 100以内的偶数
<2>字典推导式:dic={k,v for循环,条件筛选}
#要求:把dic的key值与value调换 dic={1:"唐僧",2:"悟空",3:"八戒",4:"沙师弟"} dic_new={v:k for k,v in dic.items()} print(dic_new) # {'唐僧': 1, '悟空': 2, '八戒': 3, '沙师弟': 4}
<3>集合推导式:s = {k,for循环,条件} #集合推导式可以自动帮我们生成一个集合,集合的特点是无序,不重复.自带去重功能.
要求:对列表内的内容去重 lst = [1,2,1,6,3,7,8,9,6,5,8,4] s = {abs(i) for i in lst} print(s)#结果{1, 2, 3, 4, 5, 6, 7, 8, 9}
总结:推导式有列表推导式,字典推导式,集合推导式,没有元组推导式
4生成器表达式:(结果 for循环 条件)
特点:1惰性机制 2 节省空间(鸡蛋)3只能向前
# 去掉列表中带有字母d并且出现过一次的字符串 names=[["andy","monedy","tuesday","third"],["sunday","friday","wangjun","666"]] gen = (el for i in names for el in i if el.count("d")==1 ) for m in gen: print(m) 结果 #andy #monedy #tuesday #third #sunday #friday
总结:列表表达式与生成器表达式的区别:1生成器表达式和列表推导式的语法基本上是⼀一样的. 只是把[]替换成()
2列表表达式一次性加载,占用内存较多,生成器表达式只是在调用时才分配和占用内存,节省空间
3结果不一样,列表表达式得到的是一个列表,生成器表达式得到的是一个生成器
练习题
# (1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 # lst =["alex", "wu","wukai", "chenyifa", "mo", "ti", "feng"] # lst_new=[i.upper()for i in lst if len(i)>3] # print(lst_new) # 结果为['ALEX', 'WUKAI', 'CHENYIFA', 'FENG'] # # # (2)求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表 # s = [(x,y)for x in range(5) if x %2==0 for y in range(5) if y %2==1] # print(s) # 结果为[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)] # # # (3)求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]] # M = [[1,2,3],[4,5,6],[7,8,9]] # lst = [[x, y, z] for x in M[0] if x == 3 for y in M[1]if y == 6 for z in M[2]if z == 9] # print(lst) # 结果 [[3, 6, 9]] # # # (4)求出50以内能被3整除的数的平方,并放入到一个列表中。 # ls=[i*i for i in range(50) if i%3==0 ] # print(ls) #[0, 9, 36, 81, 144, 225, 324, 441, 576, 729, 900, 1089, 1296, 1521, 1764, 2025, 2304] # # # (5)构建一个列表:['python1期', 'python2期', # 'python3期', 'python4期', 'python6期', 'python7期', # 'python8期', 'python9期', 'python10期'] # l=["python%s期"% s for s in range(1,11)] # print(l) #结果为 ['python1期', 'python2期', 'python3期', 'python4期', 'python5期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期'] # # # (6)构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)] # l1=[(x,x+1)for x in range(6)] # print(l1)# [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)] # (7)构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] # l2=[s for s in range(19)if s%2==0] # print(l2) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18] #(8)有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白'] # 将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3'] # l1 = ['alex', 'WuSir', '老男孩', '太白'] # l3 = [l1[a]+str(a) for a in range(len(l1))] # print(l3) #['alex0', 'WuSir1', '老男孩2', '太白3'] #(9)有以下数据类型: '''x = { 'name':'alex', 'Values':[{'timestamp':1517991992.94, 'values':100,}, {'timestamp': 1517992000.94, 'values': 200,}, {'timestamp': 1517992014.94, 'values': 300,}, {'timestamp': 1517992744.94, 'values': 350}, {'timestamp': 1517992800.94, 'values': 280} ],}''' #将上面的数据通过列表推导式转换成下面的类型: # [[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]] # l4=[[k['timestamp'],k['values']]for k in x['Values']] # print(l4)# 结果为[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]