概述
在了解迭代器之前,我们需要明确一个概念--可迭代对象。什么是可迭代对象,在Python中能够使用for...in...来进行遍历的对象都可以称为可迭代对象。
一、可迭代对象与不可迭代对象
如何判断一个对象是否是可迭代对象(即能否用for...in...循环来遍历),可以通过
isinstance(obj, Iterable)方法进行判断
# 判断一个对象是否是可迭代对象:
# 导入Iterable
from collections.abc import Iterable
# 判断一个字典是否是可迭代对象
d = {"name": "hhh", "age": "122"}
print(isinstance(d, Iterable))
>> True
常见的可迭代对象有:列表、元组、字符串、字典
常见的不可迭代对象有:整数、浮点数
二、迭代器
了解了可迭代对象,那么什么是迭代器呢?二者之间又有什么关系呢?
迭代器是一种特别的对象,它可以记住遍历对象的位置,它的特点是从集合的第一个元素开始访问,直到所有元素访问完结束。
不同于可迭代对象,迭代器对象不仅可以通过for...in...循环来遍历,还能通过next()来获取下一个元素。同时,可迭代对象可以通过Iter()方法将自己转变为迭代器对象,也就是说迭代器一定是可迭代对象,可迭代对象不一定是迭代器。
若是直接对可迭代对象使用next()遍历会有什么结果呢?如下:
test_l = [1, 2, 5]
print(next(test_l))
那么对于迭代器对象呢?使用for循环与next()都获取元素,不同的是next()方法一次只能获取一个,若是取完后再取,则此时会抛出StopIteration异常。
test_l = [1, 2, 3, 4]
# 获取可迭代对象的迭代器对象
Iter = iter(test_l)
# 使用for循环来遍历迭代器对象
for i in Iter:
print(i)
>> 1
>> 2
>> 3
>> 4
# 使用next()方法来遍历
print(next(Iter))
>> 1
三、迭代器对象的本质及自定义迭代器
实现迭代器的关键是__iter__()和__next__()方法,如果一个类中实现了__iter__方法,则该类创建出来的对象就是可迭代对象;如果一个类中同时实现了__iter__()和__next__()方法,那么该类创建出来的对象就是迭代器对象。
当对一个可迭代对象调用iter()函数时,它会自动调用这个可迭代对象的__iter__()方法,这个方法返回的对象当做迭代器 当对一个迭代器对象调用next()函数时,它会自动调用这个迭代器对象的__next__()方法,这个方法返回想要的下一个数据
知道了迭代器对象的本质,我们就可以自定义一个类来生成迭代器对象:
# 自定义类实现迭代器
class SelfListIterable:
def __init__(self):
self.ls = []
self.current = 0
def add(self, ele):
self.ls.append(ele)
def __iter__(self):
# __iter__方法的作用:标记当前类创建出来的对象是可迭代对象;返回指定的迭代器
# myiterator = SelfIeterator(self) # 迭代器
return self
def __next__(self):
# __next__方法作用:标记当前类创建出来的对象是迭代器(前提是必须先有__iter__方法)
# 当调用next()函数时这个方法会被自动调用,它返回一个数据
# print(self.current, len(self.ls))
if self.current < len(self.ls):
ele = self.ls[self.current]
self.current += 1
return ele
else:
raise StopIteration
# 实例化一个对象
mylist = SelfListIterable()
mylist.add(23)
mylist.add(45)
print("mylist是否是可迭代对象: %s"%(isinstance(mylist, Iterable)))
>>mylist是否是可迭代对象: True
print("mylist是否是迭代器: %s"%(isinstance(mylist, Itertor)))
>>mylist是否是迭代器对象: True
最后
以上就是等待便当为你收集整理的Python 迭代器的全部内容,希望文章能够帮你解决Python 迭代器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复