python笔记 - 高级属性(20160413)

本文深入讲解了Python中的生成器概念,介绍了如何通过列表生成式创建生成器,以及使用yield关键字定义生成器函数的方法。此外,还探讨了生成器与普通函数在执行流程上的不同之处。

生成器:

  在python中,一遍循环一遍计算出结果的运算机制,称为生成器:generator
  要创建一个generator,有很多种方法,
  第一种:只要把一个列表生成式的[]改成()即可
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>


用next(g)打印出每一个generator的每一个元素
generator保存的是算法,每次调用next(g),就计算出下一个元素的值,知道计算出最后一个元素,没有更多元素时,
抛出StopIteration错误。


斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:


def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a + b
        n = n + 1
    return 'done'


上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:


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

    return 'done'


这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:


>>> f = fib(6)
>>> f
<generator object fib at 0x104feaaa0>


这里,比较难理解的是generator和函数执行流程不一样。函数时顺序执行,遇到return语句或者租后一行函数语句就返回。而变成generator的函数,
在每次调用next()的时候执行,遇到yield语句返回,就在此执行时从上次返回的yield语句处继续执行。


def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')

    yield(5)


调用该generator时,首先要生成一个generator对象,然后用next()函数不断获得下一个返回值:


>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration


迭代器:

直接作用于for循环的数据类型有:
一类:结合数据类型,如list、tuple、dict、set、str等;
一类:generator,包括生成器和带yield的generator funtion
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable
可以使用isinstance()判断一个对象是否是Iterable对象;
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值