1.迭代器
1.什么是迭代器?
1.迭代器是用于迭代数据的
-记录每次访问的数据,以及返回下一个数据
-迭代器通过__next__方法取得下一个指向的值
2.迭代器也称迭代对象,迭代对象指可以通过for .. in ..等语句将数据内容
显示出来的,这样的过程叫迭代,把这个可以提供给我们使用数据的这个对象
称为迭代对象,
2.常用数据类型的可迭代性有那些?
列表,元祖,字典,字符串,set集合等都是可迭代对象
3.通过isinstance()来判断一个对象是否是迭代对象
4.自己创建一个可容纳多个数据内容的对象是否是可迭代对象呢?
事实证明,通过创建可容纳多个数据的对象并不是可迭代对象
原因是在这个对象中没有取得迭代器,参考迭代器的本质
5.可迭代对象的本质
可迭代对象的本质就是提供了一个这样的中间人(迭代器),即迭代器为我们将这些数据遍历出来使用
可迭代对象是通过__iter__()魔法方法取得迭代器
同时通过__next__魔法方法指向下一个值,也就是通过这个方法把所有的数据一个一个读取出来
6.如何自定义一个迭代器
1.在类中添加了__iter__方法即取得迭代器,
2.在通过__next__方法指出所有的数据,
7.__iter__和__next__介绍
1.__iter__:
iter(iterable) -> iterator 传入的是一个可迭代对象,返回的是迭代器
iter(callable, sentinel) -> iterator
内部是从可迭代对象的__iter__方法来获得迭代器的
2.__next__: next(iterator[, default])
Return the next item from the iterator. If default is given and the iterator
is exhausted, it is returned instead of raising StopIteration.
传入一个迭代器,返回的是迭代器指向的下一个数
内部是通过迭代器__next__方法指向下一个数据的
3.for .. in .. 的本质:
for item in iterable 循环的本质就是先通过iter()函数获得一个迭代器
然后对获得迭代器不断不得调用next()方法来取得下一个值,并赋值给item
当遇到Stopiteration的异常后循环结束
8.迭代器的应用场景
1.用于可迭代的对象数据
2.因为迭代器是通过__next__来取得迭代数据的,所以也可以通过这个方法自动生成有规律的数据
而不在使用已有的数据集取数,避免内存资源浪费
9.注意:迭代器本身也是一个可迭代对象
10.参考代码:
#自己创建一个可容纳多个数据内容的对象是否是可迭代对象呢?
# import collections
# class func():
# def __init__(self):
# self.name = []
# def add(self,name):
# self.name.append(name)
#
# #创建对象
# s1 = func()
# s1.add("aaaa")
# s1.add("dddd")
# s1.add("vvvv")
# s1.add("aaaas")
#
# #是否为可迭代对象:False
# print("是否为可迭代对象:%s"%isinstance(s1,collections.Iterable))
#自定义可迭代的类
import collections
class func(object):
def __init__(self):
self.name = []
self.position = 0#这个是记录迭代的位置,默认从第一个开始,初始值为0
#取得迭代器
def __iter__(self):
"""返回一个迭代器"""
return self
def __next__(self):
"""返回迭代器下一个指向的值"""
if self.position < len(self.name):#判断当前的位置是否跟总的长度相等,
item = self.name[self.position]
self.position += 1
return item
else:
raise StopIteration
def add(self,name):
self.name.append(name)
#创建对象
s1 = func()
s1.add("aaaa")
s1.add("dddd")
s1.add("vvvv")
s1.add("aaaas")
#是否为可迭代对象:True
print("是否为可迭代对象:%s"%isinstance(s1,collections.Iterable))
#这时候遍历对象发现报错,原因是在这个类中没有写__next__方法,这个类只是有了迭代器,
# 但并不是很完善
for item in s1:
print(item)
python3 迭代器(自定义迭代器)
最新推荐文章于 2024-09-18 18:11:55 发布