网上很多关于iter()python的讲解不够完整,致使iter的很多用法不能完全理解,这里,作为一个入门的小白,尽可能的把我理解的iter的用法说一下
无论怎么样,我认为学习一些函数也好,语言也好,必须要学着找资料.官方资料虽然往往晦涩繁琐不好理解缺乏例题,但官方资料往往又是概括性最高和最完整的.
iter
iter(object[, sentinel])
iter函数的目的是返回一个迭代器.此函数第二个参数的有无会对第一个参数的用法产生很大的影响.如果没有第二个参数,也就是我们最常见的形式,如果没有第二个参数,object必须是支持迭代协议(__iter __()方法)的集合对象,或者它必须支持序列协议(__getitem __()方法,其整数参数从0开始)如果它不支持上述的任何一个,则将引起 TypeError 的错误. 如果给出了第二个参数sentinel,那么此对象必须为可调. 在这种情况下创建的迭代器将在每次迭代时调用__next __ ().如果返回值等于 sentinel,则StopIteration(中断迭代)的请求将被响应.
例子 1-4为含一个参数,例子5为两个参数
例子1:
a = [1,2,3,4,5,6]
a = iter(a)
for i in range(6):
print(next(a))
output:
1
2
3
4
5
6
可见iter把a变成了一个迭代器,而当迭代次数超过本身长度时(比如 for i in range(7)),则会抛出StopIteration
例子2:
class A():
def __init__(self):
self.a = [1,2,3,4]
# def __getitem__(self, item):
# return self.a[item]
def __iter__(self):
# return self.a
self.n = 0
return self
def __next__(self):
if self.n < len(self.a):
a = self.a[self.n]
self.n +=1
return a
else:
raise StopIteration
a = A()
a = iter(a)
# print(next(a))
# print(next(a))
for i in a:
print(i)
output:
1
2
3
4
可见不但列表可以作为iter的输入, class 也可以作为iter的输入,只需要class满足符合要求的 __ iter __ () 或者__ getitem__().其实并不是列表,字符转也可以作为iter的输入量,而是列表字符串本身即为满足__iter __() 和__getitem__()协议的类
例子3:
class A():
def __init__(self):
self.a = [1,2,3,4]
def __getitem__(self, item):
return self.a[item]
a = A()
a = iter(a)
for i in a:
print(i)
output:
1
2
3
4
输入的对象满足 getitem () method
例子4:
class A():
def __init__(self):
self.a = [1,2,3,4,5,6]
def __iter__(self):
for i in range(len(self.a)):
yield self.a[i]
a = A()
a = iter(a)
for i in range(6):
print(next(a))
output:
1
2
3
4
5
6
输入的对象通过__ iter__ () 返回 generator (也是迭代器),也可以完成 iter()操作
例子5:
class A():
def __init__(self,ls):
self.a = ls
self.idex = 0
def __next__(self):
item = self.a[self.idex]
self.idex +=1
return item
def __call__(self, *args, **kwargs):
return self.__next__()
a = A([1,2,3,4,5,6,'end',7,8])
a = iter(a,'end')
for i in a:
print(i)
output:
1
2
3
4
5
6
当含有第二个参数时, 第二个参数"end"作为一个"终止迭代标志"来引发终止迭代响应.此外,被输入的对象的要求发生了变更,则作为第一个参数的对象必须是可调对象,在这种情况下创建的迭代器将在每次迭代时调用__next __ ().(也就是用__call__ ()来调 __next __())
思考:
Python中的迭代器是什么?
Python中的迭代器只是一个可以迭代的对象。 一个将返回数据的对象,一次一个元素。
严格的讲,Python迭代器对象必须实现两个特殊method,__ iter __()和__next __(),统称为迭代器协议。
如果我们可以从中获取迭代器,则该对象称为iterable的。 Python中的大多数内置类型如:list,tuple,string等都是可迭代的。
iter()函数(反过来调用__iter __()也一样)从它们返回一个迭代器。