Python基础12-函数3(生成器)

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异常
  • 生成器只会遍历一次,想再次遍历,需要重新生成一次。

你可能感兴趣的:(Python基础12-函数3(生成器))