生成器 --使用生成器来创建新的迭代模式

目的:实现一个自定义的迭代模式,使其区别与常见的内建函数(即range()、reversed()等)

解决方案:使用生成器函数,实现一种新的迭代模式
def frange(start, stop, increment):
    x = start
    while x < stop:
        yield x
        x += increment

# 使用for循环对其迭代
for n in frange(0, 1, 0.25):
    print(n)
Outs:
0
0.25
0.5
0.75

# 使用 list()访问
print(list(frange(0, 1, 0.25)))
Outs:
[0, 0.25, 0.5, 0.75]

下面来看下生成器函数的底层机制是如何运转的:

def countdown(n):
    while n>0:
        yield n
        n -= 1
    print('Done!')

c = countdown(3)  # 创建一个生成器
c
Out[9]: <generator object countdown at 0x10d920f68>

next(c)
Out[10]: 3
next(c)
Out[11]: 2
next(c)
Out[12]: 1
next(c)
Done!
Traceback (most recent call last):
StopIteration
关于生成器:

1、函数中只要出现了yield语句就会将其转变成一个生成器。与普通函数不同,生成器只会在响应迭代操作时才运行;
2、生成器函数只会在响应迭代过程中的"next"操作时才会运行;一旦生成器函数返回,迭代也就停止了;
3、生成器是可以迭代的(next()或者for),和迭代器一样迭代结束时,报StopIteration。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 我们在学习web前端的路程起步时总是疑问,我们如何更好的遍历元素呢?迭代器和生成器是什么?今天为大家带上与精彩的E...
    侬姝沁儿阅读 8,688评论 0 6
  • 迭代器和生成器 楔子 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,有几...
    go以恒阅读 4,110评论 1 4
  • 相信大家身边都有一些逗逼,让你哭笑不得,今天,跟大家分享一下,我周围的这群开心果吧。 背景1:和朋友一起去逛华润万...
    豆米啦啦啦阅读 1,697评论 0 2
  • 去年5月我决定运营我的个人公众号了,一年多来经历过起步期,发展期,停滞期,虽然现在不到1玩的粉丝量不算什么大号,但...
    文生白阅读 5,179评论 0 0
  • 子谦,天冷了,冬天的衣服有吗?给自己买件毛衣。 在电话里特意说了两遍,妈妈的声音还是那样轻柔像热热的棉花糖一样,稍...
    不正式青年阅读 1,855评论 0 0

友情链接更多精彩内容