资讯专栏INFORMATION COLUMN

Python基础-迭代器和生成器

objc94 / 1325人阅读

摘要:迭代器迭代器用于循环构建和扩展集合类型逐行遍历文本文件列表推导字典推导和集合推导元组拆包调用函数时,使用拆包实参解释器需要迭代对象时,会自动调用内置的函数,有以下功能检查对象是否实现了方法,如果实现了就调用它,获取一个迭代器。

迭代器

迭代器用于:

for 循环

构建和扩展集合类型

逐行遍历文本文件

列表推导、 字典推导和集合推导

元组拆包

调用函数时, 使用 * 拆包实参

解释器需要迭代对象x时,会自动调用iter(x);

内置的iter函数,有以下功能:

检查对象是否实现了 _iter _ 方法, 如果实现了就调用它,获取一个迭代器。

如果没有实现 _iter _ 方法,但是实现了 _getitem _ 方法,Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素。

如果尝试失败,Python抛出TypeError异常,通常会提示"C objectis not iterable"(C 对象不可迭代),其中C是目标对象所属的类。

__next__ #返回下一个可用的元素,如果没有元素了,抛出StopIteration异常
__iter__ #返回self, 以便在应该使用可迭代对象的地方使用迭代器,例如在for循环中
import re

RE_WORD = re.compile("w+")

class Sentence:
    # 可迭代的对象
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)

    def __iter__(self): # 1
        return SentenceIterator(self.words)

class SentenceIterator:
    # 迭代器
    def __init__(self, words):
        self.words = words
        self.index = 0

    def __next__(self): # 2
        try:
            word = self.words[self.index]
        except IndexError:
            raise StopIteration()
        self.index += 1
        return word

    def __iter__(self): # 3
        return self

s = Sentence(""The time has come," the Walrus said,")

for word in s:
    print(word)

--------------------
The
time
has
come
the
Walrus
said

{#}1: 实现__iter__方法,并返回了一个迭代器实例SentenceIterator,所以是可迭代的对象;

{#}23: 实现__next__和__iter__,并返回了迭代器本身;

{#}123:说明:迭代器可以迭代,但是可迭代的对象不是迭代器;

生成器 生成器函数

只要Python函数的定义体中有yield关键字,那么事实上定义的是一个generator function,调用这个generator function返回值是一个generator。

def gen_AB():
    print("start")
    yield "A"
    print("continue")
    yield "B"
    print("end.")

print(gen_AB()) # 1

gen_AB() # 2

for item in gen_AB(): # 3
    print("--->", item)
----------------



start
---> A
continue
---> B
end.

{#}1:虽然函数gen_AB没有return,但是依然返回了生成器对象;

{#}2:此时没有执行函数gen_AB的内容;

{#}3:生成器一定是迭代器(反之不成立);

{#}3: 当调用generator的next方法,generator会执行到yield表达式处,返回yield表达式的内容,然后暂停(挂起)在这个地方,等待下个next的执行;

生成器表达式(generator expression)

生成器表达式可以理解为列表推导的惰性版本: 不会迫切地构建列表,

而是返回一个生成器, 按需惰性生成元素。

def gen_AB():
    print("start")
    yield "A"
    print("continue")
    yield "B"
    print("end.")
    
res1 = [x*3 for x in gen_AB()] # 1
for i in res1:
    print("-->", i) # 2

res2 = (x*3 for x in gen_AB()) # 3
for i in res2:
    print("--->", i)
----------------

start
continue
end.
--> AAA
--> BBB

start
---> AAA
continue
---> BBB
end.

{#}1:列表推导迫切迭代函数gen_AB,打印出start continue end. res1=[AAA,BBB];

{#}2: 输出AAA,BBB;

{#}3:把生成器表达式返回的值赋值给res2。只需调用gen_AB()函数,虽然调用时会返回一个生成器,但是这里并不使用;

参考

流畅的Python.

https://www.cnblogs.com/MnCu8...

http://www.cnblogs.com/xybaby...

http://python.jobbole.com/87805/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41585.html

相关文章

  • Python中的可迭代的对象、迭代器和成器

    摘要:本文重点掌握可迭代的对象的定义掌握可迭代对象迭代器与生成器之间的关系和异同熟悉标准库中生成器。二迭代器迭代器介绍迭代器用于从集合中取出元素的对象。若想再次迭代须重建迭代器。迭代器检查方式调用,。区别可迭代的对象不是迭代器。 导语:本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、掌握可迭代的对象的...

    starsfun 评论0 收藏0
  • python奇遇记:迭代器和成器

    摘要:来说说迭代器和生成器,还有可迭代对象和生成器表达式。有点绕是不是,其实,一般只要知道可迭代对象以及它是如何实现的就行了,中常常用生成器来代替迭代器,可以说,生成器就是迭代器。 来说说迭代器和生成器,还有可迭代对象和生成器表达式。 之前简单的提到过,一个对象是可迭代的可以理解为能够使用for循环。这样说其实不太准确,某个对象可迭代是因为它内部实现了$__iter__$这个特殊方法。比如在...

    atinosun 评论0 收藏0
  • 流畅的python读书笔记-第十四章-可迭代的对象、迭代器和成器

    摘要:可迭代的对象迭代器和生成器理念迭代是数据处理的基石。可迭代的对象与迭代器的对比从可迭代的对象中获取迭代器标准的迭代器接口有两个方法。此外,也没有办法还原迭代器。最终,函数的定义体返回时,外层的生成器对象会抛出异常这一点与迭代器协议一致。 可迭代的对象、迭代器和生成器 理念 迭代是数据处理的基石。扫描内存中放不下的数据集时,我们要找到一种惰性获取数据项的方式,即按需一次获取一个数据项。这...

    kohoh_ 评论0 收藏0
  • Python入门学习笔记汇总

    摘要:导语本文章汇总了本人在学习基础之绪论篇数据结构篇函数篇面向对象篇控制流程篇和元编程篇学习笔记的链接,打算入门的朋友们可以按需查看并交流。 导语:本文章汇总了本人在学习Python基础之绪论篇、数据结构篇、函数篇、面向对象篇、控制流程篇和元编程篇学习笔记的链接,打算入门Python的朋友们可以按需查看并交流。 第一部分:绪论篇 1、Python数据模型 第二部分:数据结构篇 2、序列构成...

    U2FsdGVkX1x 评论0 收藏0
  • pythonmemory_profiler库制作器和迭代器cpu占用的时间分析

      文章内容主要是详细介绍了pythonmemory_profiler库制作器和迭代器cpu占用的时间分析,文章内容紧扣主题进行详尽的基本介绍,感兴趣的朋友可以了解一下  不进行计算时,生成器和list空间占用  importtime   frommemory_profilerimportprofile   profile(precision=4)   deflist_fun():   start...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<