生成器
#生成器:用python的代码写的迭代器.生成器的本质就是迭代器.
构建生成器的两种方法:
1.通过生成器函数
2.生成器表达式
生成器的函数:
#普通函数
def func(x):
x += 1
return x
a = func(666)
print(a)
#生成器函数
def func(x):
x += 1
print(666)
print(666)
print(666)
print(666)
print(666)
print(666)
print(666)
yield x
x += 2
print(777)
yield 'adams'
g = func(1)
print(g) #<generator object func at 0x000001CAF12DDE08>
print(g.__next__())#打印666....666 2
print(g.__next__())#打印666....666 2 777 adams
每一次执行__next__,函数执行到一个yield.yield将值返还给生成器对象.__next__()
#yield 和 return的区别
return 结束函数,给函数的执行者一个返回值
yield 不结束函数,每个__next__()对应一个yield,给生成器对象__next__()返回值
#生成器函数 和 迭代器的区别
1.自定制的区别
生成器是通过python的代码编写的.
迭代器是内置的.
2.内存级别的区别
迭代器需要可迭代器转化.可迭代对象转化成迭代器非常占用内存
生成器直接创建,不需要转化,极大节省内存
#send 和 next
相同点:与next方法一样,也是对生成器取值.(相当于执行一次yield)
不同点:send 可以给上一个yield 传值.
第一次取值永远都是next,最后一个yield永远也得不到send传的值.
#列表推导式:一行代码几乎搞定你需要的任何的列表。
1.循环模式
l1 = [i for i in range(1,101)]
l2 = ['python%s期' % i for i in range(1, 16)]
l3 = [i**2 for i in range(1, 11)]
2.筛选模式
l4 = [i for i in range(1,31) if i % 2 == 0]
生成器表达式:将列表推导式的[]换成()即可。
g = = (i for i in range(1,101))

浙公网安备 33010602011771号