Python的迭代器和生成器使用实例
一、迭代器Iterators 迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法: 1)next方法 2)__iter__方法 迭代器可使用内建的iter方法创建,见例子: 复制代码 代码如下: >>> i = iter('abc') >>> i.next() 'a' >>> i.next() 'b' >>> i.next() 'c' >>> i.next() Traceback (most recent call last): File "<string>",line 1,in <string> StopIteration: class MyIterator(object): 结果: 复制代码 代码如下: 3 2 1 0 二、生成器Generators 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。 此函数保存其执行上下文,如果需要,可立即继续执行。 例如Fibonacci函数: 复制代码 代码如下: 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)] -------------------- 结果: 复制代码 代码如下: 1 1 2 [3,5,8,13,21,34,55,89,144,233] PEP Python Enhancement Proposal Python增强建议 tokenize模块 复制代码 代码如下: >>> import tokenize >>> reader = open('c:/temp/py1.py').next >>> tokens=tokenize.generate_tokens(reader) >>> tokens.next() (1,'class',(1,0),5),'class MyIterator(object):/n') >>> tokens.next() (1,'MyIterator',6),16),'class MyIterator(object):/n') >>> tokens.next() (51,'(',17),'class MyIterator(object):/n') 例子: 复制代码 代码如下: def power(values): for value in values: print 'powering %s' %value yield value def adder(values): for value in values: print 'adding to %s' %value if value%2==0: yield value+3 else: yield value+2 elements = [1,4,7,9,12,19] res = adder(power(elements)) print res.next() print res.next() -------------------- 结果: 复制代码 代码如下: powering 1 adding to 1 3 powering 4 adding to 4 7 保持代码简单,而不是数据。 注意:宁可有大量简单的可迭代函数,也不要一个复杂的一次只计算出一个值的函数。 例子: 复制代码 代码如下: def psychologist(): print 'Please tell me your problems' while True: answer = (yield) if answer is not None: if answer.endswith('?'): print ("Don't ask yourself too much questions") elif 'good' in answer: print "A that's good,go on" elif 'bad' in answer: print "Don't be so negative" free = psychologist() print free.next() print free.send('I feel bad') print free.send("Why I shouldn't ?") print free.send("ok then i should find what is good for me") -------------------- 结果: 复制代码 代码如下: Please tell me your problems None Don't be so negative None Don't ask yourself too much questions None A that's good,go on None (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |