目录
2.send(值) 给上一个yield位置传一个值 #send其实有next方法和传值方法
注意点:send在使用时,如果没有先使用 __next__方法,则send()方法中的参数必为None
1.列表推导式 [结果 for 变量 in 可迭代对象 if 筛选]
2.字典推导式 {键 : 值 for 变量 in 可迭代对象 if 筛选} 结果是
3.集合推导式 {结果 for 变量 in 可迭代对象 if 筛选}
1.生成器的三种创建办法:
1.通过生成器函数 关键字 yield
def func():
print(1)
yield 1
print(2)
yield 2
l = func()
print(l.__next__())
print(l.__next__())
# print(l.__next__()) #报错,StopIteration
2.通过生成器表达式创建生成器
生成器表达式:
(结果 for 变量 in 可迭代对象 if 筛选) #重点是小括号
get1 = ( i for i in range(10) if i%2 == 0)
print(get1)
#结果:<generator object <genexpr> at 0x0000017DB9320938>
3.通过数据转换
2.生成器函数定义:
函数中包含了yield的就是生成器函数
注意:生成器函数被执行,获取到的是生成器,而不是函数的执行
yield from
def func():
li = [1,2,3,4]
yield from li
f = func()
for i in f:
print(i, end=",")
#结果:1,2,3,4
3.生成器的优点:
li = []
def func():
for i in range(1000):
li.append(i)
print(li)
#比较浪费空间,一次性取完
def func():
for i in range(1000):
yield i
f = func()
for i in range(10):
print(f.__next__())
#需要多少取多少
4.使用方式:
1. __next__()
get1 = ( i for i in range(10) if i%2 == 0) #生成器就是一个自己写的迭代器
#方式一:
for i in get1:
print(i,end=" ")
#方式二:
for i in range(5):
print(get1.__next__(),end=" ")
#结果:0 2 4 6 8
2.send(值) 给上一个yield位置传一个值 #send其实有next方法和传值方法
def func():
for i in range(10):
print(i)
l = yield "你好"
print(l)
f = func()
print(f.__next__()) #第一次执行,会执行完yield,暂留在那里
print(f.send("我不好")) #使用send会将参数赋值给上一次暂留位置,也就是程序中的l ,然后继续执行,知道下一个yield暂停
#结果:
# 0
# 你好
# 我不好
# 1
# 你好
注意点:send在使用时,如果没有先使用 __next__方法,则send()方法中的参数必为None
2.send(值)
5.推导式
1.列表推导式 [结果 for 变量 in 可迭代对象 if 筛选]
li = [i for i in range(10) if i%2 == 0]
print(li)
#结果:[0, 2, 4, 6, 8]
2.字典推导式 {键 : 值 for 变量 in 可迭代对象 if 筛选} 结果是
li_1 = [1,2,3,4]
li_2 = [1,2,3,4]
dic = {li_1[i]:li_2[i]for i in range(len(li_1))}
print(dic)
#结果:{1: 1, 2: 2, 3: 3, 4: 4}
3.集合推导式 {结果 for 变量 in 可迭代对象 if 筛选}
set1 = { i for i in range(10) if i%2 == 0}
print(set1)
#结果:{0, 2, 4, 6, 8}