Python的迭代器和生成器

程序员通勤双肩包,下单送全年 CSDN 会员 防泼水面料电脑包,保护笔记本电脑,背负轻便,下单再赠 Coding Plan,看技术干货、查文档、下载源码,一站式搞定学习需求 阅读详情

Python的迭代器和生成器


先说迭代器,对于string、list、dict、tuple等这类容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数,iter()是python的内置函数。iter()会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内元素,next()也是python的内置函数。在没有后续元素时,next()会抛出一个StopIteration异常,通知for语句循环结束。比如:

>>> s = 'abc'
>>> it = iter(s)
>>> it
<str_iterator object at 0x7f71fefe9d68>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration


上面说的都是python自带的容器对象,它们都实现了相应的迭代器方法,那如果是自定义类需要遍历怎么办?方法很简单,对这个类AClass,实现一个__iter__(self)方法,使其返回一个带有__next__(self)方法的对象就可以了。如果你在AClass刚好也定义了__next__(self)方法(一般使用迭代器都会定义),那在__iter__里只要返回self就可以。废话少说,先上代码:

class Fib(object):
  def __init__(self, max):
    super(Fib, self).__init__()
    self.max = max

  def __iter__(self):
    self.a = 0
    self.b = 1
    return self

  def __next__(self):
    fib = self.a
    if fib > self.max:
      raise StopIteration
    self.a, self.b = self.b, self.a + self.b
    return fib

def main():
  fib = Fib(100)
  for i in fib:
    print(i)

if __name__ == '__main__':
  main()


简单讲下代码会干什么,定义了一个Fib类,用于生成fibonacci序列。用for遍历时会逐个打印生成的fibonacci数,max是生成的fibonacci序列中数字大小的上限。

在类的实现中,定义了一个__iter__(self)方法,这个方法是在遍历时被iter()调用,返回一个迭代器。因为在遍历的时候,是直接调用的python内置函数iter(),由iter()通过调用__iter__(self)获得对象的迭代器。有了迭代器,就可以逐个遍历元素了。而逐个遍历的时候,也是使用内置的next()函数通过调用对象的__next__(self)方法对迭代器对象进行遍历。所以要实现__iter__(self)和__next__(self)。而且因为实现了__next__(self),所以在实现__iter__(self)的时候,直接返回self就可以。

为了更好理解,我再简单重复下上面说的那一段:在循环遍历自定义容器对象时,会使用python内置函数iter()调用遍历对象的__iter__(self)获得一个迭代器,之后再循环对这个迭代器使用next()调用迭代器对象的__next__(self)。__iter__只会被调用一次,而__next__会被调用 n 次。

下面说生成器。

生成器(Generator)是创建迭代器的简单而强大的工具。它们写起来就像是正规的函数,只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)。以下示例演示了生成器可以很简单的创建出来:

>>> def reverse(data):
...   for index in range(len(data)-1, -1, -1):
...     yield data[index]
... 
>>> for char in reverse('hello'):
...   print(char)
... 
o
l
l
e
h


关于迭代器和生成器的区别,生成器能做到迭代器能做的所有事,而且因为自动创建了__iter__()和 next()方法,生成器显得特别简洁,而且生成器也是高效的。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常。一个带有yield的函数就是一个 生成器,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用next()(在 for 循环中会自动调用next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个yield语句就会中断,并返回一个迭代值,下次执行时从yield的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被yield中断了数次,每次中断都会通过yield返回当前的迭代值(yield暂停一个函数,next()从其暂停处恢复其运行)。

另外对于生成器,python还提供了一个生成器表达式:类似与一个yield值的匿名函数。表达式本身看起来像列表推到, 但不是用方括号而是用圆括号包围起来:
参考来源: 
Python的迭代器和生成器
http://www.aichengxu.com/view/63145


>>> unique_characters = {'E', 'D', 'M', 'O', 'N', 'S', 'R', 'Y'}
>>> gen = (ord(c) for c in unique_characters)
>>> gen
<generator object <genexpr> at 0x7f2be4668678>
>>> for i in gen:
...   print(i)
... 
69
79
83
77
82
78
89
68
>>>


如果需要,可以将生成器表达式传给tuple、list或是set来迭代所有的值并且返回元组、列表或是集合。在这种情况下,不需要一对额外的括号 ―――― 直接将生成器表达式 ord(c) for c in unique_characters传给tuple()等函数就可以了, Python 会推断出它是一个生成器表达式。

最后,为什么要使用生成器?因为效率。使用生成器表达式取代列表解析可以同时节省 cpu 和 内存(ram)。如果你构造一个列表的目的仅仅是传递给别的函数,(比如 传递给tuple()或者set()), 那就用生成器表达式替代吧!

Python学习教程:http://www.aichengxu.com/item/15


python迭代器生成器 帮助大家深入了解迭代器生成器 阅读详情

相关推荐

Python迭代器生成器

方法_iter_返回一个迭代器,它是包含方法_next_的对象,而调用这个方法可以不提供任何参数。推荐在迭代器中也实现方法__iter__(并像刚才那样使它返回self),这样迭代器就可以直接用于for循环。在可以使用序列的情况下,大多数也可使用迭代器或可迭代对象,可以使用构造函数list显示地将迭代器转化为列表。迭代器实现了方法__iter__,这个方法返回迭代器本身,大多数情况下,都在。对象中实现返回迭代器的方法__iter__,并在for循环中使用这个对象。实现了方法__iter__的对象是。....

m0_73076093的博客 6982

python生成器迭代器

迭代器用于从集合中取出元素,生成器用于凭空生成元素;iter()方法可以获取一个迭代器(_iter__或如果实现了__iter__方法,对象就是可迭代的;使用iter(a)可判断a是否可迭代,不可迭代会报错(或isinstance(a, abc.iterable) (from collections import abc));可迭代对象与迭代器关系:Python从可迭代的对象中获取迭代器

weixin_46287157的博客 1651

python总结-生成器迭代器

Python中,一边循环一边计算的机制,称为生成器:generator什么是生成器生成器仅仅保存了一套生成数值的算法,并且没有让这个算法现在就开始执行,而是我什么时候调它,它什么时候开始计算一个新的值,并给你返回。

lw的博客 1487

Python学习之-迭代器生成器

Python中,迭代器(Iterator)生成器(Generator)是实现迭代协议的对象,用于遍历集合中的元素。它们之间有联系,但也有一些关键的差异。迭代器生成器都允许你对一系列数据进行迭代,但生成器提供了一种更简便,内存高效的方式来实现迭代器的功能。当你需要一个简单的迭代器并且不想实现类时,生成器是一个非常好的选择。适用场合包括处理大数据流、文件处理、网络通信等等。

Summer的博客 3392

python生成器迭代器详解

文章目录前言一、迭代器--从一个简单例子入手1.1 实现__iter__成为迭代对象1.2 通过实现__next__方法成为迭代器二、生成器 -- 更加简单的迭代器2.1来个简单例子2.2 生成器函数yeild2.3 生成器推导式参考文献 前言 python迭代器生成器比较抽象,尽量做到通俗易懂。 一、迭代器–从一个简单例子入手 首先,创建一个基础类Dogs,并实例化一个对象,该类希望输出我家有多少条狗。此处我相信大家都能理解。 # 首先创建一个类,实例化一个普通的对象。 class Dogs(obje

wulele2的博客 4231

Python生成器迭代器的区别

Python生成器迭代器的区别:

IT晓可程序员之路 4万+

python生成器迭代器区别

一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器生成器里面保存的是算法,只有需要用到才会计算后面的值 1.2 通过列表生成式创建生成器 我们可以将列表生成式的中括号改成小括号就创建了一个生成器 list = [i for i in range(10)] print(type(list)) # <class 'list'> ...

李俊的博客 3768

Python 迭代器生成器

Python 迭代器生成器

tangsiqi130的博客 1265

python生成器迭代器

                                     Python3迭代器生成器  很多朋友在初次接触 python迭代器 生成器 时,总是不理解 生成器 迭代器的作用 它们之间的关系,今天笔者来详细的讲解一下。 知识点目录: 一、迭代器 1.什么是迭代器 2.举例说明 3.StopIteration 异常的作用 4.举例说明 StopItera...

S1433972007LJ的博客 1650

Python 生成器迭代器详解

迭代器python中列表(list)、元组(tuple)、字典(dict)、集合(set)这些数据容器都有一个共同的特性,它们都支持使用for循环遍历容器中存储的元素,都是可迭代的也成为迭代器。 迭代时访问集合元素的一种非常强大的方式。迭代器可以记住遍历位置,不会对例如列表这样的数据容器一次性全部生成,而是等到用的时候才会去生成。我们也可以创建一个可迭代的对象:只要此对象含有__iter__方法,那么它就是一个可迭代的对象 如果要自定义实现一个迭代器,则类中必须实现以下两个方法: __next(sel

weixin_47906106的博客 2873

Python迭代器生成器

用自己的理解来解释一下迭代器生成器。在 Python 中,迭代器(Iterator)生成器(Generator)均用于遍历集合中的元素。二者皆为实现迭代协议的对象。暂无一、二、

weixin_45272371的博客 1241

Python进阶————迭代器生成器

Python中的迭代器生成器的区别与联系

记录学习笔记 2167

python迭代器生成器、装饰器

生成器是创建迭代器的一种更简单、更优雅的方式。不需要去写一个完整的类并实现__iter__()__next__()方法。只需要写一个普通的函数,但是使用 yield关键字而不是return来返回值。

weixin_44929150的博客 1396

python迭代器生成器

python中的迭代器生成器 迭代器迭代器就像for循环遍历,但唯一不一样的地方我们进一步探索 首先用for循环遍历一个列表如下: a=[1,2,3,4,5,6] for i in a: print(i) 其结果: 我们在用迭代器进行遍历一个列表如下: a=[1,2,3,4,5,6] b=iter(a) print(next(b)) print(next(b)) # print(n...

asnowdream的博客 1458

Python 迭代器生成器的妙用

本文将探讨python迭代器生成器在实际场景中的一些巧妙用法。掌握迭代器生成器的使用,能够让开发者在解决实际问题时更加得心应手。

GLB_0627的博客 1285

python迭代器生成器实际用途_python迭代器生成器

python迭代器生成器一、迭代器1、什么是迭代器迭代器之前有个相关的名词需要介绍: 可迭代对象:只要定义了iter()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器。在Python中,for循环可以用于Python中的任何类型,包括列表、元祖等等,实际上,for循环可用于任何“可迭代对象”,这其实就是迭代器迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有n...

weixin_35773740的博客 1538
上一篇: 研究下JavaScript中的Rest参数和参数默认值
下一篇: JS实现转动随机数抽奖的特效代码
hello_katty
博客等级 码龄12年 309粉丝 121原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值