一、可迭代对象
迭代是访问集合元素的一种方式,一个数据类型是否可以迭代,即这个数据类型是否可以被遍历,一个可迭代的数据类型被称为可迭代对象。
在Python中可以使用 isinstance()函数和Iterable模块查看当前变量的数据类型是否是可迭代的对象:
>>>from collections import Iterable
>>>nums = [1, 2, 3, 4]
>>>isinstance(nums, Iterable)
True # 返回True,说明列表是可迭代的
>>>num = 100
>>>isinstance(num, Iterable)
False # 返回False,说明整型是不可迭代的
可迭代对象有:字符串、列表、元组、字典、集合
二、迭代器
可以被__next__()方法调用获取下一个值的对象称为迭代器,减少了内存空间,存储了生成数据的方法,迭代器只能往前不会后退。在Python中可以通过isinstance()函数和Iterator模块判断一个对象是否是迭代器,使用iter()函数可以将一个可迭代对象变成一个迭代器
>>>from collection import Iterator
>>>li = [1, 2, 3, 4]
>>>isinstance(li, Iterable)
True # 列表li是可迭代对象
>>>isinstance(li, Iterator)
False # 列表li不是迭代器
>>>li_iter = iter(li)
>>>isinstance(li_iter, Iterator)
True # 使用iter()函数将列表li变为了迭代器
三、实现一个迭代器
要点:定义一个类,在类中实现__iter__()方法和__next__()方法
class Person(object):
"""定义一个人物类"""
def __init__(self):
self.name = []
self.index = 0 # 初始化索引
def add(self, name):
self.name.append(name)
def __iter__(self):
"""只要类中实现了此方法,创建的对象就是可迭代的"""
return self # 返回迭代器对象
def __next__(self):
if self.index < len(self.name): # 解决列表越界的问题
result = self.name[self.index]
self.index += 1
return result
else: # 抛出异常,标识迭代的完成
raise StopIteration
# 创建对象,调用add()方法
p = Person()
p.add('张三')
p.add('李四')
p.add('王五')
# 遍历这个对象
for value in p:
print(value)
输出结果:
四、通过range()和xrange()理解迭代器的实现
迭代器中存储的不是产生的数据结果,而是产生数据的方法
在Python2中,使用range()函数,会直接生成一个列表,存储列表的元素,如果元素数量非常大的话,只有列表数据生成保存完毕,再能继续执行下面的程序,效率很低,所有Python2提供了 xrange()函数,它返回的是迭代器对象,里边存储了生成列表元素的方法,只有去调用这个迭代器对象时,它才会根据需求,生成指定的数据。
Python3中对此做了修改,取消了xrange()函数,并把range()函数的功能修改成了返回迭代器对象
五、使用迭代器实现斐波那契数列
class Febonacci(object):
"""使用迭代器实现斐波那契数列"""
def __init__(self, num):
"""初始化"""
self.num = num # 生成数据的个数
self.a = 0
self.b = 1
self.index = 0
def __iter__(self):
"""返回迭代器对象"""
return self
def __next__(self):
"""生成数据的方法"""
if self.index < self.num:
result = self.a
self.a, self.b = self.b, self.a + self.b
self.index += 1
return result
else:
raise StopIteration
# 创建对象
fibo = Febonacci(10)
# 读取数据
for num in fibo:
print(num, end=' ')
输出结果:
不止for可以接收可迭代对象,list, tuple, map等都可以
lis = list(Febonacci(10))
print(lis)
tup = tuple(Febonacci(10))
print(tup)
m = map(str, Febonacci(10))
print(m)
输出结果: