python_generator生成器

1.生成器

生成器的概念要比迭代器稍显复杂, 因为生成器是能够返回一个迭代器的函数, 其最大的作用是将输入对象返回为一个迭代器. Python中使用了迭代的概念, 是因为当需要循环遍历一个较大的对象时, 传统的内存载入方式会消耗大量的内存, 不如需要时读取一个元素的方式更为经济快捷. 

生成器是一次生成一个值的特殊类型函数(特殊的迭代器). 可以将其视为可恢复函数. 调用该函数将返回一个可用于生成连续 x 值的生成器Generator. 

有两点要先明确:

任意生成器都是迭代器(反之, 不成立) 

任意生成器, 都是一个可以延迟创建值的工厂(可控性) 


生成器的创建

将列表生成式中[]改成() 
通过列表生成式, 可以直接创建一个列表. 但是, 受到内存限制, 列表容量肯定是有限的. 而且, 创建一个包含百万元素的列表, 不仅是占用很大的内存空间, 如:我们只需要访问前面的几个元素, 后面大部分元素所占的空间都是浪费的. 

因此, 没有必要创建完整的列表(节省大量内存空间). 在Python中, 我们可以采用生成器:边循环, 边计算的机制—>generator.

生成器是特殊的迭代器,可以通过next()内置函数来获得generator的下一个返回值

list = [x*x for x in range(10)]
print(list)
testlist = (x*x for x in range(10))
print(testlist)

print(next(testlist))
print(next(testlist))
print(next(testlist))

测试结果:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x05ED96F0>
0
1
4

generator是保存的算法,每次调用next()内置函数,才能计算出下一个元素.

list = (x*x for x in range(10))
for i in list:
    print(i)

测试结果:

0
1
4
9
16
25
36
49
64
81

2 函数--关键字yield创建生成器

简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。

著名的斐波那契数列用列表生成式写不出来,但用函数很简单:


def fun(max):
    n = 0
    a = 0
    b = 1
    while n < max:
        print(b)
        a = b
        b = a+b
        n += 1
    return "down"

fun(5)

测试结果:

1
2
4
8
16

斐波那契数列的推算规则非常类似generator,也就是说上面的函数和generator无限接近了,只需要把print(b)改成yield b就行:

def fun(max):
    n = 0
    a = 0
    b = 1
    while n < max:
        yield b
        a = b
        b = a+b
        n += 1
    return "down"

print(fun(5))

测试结果:

<generator object fun at 0x05604060>

函数和generator执行流程不一样。函数时顺序执行,遇到return语句或者最后一行函数语句就结束,而generator在每次执行next()时,遇到yield语句返回,再次执行时会从上次返回的yield语句处继续执行。

举例:

def odd():
    print("step 1")
    yield 1
    print("step 2")
    yield 3
    print("step 3")
    yield 5

o = odd()
print("###0###")
print(o)
print("###1###")
print(next(o))
print("###2###")
print(next(o))
print("###3###")
print(next(o))
print("###4###")
print(next(o))

测试结果:

###0###
<generator object odd at 0x0530BED0>
###1###
step 1
1
###2###
step 2
3
###3###
step 3
5
###4###
Traceback (most recent call last):
  File "test.py", line 19, in <module>
    print(next(o))
StopIteration

小结:

    生成器对象就是一种特殊的迭代器,满足迭代器协议,可以调用next()内置函数;对生成器for 循环时,调用iter()方法返回了生成器对象,然后再不断next()迭代,而iter()和next()都是在yield内部实现的。

     生成器创建方式:常见两种(列表生成式、函数关键字)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AZHENGUNIX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值