【python】可迭代对象、生成器、迭代器、itertools

一、迭代(iteration)

迭代可以理解为循环访问容器中多个元素的遍历行为。
容器(contaniner)将多个元素组织在一个对象内,可以用in和not in关键字判断元素是否在容器内。
典型的容器有诸如dict、list、set等,利用for..in..循环可以遍历容器内每个元素。

x = [1, 2, 3]
for i in x:
    print i
Python内str也是容器但int类型不是。
s="abc"
for i in s:
    print i
s=123
for i in s: #TypeError: 'int' object is not iterable
    pass

二、迭代器(iterator)和可迭代对象(iterable)

1.迭代器是遍历行为中,一个中间状态的对象。
2.能够返回一个迭代器的对象可称之为可迭代对象。

x = [1, 2, 3]
iter_x = iter(x)
print next(iter_x) #1
print next(iter_x) #2
for i in iter(x):
    print i

迭代器可以利用iter()方法将容器变为迭代器,利用next()方法,逐个返回容器中元素。

三、生成器(generator)

生成器算得上是Python语言中最吸引人的特性之一,生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。

from itertools import islice
def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        prev, curr = curr, curr + prev

f = fib()
print type(f)#
print list(islice(f, 0, 10))#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

上面这个斐波那契函数用到了yield生成器,yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器。
调用这个函数的时候,函数内部的代码并不立马执行,这个函数只是返回一个生成器对象。
使用迭代的时候,函数中的代码才会执行,itertools中islice类似slice方法,可以把切片方法用到迭代器中。
List(iter)方法即是将迭代器变为列表。
四、生成器表达式(generator expression)
生成器表达式针对列表推导式,将其变为一个迭代器。

a = [x * x for x in range(1000000)] #列表推导式
b = (x * x for x in range(1000000)) #生成器表达式

大数据量列表推导式会消耗大量内存,但是利用生成器表达式可以暂时不执行保留这个对象,待真正使用时或利用next()方法进行迭代。

你可能感兴趣的:(【python】可迭代对象、生成器、迭代器、itertools)