1. Iterator(迭代器)
举例:
我们对list使用for
for i in [1,2,3,4]:
print(i)
1
2
3
4
对string对象使用for
for ch in 'python':
print(ch)
p
y
t
h
o
n
对字典对象使用for
for k in {'x':1,'y':2}:
print(k)
y
x
对文件使用for
for line in open('a.text'):
print(line)
fisrt line
second line
这样的可以用for循环来操作的对象称为可迭代对象
内置函数 iter() 需要一个可迭代的对象作为参数生成一个迭代器:迭代器的作用就是除了具有for循环方法之外,还有函数自带的next()方法 (python3内置函数调是__next__()方式,是属于迭代器的属性)。
>>> x = iter([1,2,3])
>>> x
<list_iterator object at 0x000001EA3A46D6D8>
>>> x.__next__()
1
>>> x.__next__()
2
>>> x.__next__()
3
>>> x.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
也可以用类的定义来定义next()方法来调用
class Iter:
def __init__(self,n):
self.i = 0
self.n = n
def __iter__(self):
return self
def next(self):
if self.i <self.n:
i = self.i
self.i += 1
return i
else:
raise StopIteration()
2.Generator(生成器)
什么是生成器?一句话,生成器本质就是迭器。生成器是连续生成一堆结果的函数(不是单个值),有关键字yield带领
def foo():
print('begin')
for i in range(4):
print('before yield',i)
yield i
print('after yield',i)
print('end')
>>> f = foo()
>>> f.__next__()
begin
before yield 0
0
>>> f.__next__()
after yield 0
before yield 1
1
>>> f.__next__()
after yield 1
before yield 2
2
>>> f.__next__()
after yield 2
end
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
yield 的作用是一个开关一样,你调用next()是,会生成值输出,然后整个函数停在yield所在地,也就是后面的print()不运行。当下次调用yield时,从上一次暂停的地方开始,开始循环,再次到yield处。
3.生成器表达式(生成器版本的列表集合)
本质是列表,但是不返回列表,返回一个列表生成器,也就是一个关着的list。
>>> a = (x*x for x in range(5))
>>> a
<generator object <genexpr> at 0x000001EA3A449660>
>>> sum(a)
30
>>>
4.Itertools 这是标准库里面的模块,包含很多迭代器操作函数
chain(链子)-将两个迭代器加在一起
>>> it1 = iter([1,2,3])
>>> it2 = iter([4,5,6])
>>> itertools.chain(it1,it2)
[1,2,3,4,5,6]
izip -迭代版本的zip
>>> for x,y in itertools.izip(['a','b','c'],[1,2,3]):
... print(x,y)
...
a 1
b 2
c 3