Python学习笔记__3.4章 生成器

# 这是学习廖雪峰老师python教程的学习笔记

1、概览

列表元素按照某种算法推算出来,在循环的过程中不断推算出后续的元素。这种一边循环一边计算的机制,称为生成器:generator

1.1、创建 generator

1)方法一

只要把一个列表生成式的[]改成(),就创建了一个generator

L = [x * x for x in range(10)]  这是列表生成式

g = (x * x for x in range(10)) 这是generator

>>> g

<generator object <genexpr> at 0x1022ef630>

generator的值不能直接打印,需要用 next()函数获得,或者通过for循环打印

  • next(g)

每调用一次,返回一个generator的值,当所有值返回完毕后,再调用会报错StopIteration

  • for 循环

>>> for n in g:

...     print(n)

2)方法二

在函数体中,有 yield。当然,generator的函数,也可以用 next() 或者 for 循环获取返回值

函数是顺序执行,遇到return语句或者最后一行函数语句就返回

generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

def odd():

    print('step 1')

    yield 1

    print('step 2')

    yield(3)

    print('step 3')

    yield(5)

>>> o = odd()

>>> next(o)  # next(odd()) 调用效果一样。for循环调用见例题

step 1

1

>>> next(o)

step 2

3

>>> next(o)

step 3

5

 

2、例题

1、编写一个生成斐波那契数列的 generator 函数

# 函数编写

def fib(max):

    n, a, b = 0, 0, 1

    while n < max:

        yield b

        a, b = b, a + b

        n = n + 1

    return 'done'

# for循环获取返回值,但获取不到generator 执行完的报错返回

f=fib(6)  # 定义一个generator对象 f

for n in f:

    print(n)

# 获取值得同时,获取generator的报错返回

g=fib(6)

while True:

    try:

        x=next(g)

        print('g',x)

    except StopIteration as e:  # 捕捉错误

        print('Generator return value:',e.value)  # 输入错误的返回值

        break

2、编写一个杨辉三角的generator函数

# -*- coding: utf-8 -*- 

 

def triangles(): 

    N=[1] 

    while True: 

        yield N        #generator函数与普通函数的差别:在执行过程中,遇到yield就中断,下次又继续执行 

        N.append(0) 

        N=[N[i-1] + N[i] for i in range(len(N))]  #杨辉三角的生成式

 

if __name__ == '__main__':    # 如果是运行的.py文件,就执行下面的命令。调试用

    n=0 

    for t in triangles(): 

        print(t) 

        n=n+1 

        if n == 10: 

            break  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值