Python基础-函数
生成器
1 概念
- 是一个特殊的迭代器(迭代器的抽象层更高级)
- 拥有迭代器的特性
* 惰性计算数据,节省内存
* 能够记录状态,并通过 next() 函数,访问下一个状态
* 具备可迭代特性
2 创建方式
# 列表推导式格式
# l = [i for i in range(1, 10000000) if i % 2 == 0] # 会立即生成带内容列表
# 生成器 generator 推导式格式
l = (i for i in range(1, 10000000) if i % 2 == 0)
print(next(l))
print(next(l))
print(l.__next__()) # 等价与 调用 next(),同时带有状态记录
# 生成器是特殊迭代器,可以被 for in 进行迭代。
for i in l:
print(i)
- 生成器函数
* 函数体中包含 yield 语句
* 这个函数的执行结果就是生成器
# yied, 可以去阻断当前的函数执行, 然后, 当使用next()函数, 或者, __next__(),
# 都会让函数继续执行, 然后, 当执行到下一个 yield语句的时候, 又会被暂停
def test():
print("xxx")
yield 1
print("a")
yield 2
print("b")
yield 3
print("c")
yield 4
print("d")
yield 5
print("e")
# 下面的 for 循环创建的 test 函数,等价于上面的 test 函数方式
# def test():
# for i in range(1, 9):
# yield i
g = test()
print(g) >>> 获取的g 就是一个生成器
print(next(g)) >>> xxx \n 1
print(next(g)) >>> a \n 2
print(next(g)) >>> b \n 3
print(next(g)) >>> c \n 4
print(next(g)) >>> error
3 产生数据方式
- 生成器具备可迭代性
- next()函数 等价于 生成器.next()
- for in
4 send() 方法
- send 方法有一个参数,指定的是上一次被挂起的 yield 语句的返回值
- 相比于 .next(),可以额外的给 yield 语句传值
- 注意,第一次调用 send 方法需要传入 None 参数
def test():
print("xxx")
res1 = yield 1 "ooo"
print(res1)
res2 = yield 2
print(res2)
g = test()
print(g.__next__())
print(g.__next__())
print(g.send("ooo"))
print(g.send(None))
print(g.send(666))
5 关闭生成器
- g.close()
- 后续如果继续调用,会抛出 StopIteration异常提示
def test():
yield 1
print("a")
yield 2
print("b")
yield 3
print("c")
return 10
g = test() # 创建生成器
print(g.__next__())
print(g.__next__())
g.close() # 关闭生成器
print(g.__next__())
print(g.__next__())
6 注意
- 如果函数带有 return,进行迭代的时候会直接终止,抛出 StopIteration异常
- 生成器只会遍历一次,想再次遍历,需要重新生成一次。
网友评论