Python的迭代器和生成器哪個(gè)好 Python的迭代器和生成器怎么樣
Python是一款不錯(cuò)的軟件,很多朋友都想知道Python的迭代器和生成器哪個(gè)好,一起來看看吧。
Python的迭代器和生成器哪個(gè)好
使用迭代器的優(yōu)點(diǎn)
對(duì)于原生支持隨機(jī)訪問的數(shù)據(jù)結(jié)構(gòu)(如tuple、list),迭代器和經(jīng)典for循環(huán)的索引訪問相比并無優(yōu)勢(shì),反而丟失了索引值(可以使用內(nèi)建函數(shù)enumerate()找回這個(gè)索引值)。但對(duì)于無法隨機(jī)訪問的數(shù)據(jù)結(jié)構(gòu)(比如set)而言,迭代器是唯一的訪問元素的方式。
另外,迭代器的一大優(yōu)點(diǎn)是不要求事先準(zhǔn)備好整個(gè)迭代過程中所有的元素。迭代器僅僅在迭代到某個(gè)元素時(shí)才計(jì)算該元素,而在這之前或之后,元素可以不存在或者被銷毀。這個(gè)特點(diǎn)使得它特別適合用于遍歷一些巨大的或是無限的集合,比如幾個(gè)G的文件,或是斐波那契數(shù)列等等。
迭代器更大的功勞是提供了一個(gè)統(tǒng)一的訪問集合的接口,只要定義了__iter__()方法對(duì)象,就可以使用迭代器訪問。
迭代器有兩個(gè)基本的方法
next方法:返回迭代器的下一個(gè)元素
__iter__方法:返回迭代器對(duì)象本身
一、迭代器Iterators
迭代器僅是一容器對(duì)象,它實(shí)現(xiàn)了迭代器協(xié)議。它有兩個(gè)基本方法:
1)next方法
返回容器的下一個(gè)元素
2)__iter__方法
返回迭代器自身
迭代器可使用內(nèi)建的iter方法創(chuàng)建,見例子:
>>> i = iter('abc')
>>> i.next()
'a'
>>> i.next()
'b'
>>> i.next()
'c'
>>> i.next()
Traceback (most recent call last):
File "", line 1, in
StopIteration:
class MyIterator(object):
def __init__(self, step):
self.step = step
def next(self):
"""Returns the next element."""
if self.step==0:
raise StopIteration
self.step-=1
return self.step
def __iter__(self):
"""Returns the iterator itself."""
return self
for el in MyIterator(4):
print el
結(jié)果:
3
2
1
0
二、生成器Generators
從Python2.2起,生成器提供了一種簡(jiǎn)潔的方式幫助返回列表元素的函數(shù)來完成簡(jiǎn)單和有效的代碼。
它基于yield指令,允許停止函數(shù)并立即返回結(jié)果。
此函數(shù)保存其執(zhí)行上下文,如果需要,可立即繼續(xù)執(zhí)行。
例如Fibonacci函數(shù):
def fibonacci():
a,b=0,1
while True:
yield b
a,b = b, a+b
fib=fibonacci()
print fib.next()
print fib.next()
print fib.next()
print [fib.next() for i in range(10)]
結(jié)果:
1
1
2
[3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
PEP Python Enhancement Proposal Python增強(qiáng)建議
tokenize模塊
>>> import tokenize
>>> reader = open('c:/temp/py1.py').next
>>> tokens=tokenize.generate_tokens(reader)
>>> tokens.next()
(1, 'class', (1, 0), (1, 5), 'class MyIterator(object):/n')
>>> tokens.next()
(1, 'MyIterator', (1, 6), (1, 16), 'class MyIterator(object):/n')
>>> tokens.next()
(51, '(', (1, 16), (1, 17), 'class MyIterator(object):/n')
關(guān)鍵詞: Python