生成器与列表推导式
1.生成器
用python代码构建的迭代器就是生成器,生成器的本质就是迭代器。
构建生成器的两种方法:
1.利用生成函数构建生成器
2.利用列表推导式构建生成器
1 def func(x): 2 x += 1 3 func(5) #函数的执行命令,并且接受函数的返回值。 4 print(func(5)) #如果没有给return则返回None 5 print(func) #函数名返回内存地址 <function func at 0x00000254AA2CDF28>
生成器函数
1 def func1(x): 2 x += 1 3 print(1111) 4 print(1111) 5 print(1111) 6 print(1111) 7 print(1111) 8 print(1111) 9 yield x 10 x +=2 11 print(2222) 12 yield 'alex' 13 14 x +=3 15 16 print(func1(5)) #此时函数中有生成器函数yield,没有return,返回内容为生成器对象地址 <generator object func1 at 0x00000254AA233990> 17 print(func1) #函数名返回内存地址 <function func1 at 0x00000254AA2D4048> 18 19 g_obj = func1(5) # 生成器函数对象 20 # print(g_obj) # <generator object func1 at 0x0000025E5D618780> 21 print(g_obj.__next__()) 22 print(g_obj.__next__())
一个next 对应一个 yield
yield 将值返回给 生成器对象.__next__()
yield与 return
return 结束函数,给函数的执行者返回值
yield 不会结束函数,一个next对应一个yield,给生成器对象.__next__() 返回值。
列表推导式:一行代码几乎搞定你需要的任何的列表。
1. 循环模式 [变量(加工后的变量) for 变量 in iterable]
1 l = [i for i in range(1,101)] 2 print(l) 3 l2 = ['python%s期' % i for i in range(1,16)] 4 print(l2) 5 print([i*i for i in range(1,11)])
2.筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]
1 l3 = [i for i in range(1,31) if i % 2 == 0] 2 print(l3) 3 print([i for i in range(1,31) if i % 3 == 0]) 4 print([i**2 for i in range(1,31) if i % 3 == 0]) 5 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], 6 ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] 7 print([j for i in names for j in i if j.count('e') == 2])
列表推导式
优点:一行解决,方便。
缺点:容易着迷,不易排错,不能超过三次循环。
列表推导式不能解决所有列表的问题,所以不要太刻意用。
生成器表达式:将列表推导式的 [] 换成() 即可。
1 g = (i for i in range(100000000000)) 2 print(g) 3 print(g.__next__()) 4 print(g.__next__()) 5 print(g.__next__()) 6 print(g.__next__()) 7 print(g.__next__()) 8 print(g.__next__()) 9 10 mcase = {'a': 10, 'b': 34} 11 mcase_frequency = {mcase[k]: k for k in mcase} 12 print(mcase_frequency) 13 14 squared = {x**2 for x in [1, -1, 2]} 15 print(squared)