Python基础-高级-生成器-Generator

来源:互联网 发布:beast成员关系解析知乎 编辑:程序博客网 时间:2024/05/15 01:43

生成器-Generator

可以推算的列表

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

列表和生成器书写区别

  1. 列表是用[]围起来
  2. 生成器(Generator)使用()围起来

示例

#!/usr/bin/env python3# -*- coding: utf-8 -*-# 列表和生成器书写区别# 列表是用[]围起来mList = [x*x for x in range(10)]# 运行结果[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]print(mList)# 生成器(Generator)使用()围起来mGenerator = (x*x for x in range(10))# 运行结果<generator object <genexpr> at 0x02BE0A50>print(mGenerator)

运行结果

D:\PythonProject>python Run.py[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]<generator object <genexpr> at 0x02BE0A50>

生成器(Generator)-遍历

示例

#!/usr/bin/env python3# -*- coding: utf-8 -*-# 生成器(Generator)-遍历# 生成器(Generator)使用()围起来mGenerator = (x*x for x in range(10))# 运行结果<generator object <genexpr> at 0x02BE0A50>print(mGenerator)# 方法 1 next(生成器)print(next(mGenerator))# 方法 2for value in mGenerator:    print(value)

运行结果

D:\PythonProject>python Run.py<generator object <genexpr> at 0x02320A50>0149162536496481

有推算功能的List实在是强大,所以我们要给他来点实战行的东西

yield关键字

斐波拉契数列用列表:除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, …

思路

  • tuple = (index, a+index)
  • a=tuple[0]
  • b=t[1]

示例

#!/usr/bin/env python3# -*- coding: utf-8 -*-# 斐波拉契数列用列表:除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...# 1, 1, 2, 3, 5, 8, 13, 21, 34def fib(max):    # 同时赋予初值    n,a,index = 0,0,1    while n < max:        # 有yield关键字就表示该函数是generator函数了        # 作为回报 print(b)写成 yield(b)        # 遇到 yield 语句返回        yield index        # tuple = (index, a+index),a=tuple[0],b=t[1]        a,index = index, a+index        n = n+1    # 遇到 yield 语句返回    return "随便"for n in fib(6):    print(n)

运行结果

D:\PythonProject>python Run.py112358

获取生成器的返回值

因为遇到 yield 语句返回,所以这里使用try-catchde 方式来获取

示例

#!/usr/bin/env python3# -*- coding: utf-8 -*-# 斐波拉契数列用列表:除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...# 1, 1, 2, 3, 5, 8, 13, 21, 34def fib(max):    # 同时赋予初值    n,a,index = 0,0,1    while n < max:        # 有yield关键字就表示该函数是generator函数了        # 作为回报 print(b)写成 yield(b)        # 遇到 yield 语句返回        yield index        # tuple = (index, a+index),a=tuple[0],b=t[1]        a,index = index, a+index        n = n+1    # 遇到 yield 语句返回    return "我是返回值"x = fib(6)# 获取返回值def test():    while True:        try:            # 获取 yield 返回的数据            z = next(x)            print("生成器 :" + str(z))        except StopIteration as e:            print(e.value)            breaktest()

运行结果

D:\PythonProject>python Run.py生成器 :1生成器 :1生成器 :2生成器 :3生成器 :5生成器 :8我是返回值
原创粉丝点击