【半月社3】Python基础之迭代和迭代器
迭代是Python最强大的功能之一,是访问集合元素的一种方式。
什么是迭代:
我们通过顺序、分支(if else)、循环(for while)来控制程序的运行,这被称之为控制流
根据冯诺依曼模型,计算机所作的就是: 输入数据——处理数据——输出数据
我们输入一组数据,需要对其中的每一项进行处理,这就引入了重复操作,不管叫什么,
循环、迭代、递归、编历,都只是对这种重复操作的具体实现。
在编程中语言中,通过for语法和工具来实现对数据的重复操作也就是迭代(如果使用while循环,调用的是序列索引)
for i in range(0,10)
print(i)
my_dic = {1:'a',2:'b',3:'c'}
for i in my_dic:
print(i)
首先,我们来看上面的for循环迭代例子,既可以循环有序的列表,也可以循环无序的字典。
显然,在python的for循环中,并没有对每个带循环变量进行下表索引,而是直接对每个变量进行循环迭代。
for循环在底层不使用索引而是使用迭代器,for循环也可以作用于任何可迭代对象,迭代器会驱动可迭代对象进行循环遍历。
如何判断一个对象是否是可迭代对象呢?
在Python中提供了一个collections模块,可以用其中的isinstance()方法
来判断某对象是否是Iterable(可迭代对象)。
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
也可使用此方法判断某对象是否是迭代器
isinstance([], Iterator) # False
isinstance(iter([]), Iterator) # True
isinstance(iter("abc"), Iterator) # True
python中也可以同事引用两个变量进行for循环,比如
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
... print(x, y)
...
1 1
2 4
3 9
经过了上面的介绍,我们知道了python 迭代的基本含义,那么什么是迭代器,什么又是可迭代对象呢?
可迭代对象和迭代器
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
从使用方法来说:
可迭代对象是任何可以用for循环遍历的东西。可迭代对象可以被循环遍历,任何可以被循环遍历的东西都是可迭代对象。
从对象定义来说:
我们可以用内置的dir()函数来查看对象的属性和方法,一个对象是不是可迭代对象和迭代器,由这些属性和方法决定
1)如果一个对象拥有__iter__方法(可迭代协议)或__getitem__(序列协议),其是可迭代对象
2)如果一个对象拥有__iter__和next方法,其是迭代器
也就是说,可迭代对象包含了迭代器,我们先来简单了解一下__iter__方法
当我们调用__iter__()方法时,有两种情况:
1)如果访问的对象是可迭代对象,此方法会返回当前可迭代对象的迭代器实例
2)如果访问的对象是迭代器,此方法会返回self(即此迭代器自身)
举例来说,如果我们定义了如下的可迭代对象和迭代器
#!/usr/bin/env python
# coding=utf-8
class MyList(object): # 定义可迭代对象类
def __init__(self, num):
self.data = num # 上边界
def __iter__(self):
return MyListIterator(self.data) # 返回该可迭代对象的迭代器类的实例
class MyListIterator(object): # 定义迭代器类,其是MyList可迭代对象的迭代器类
def __init__(self, data):
self.data = data # 上边界
self.now = 0 # 当前迭代值,初始为0
def __iter__(self):
return self # 返回该对象的迭代器类的实例;因为自己就是迭代器,所以返回self
def next(self): # 迭代器类必须实现的方法
while self.now < self.data:
self.now += 1
return self.now - 1 # 返回当前迭代值
raise StopIteration # 超出上边界,抛出异常
当我们创建可迭代对象实例或迭代器实例时,调用iter方法时,都会返回迭代器实例。
当我们使用for循环时,会自动创建一个迭代器,我们也可以用iter内置函数创建迭代器
a = {1, 2, 3, 4}
list_iter = iter(a)
next(list_iter)
next(list_iter)
next(list_iter)
next(list_iter)
这里我们用到了迭代器的next()函数,可用next函数来获取它的下一个元素
next()函数会返回迭代的每一步,超出边界后会抛出stopIteration异常
实际上在序列中,for循环是如下面这样利用迭代器驱动工作的(自动调用next方法):
fetch = iter(seq)
while True:
try:
i = fetch.next()
except StopIteration:
break
do_something_to(i)
for循环字典迭代时,迭代器会遍历字典的键(key)
对文件生成的对象迭代时,会自动调用readline()方法。