python基础学习中,经常会提到迭代器、生成器、可迭代对象的概念,在日常的项目中,也会有很多的用处,面试中也经常会被问到,根据我所理解的,对这几个概念进行简单的介绍。(平时工作主要用到py3,以py3的用法为主进行介绍)
一、可迭代对象
什么是可迭代对象?简单的说就是能使用for进行循环遍历
也可以说可迭代对象满足以下条件:
1.能进行遍历,实现for循环
2.能通过__iter__() 方法,返回一个迭代器
3.能通过iter()函数,返回一个迭代器
如:列表,字符串,元组,字典就是可迭代对象
如何自定义一个可迭代对象?如果一个对象本身即是一个迭代器对象,又是一个可迭代对象,是没有办法迭代多次,为了解决这个问题,可以分别定义可迭代对象和迭代器对象。
Coding:
class StudentList:
“””自定义一个可迭代对象”””
def __init__(self):
self.items = list()
def append(self,item):
self.items.append(item)
def __iter__(self):
myIterator = MyIterator(self.items)
return myIterator
class MyIterator:
"""自定义一个迭代器"""
def __init__(self,items):
# 记录使用迭代器取值的数据对象
self.items = items
# 记录当前遍历索引的位置
self.current_index = 0
def __iter__(self):
return self
def __next__(self):
if self.current_index < len(self.items):
self.current_index += 1
return self.items[self.current_index -1]
else:
raise StopIteration
a = StudentList()
a.append(1)
a.append(2)
a.append(3)
b = a.__iter__()
while True:
try:
print(b.__next__())
except Exception as e:
break
结果:1 2 3
列表本身可迭代,但是用类创建的对象不可迭代
二、迭代器
什么是迭代器?迭代器就是内部实现了__iter__()方法和__next__()方法
也可以说满足以下条件的就是一个迭代器:
1.可以通过可迭代对象的__iter__() 返回
2.实现 __next__()方法,获取下一个元素
3.没有访问的元素后,__next__()方法将抛出StopIteration异常,终止迭代器
三、for循环的本质
for i in [1,2,3]: ----->内部实现__iter__()方法,获取迭代器, itera = [1,2,3].__iter__() ------> 通过__next__()方法获取下一个元素: itera.__next__() --------> 取出所有元素后自动捕获异常StopIterator,终止迭代
四、next()和__next__()区别
1.py2中只能使用next()函数
py3中next()函数和__next__()方法都可以使用
2. iter()和__iter__()在py2和py3中都可以使用
五、生成器
生成器是一种特殊的迭代器,可以使用__next__()方法,取生成器中下一个值。
生成器可以通过函数和生成器表达式实现
1.生成器表达式:b = ( i for i in range(100)) , b.__next__() 取出元素
2.函数实现:
def fibonacci (num):
a = 0
b = 1
current_index = 0
while current_index < num:
result = a
a,b = b,a+b
current_index += 1
# 遇见yield代码先把值返回,然后代码暂停,只有下一次启动生成器会再次在暂停的位置继续往下执行
yield result
f = fibonacci(6)
while True:
try:
re = next(f)
print(re)
except Exception as e:
break
结果: 0 1 1 2 3 5