# 对于普通函数而言,出现多个return,只会执行到第一return,后面的语句不再执行 deffunc(): print("My name is cdc") return"Hello" print("My age is 18") return"18" print("哈哈哈")
func() """ 结果 My name is cdc Hello """
# 对于生成器而言,有多个yield并不影响函数的执行,每当调用一次next,就会从上一个yield执行到下一个yield deffunc(): print("My name is cdc") yield"Hello" print("My age is 18") yield"18" print("哈哈哈")
g = func() print(g.__next__()) print(g.__next__()) """ 结果 My name is cdc Hello My age is 18 18 """
# 若通过next取值的个数超过函数中yield的个数,则溢出,报停止迭代错误 deffunc(): print("My name is cdc") yield"Hello" print("My age is 18") yield"18" print("哈哈哈")
g = func() print(g.__next__()) print(g.__next__()) print(g.__next__()) """ My name is cdc Hello My age is 18 18 哈哈哈 Traceback (most recent call last): File "F:/生成器.py", line 12, in <module> print(g.__next__()) StopIteration """
生成器函数的send方法
send 方法也和 next 一样,也可以让生成器向下执行一次,但是同时可以给上一个 yield 返回一个值。
deffunc(): print("My name is cdc") a = yield"Hello" print("a",a) print("My age is 18") b = yield"18" print("b",b) print("哈哈哈") c = yield"over" print("c",c) print("呵呵")
# 不能将send作为第一个方法 g = func() print(g.send(2222)) # TypeError: can't send non-None value to a just-started generator print(g.send(1111)) print(g.__next__()) print(g.__next__())
deffunc(): print("My name is cdc") a = yield"Hello" print("a", a) print("My age is 18") b = yield"18" print("b", b) print("哈哈哈") c = yield"over"# 此处c还是可以接收到最后一个send传过来的值的,只是再往下找yield的时候会报错 print("c", c) print("呵呵")
# 不能在最后使用send g = func() print(g.__next__()) print(g.send(1111)) print(g.__next__()) print(g.send(2222))
""" My name is cdc Hello a 1111 My age is 18 18 b None 哈哈哈 over c 2222 呵呵 Traceback (most recent call last): print(g.send(2222)) StopIteration """
生成器的元素可以通过 for 循环遍历取出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
deffunc(): yield111 yield222 yield333 yield444
g = func() for i in g: print(i)
""" 111 222 333 444 """
生成器的元素还可以通过转换数据类型获取:
1 2 3 4 5 6 7 8 9 10 11
deffunc(): yield111 yield222 yield333 yield444
g = func() lst = list(g) print(lst)
# [111, 222, 333, 444]
转换成列表类型后,会自动执行生成器中的 next 方法取出所有数据
推导式实现生成器
一、列表推导式
首先我们来看一段代码,要求给出一个列表,向列表中添加1-13
1 2 3
lst = list() for i inrange(1,14): lst.append(i)
换成列表推导式的形式
语法 :[最终结果(变量) for 变量 in 可迭代对象]
返回结果:按要求操作过后的列表
1
lst = [i for i inrange(1, 14)]
列表推导式的常用语法: [ 结果 for 变量 in 可迭代对象]
1 2 3
# 例:从python1到python14写入列表lst lst = ['python%s' % i for i inrange(1,15)] print(lst)
还可以对列表中的数据进行筛选:[ 结果 for 变量 in 可迭代对象 if 条件 ]
1 2 3
# 获取1-100内所有的偶数 lst = [i for i inrange(1, 100) if i % 2 == 0] print(lst)
1 2 3 4 5 6 7 8 9 10 11
# 小练习 # 1. 获取1-100内能被3整除的数 lst = [i for i inrange(1, 101) if i % 3 == 0]
# 2. 100以内能被3整除的数的平方 lst = [i * i for i inrange(1, 101) if i % 3 == 0]
# 3. 寻找名字中带有两个e的⼈的名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] lst = [name for first in names for name in first if name.count("e") == 2]
二、生成器表达式
生成器表达式和列表推导式的语法基本上是一样的,只是把[]替换成()
1 2 3
gen = (i for i inrange(10)) print(gen) # 打印结果是一个生成器: <generator object <genexpr> at 0x106768f10>
可以通过for循环取值
1 2 3
gen = (i for i inrange(10)) for i in gen: print(i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 小练习 生成器表达式版 # 获取1-100内能被3整除的数 gen = (i for i inrange(1,100) if i % 3 == 0) for num in gen: print(num)
# 100以内能被3整除的数的平方 gen = (i * i for i inrange(100) if i % 3 == 0) for num in gen: print(num)
# 寻找名字中带有两个e的⼈人的名字 gen = (name for first in names for name in first if name.count("e") >= 2) for name in gen: print(name)