Python编程中实现迭代器的一些技巧小结
yield实现迭代器 >>> def test_yield(): ... yield 1 ... yield 2 ... yield (1,2) ... >>> a = test_yield() >>> a.next() 1 >>> a.next() 2 >>> a.next() (1,2) >>> a.next() Traceback (most recent call last): File "<stdin>",line 1,in ? StopIteration 光听描述就觉得和迭代器的工作方式很一致是吧,的确,yield能把它所在的函索变成一个迭代器,拿最经典的菲波那切数列的例子聊简述一下工作的方式: def fab(max): n,a,b = 0,1 while n < max: print b,"is generated" yield b a,b = b,a + b n = n + 1 >>> for item in fab(5): ... print item ... 1 is generated 1 1 is generated 1 2 is generated 2 3 is generated 3 5 is generated 5 我们有回想一下for关键字的语法糖,在这里遍历5以内的菲波那切数列值的时候,很显然fab(5)生成了一个可迭代的对象,遍历开始的时候它的iter方法被调用返回一个实际工作的迭代器对象,然后每一次调用它的next方法返回一个菲波那切数列值然后打印出来。 >>> temp_gen = fab(5) >>> dir(temp_gen) ['__class__','__delattr__','__doc__','__format__','__getattribute__','__hash__','__init__','__iter__','__name__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','close','gi_code','gi_frame','gi_running','next','send','throw'] 正如上面的描述,单纯调用fab并不会让函数立刻开始返回任何值,并且从打印出的fab(5)的属性列表能够看到,生成器函数返回的对象包含有__iter__,next的实现。与我们手动实现相比,使用yield很方便的就能够实现我们想要的功能,代码量缩减不少。 Generator Expression >>> temp_gen = (x for x in range(5)) >>> temp_gen <generator object <genexpr> at 0x7192d8> >>> for item in temp_gen: ... print item ... 0 1 2 3 4 >>> dir(temp_gen) ['__class__','throw'] 看过上面对yield的描述,这个例子以及对应的输出日志还是相当直接明了的,无论是temp_gen的打印日志描述,for语句遍历的输出结果还是调用dir输出的属性列表,都赤裸裸的表明生成器表达式确实生成了能够支持迭代的对象。另外表达式里面也能够调用函数,增加适量的过滤条件。 内置库itertools 和 iter >>> iter('abc') <iterator object at 0x718590> >>> str_iterator = iter('abc') >>> next(str_iterator) 'a' >>> next(str_iterator) 'b' >>> lst_gen = iter([1,2,3,4]) >>> lst_gen <listiterator object at 0x728e30> >>> dir(lst_gen) ['__class__','__length_hint__','next'] >>> help(iter) Help on built-in function iter in module builtins: iter(...) iter(iterable) -> iterator iter(callable,sentinel) -> iterator Get an iterator from an object. In the first form,the argument must supply its own iterator,or be a sequence. In the second form,the callable is called until it returns the sentinel. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |