python_14_生成器

时间:2021-09-13 00:22:10

什么是生成器?

  -- 动态的生成有规律的列表和元组,查询多少才会生成多少数据,不需要时数据不存在

  - 大到10几万数据,就省空间了

什么是列表生成式?

-- [ handle_i_result for i in range(start,end,step)]                - 列表成式

-- handle_i_result            是对 i (迭代对象)进行处理 (i*2  i*3 ......)

-- [i*2 for i in range(10)]           生成 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

什么是生成器?

builder_1 = (handle_i_result for i in range(start,end,step))      # 定义一个生成器

builder_1 = (i*2 for i in range(0,10))

builder_1.__next__()                                                         # 生成第1元素

builder_1.__next__()                                                         # 生成第2个元素

-- 坑:只记住当前位置,只有__next__() 去取值,只能取下一个值 -- py2中为next()方法

还有其他的生成器?

-- 函数也可以做生成器

- 斐波那契数列 除了第 1 和第 2 个数,其他数都是前两个数相加和

      [1,1,2,3,5,8,13 , ......]

#!/usr/bin/python3

def fib(max_1):
    n, a, b = 0, 0, 1
    while n < max_1:
        yield b
        a, b = b, a+b
        n += 1

if __name__ == '__main__':
    get_number = 30    # 想获得多少个斐波拉契数
    try:
        fib_1 = fib(20)
        for i in range(get_number):
            print(fib_1.__next__())
    except:
        print("取的位数大于生成的个数,嘻嘻")

# 通过yield 执行从函数中跳出来了,再通过__next__方法重新回到函数,yield把函数变成器,
# 定义了20个长度斐波那契数列,如果__next__取的值多了,就会出现异常