一、迭代(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)#<type 'generator'>
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()方法进行迭代。
网友评论