1.理解迭代器
迭代就是遍历集合元素的一个过程,而迭代器(Iterator)就是可以储存迭代位置的一个对象,它可以使用next()函数从集合的第一个元素开始访问,并不断返回下一个值,直到所有的元素被访问完(引发StopIteration异常)才结束,并且只能往前不会后退。
1)迭代器有两个基本的方法:iter() 和 next()
使用如下:
yan = [11, 22, 33, 44, 55]
yan_iter = iter(li)
print(next(yan_iter))#输出迭代的第一个元素
print(next(yan_iter))#输出迭代的第二个元素
print(next(yan_iter))#输出迭代的第三个元素
print(next(yan_iter))#输出迭代的第四个元素
print(next(yan_iter))#输出迭代的第五个元素
输出结果:
11
22
33
44
55
2)使用isinstance()方法判断一个对象是否为迭代器(Iterator)对象
使用如下:
from collections import Iterator #高版本的python请将collections改成collections.abc
result = isinstance([],Iterator)
print(result)
result = isinstance((),Iterator)
print(result)
result = isinstance((x for x in range(10)),Iterator)
print(result)
结果为:
False
False
True
2.可迭代对象
可直接作用于for …… in…循环的数据类型,如容器类型中的list(列表)、tuple(元组)、dirt(字典)、str(字符串)、set(集合)等统称为可迭代对象(Iterable)。
1)for …… in…循环的本质
先通过iter()函数获取可迭代对象(Iterable)的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给临时变量i,当遇到StopIteration的异常后循环结束。
例如:
data = [1, 2, 3, 4]
for i in data:
print(i) #依次输出1, 2, 3, 4
2)可以使用isinstance()方法可以判断一个对象是否为可迭代对象
使用如下:
from collections import Iterable #高版本的python请将collections改成collections.abc
result = isinstance([],Iterable)
print(result)
result = isinstance((),Iterable)
print(result)
result = isinstance('python',Iterable)
print(result)
result = isinstance(213,Iterable)
print(result)
结果为:
True
True
True
False
3.迭代器和可迭代对象的区别
- 定义可迭代对象,必须实现iter()方法;而定义迭代器,必须实现iter()和next方法;
- 可迭代对象包含迭代器。
- 所有的可迭代对象(Iterable)都可以通过iter()方法转化为迭代器(Iterator)。
4.创建迭代器
当自己创建迭代器时,首先需要创建一个类。类里面必须包含一个iter()函数,这个函数自带能够返回一个带next()方法的对象。
例如:
class MyIterable:
def __iter__(self):
return MyIterator()
class MyIterator:
def __init__(self):
self.num = 0
def __next__(self):
self.num += 1
if self.num >= 10:
raise StopIteration
return self.num
迭代器提供了一个统一的访问集合的接口,定义了iter()方法的对象,就可以使用迭代器访问了。
5.复制迭代器
基本使用语法如下:
copy.deepcopy():x = copy.deepcopy(y)
迭代器当一次迭代完毕后就结束了,在此调用便会引发StopIteration异常。如果想要将迭代器保存起来,可以使用该复制的方法,不可使用赋值的方法,这样是不起作用的。
例如:
from copy import copy
data = [1, 2, 3, 4]
iter1 = iter(data)
iter2 =iter1 #赋值只是创建一个空的迭代器
iter3=copy(iter1) #复制一个一样的
for i in iter1:
print(i) #依次输出1, 2, 3, 4
for i in iter2:
print(i) #无输出,直接赋值不起作用
for i in iter3:
print(i) #依次输出1, 2, 3, 4
6.迭代器的优势
- 迭代器不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。
- 迭代器提供了一个统一的访问集合的接口,定义iter()方法对象,就可以直接使用迭代器访问。
- 迭代器仅仅在访问到某个元素时才使用该元素。在这之前,元素可以不存在,所以迭代器很适用于迭代一些无法预先知道元素总数的巨大的集合;
- 迭代器访问与for循环访问非常相似,但是也有不同之处。对于支持随机访问的数据结构如元组和列表,迭代器并无优势。因为迭代器在访问的时候会丢失数据索引值,但是如果遇到无法随机访问的数据结构如集合时,迭代器是唯一访问元素的方式;
2303

被折叠的 条评论
为什么被折叠?



