Python自动化开发从浅入深-语言基础(迭代器和生成器)

  • 迭代器的含义是:当对一个序列数进行循环时,你必须从头到尾循环完毕才能退出程序,而迭代器可以在循环中每次读取一个值,然后跳出循环做其他的事情,再跳进去接着刚刚循环的断点继续向下执行。即迭代器通过__next__方法依次从循环中逐个读取元素,一直向前next读取,直到序列值读取完毕,直到出现读取异常,迭代器是不能后退的。
  • 迭代器的一个优点就是它不要求你事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。这个特点被称为延迟计算或惰性求值(Lazy evaluation)。
  • 而生成器则是一个迭代器执行的方法(函数功能)。

    生成器是一个包含了特殊关键字yield的函数。当被调用的时候,生成器函数返回一个生成器。可以使用send,throw,close方法让生成器和外界交互。

    生成器也是迭代器,但是它不仅仅是迭代器,拥有next方法并且行为和迭代器完全相同。所以生成器也可以用于python的循环中,

    --- __next__方法: 返回容器的下一个元素
    --- __iter__方法:返回迭代器自身

迭代器可使用内建的iter方法创建

下例,利用列表进行迭代:

lst = [1,2,3,4,5,6,7,8]
it = iter(lst)
try:
while True:
val = it.__next__()
print (val)
except StopIteration:
pass
结果:

1
2
3
4
5
6
7
8

常用的几个内建数据结构tuple、list、set、dict都支持迭代器,字符串也可以使用迭代操作。

 

下式为生成器表达式,它返回迭代器。外部的括号可在用于参数时省略。
(x+1 for x in lst) 
下面的列表解析后返回的是list 
[x+1 for x in lst] 


lst = [1,2,3,4,5,6,7,8]
y = (x+1 for x in lst)
print(y.__next__(),':',y.__next__(),':',y.__next__(),':',y.__next__(),':',y.__next__(),':',y.__next__(),y.__next__())

z = [x+1 for x in lst]
print(z)

结果

 2 : 3 : 4 : 5 : 6 : 7
[2, 3, 4, 5, 6, 7, 8, 9]

-----------------------------------------

#!/usr/bin/python
# -*- coding: utf-8 -*-

 

def simple_generator():
    yield 1

print simple_generator

def repeater(value):
    while True:
        new  = (yield value)
        if new is not None: value = new


r = repeater(42)
print r.next()

print r.send('hello,world!')

 

运行:

<function simple_generator at 0x10c76f6e0>
42
hello,world!

-----------------------------------------

#!/usr/bin/python
# -*- coding: utf-8 -*-

 

def flatten(nested):
    for sublist in nested:
        for element in sublist:
            yield element

nested = [[1,2],[3,4],[5,6]]

for num in flatten(nested):
    print (num)

结果为1,2,3,4,5,6

------------------------------------------

递归生成器:

#!/usr/bin/python
# -*- coding: utf-8 -*-

 

def flatten(nested):
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield  element
    except TypeError:
        yield nested

for num in flatten([[1,2,3],2,4,[5,[6],7]]):
    print (num)

结果为:1 2 3 2 4 5 6 7

 
posted @ 2016-02-12 21:26  赵洪  阅读(163)  评论(0编辑  收藏  举报