Python3内置函数汇总

目录

Python3 iter() 函数详解 将可迭代对象转为迭代器

iter()函数的主要作用是将可迭代的对象(Iterable)转换为迭代器(Iterator),一切支持了迭代协议(__iter__()方法)的集合对象或者支持序列协议的(__getitem__()方法)都可以作为Iterable,还可以通过第二个参数指定自定义的过滤方法。
它是Python的内置函数,在python文件中直接可以使用。

iter

语法

iter(object[, sentinel])

参数

object - 支持迭代协议或者序列协议的可迭代对象,包括(字符串、列表、元组、字典、文件以及自定义类实现了上述协议方法的对象)。
sentinel(可选) - 这是一个“哨兵”,当使用了这个参数时,第1个参数就不是传递可迭代对象了,而是要传递一个可调用的对象(使用callable()返回True的对象),如果直接使用类实例化对象的话,需要类中设置了__call__()方法,而调用类方法不需要考虑这点。每次对象的返回值都会与“哨兵”进行对比,如果值与“哨兵”吻合,则终止执行,把之前所有通过的值组成一个迭代器。

返回值

一个迭代器对象

实例

§ 实例1 - 迭代器
#声明一个列表序列。
>>> l = [1,2,3]
#转换为迭代器
>>> it = iter(l)
#循环迭代器
>>> for i in it:
...     print(i)
...
#执行结果
1
2
3

#可能你会想,直接使用l这个列表进行for循环,结果也是1,2,3。为什么要加一步迭代器的转换呢?
#实际上在日常的开发中,for循环是支持一切可迭代对象的,所以我们并不需要手动转换为迭代器的,是因为for循环自己做了转换。一个for循环相当于:

>>> it = iter(l)
>>> while True:
...     try:
...         print(next(it))
...     except StopIteration:
...         break
§ 实例2 - 迭代对象和迭代器的区别

迭代对象的长度是可知的,迭代器的长度是未知的“未知的” 迭代器可以使用next()函数逐步打印出下一个值,并且是不可退的,而迭代对象不可以使用next()函数.

#使用len()函数判断长度,列表对象是返回列表值的总数。
>>> l = [1,2,3]
>>> len(l)
3

#而迭代器直接报错。
>>> it = iter(l)
>>> len(it)
TypeError: object of type 'list_iterator' has no len()
#迭代器可以使用next()获取下一个值。
>>> l = [1,2,3]
>>> it = iter(l)
>>> next(it)
1
#之所以它是不可退的,是因为执行一个next()之后,那个被执行的值就没了。
>>> list(it)
[2, 3]

#而列表是无法使用next()函数的,会报错的。
>>> l = [1,2,3]
>>> next(l)
TypeError: 'list' object is not an iterator
§ 实例3 - 我是一个“小哨兵”

这实例主要是讲解一下iter()函数第2个参数sentinel用法。

#初始化时,声明了一个由5个值组成的迭代器。
>>> class main:
...     def __init__(self):
...         self.it = iter([1,2,3,4,5])
...     def get(self):
...         try:
...             x = next(self.it)
...         except StopIteration:
...             return False
...         return x
...
>>> o = main()
#它会一直多次调用指定的对象,直到对象返回的值与第2个参数的值相同为止。
>>> list(iter(o.get, 3))
[1, 2]

#实例化后还要再调用一个方法是不是有点麻烦? 那么我们直接用类的对象好了。
#只需要在类里面加一个__call__方法就可以了。
>>> class main:
...     def __init__(self):
...         self.it = iter([1,2,3,4,5])
...     def __call__(self):
...         try:
...             x = next(self.it)
...         except StopIteration:
...             return False
...         return x
...
>>> o = main()
>>> list(iter(o, 3))
[1, 2]

#效果是一样的。

如果有任何建议或意见,欢迎交流沟通

作者:张恺阳

本文链接:https://www.zky.name/article/47.html

来源:张恺阳博客