Python基础学习 iter 用法,迭代器 next

网上很多关于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 __())

思考:

  • iter 的目的(当只含有一个参数时)是想要返回一个 iterator, 满足 返回 generator 抑或满足 iterator protocol 抑或满足sequence protocol 都是为了满足 "能够返回 iterator 这个条件.
  • 字符串,列表或元组对象都可用于创建迭代器
  • iter(a) 也可以写成 a.__ iter__()
  • Python中的迭代器是什么?
    Python中的迭代器只是一个可以迭代的对象。 一个将返回数据的对象,一次一个元素。
    严格的讲,Python迭代器对象必须实现两个特殊method,__ iter __()和__next __(),统称为迭代器协议。
    如果我们可以从中获取迭代器,则该对象称为iterable的。 Python中的大多数内置类型如:list,tuple,string等都是可迭代的。
    iter()函数(反过来调用__iter __()也一样)从它们返回一个迭代器。

你可能感兴趣的:(Python学习)