Python iter()使用哨兵值

Python iter()函数中使用哨兵值,Python内置的iter()函数把集合对象转换为迭代器,list, dictset类都可以通过iter()函数转换成基于自己集合的迭代器对象。大多数情况下,使用for语句进行隐式转换,但在一些特殊情况下,需要显式创建迭代器,例如把集合的头部与后面分开。

其他场景包括用迭代器读取可调用对象(例如函数)的返回值,直到匹配到哨兵值。可以把它与read()函数结合来读取文件,直到遇到行结束符或者文件结束符。例如iter(file.read, '\n')会一直读取文件内容,直到遇到哨兵值'\n'。使用它的时候要注意,如果在数据中一直没有遇到哨兵值,函数将一直反复读取零长度的字符串。

作为iter()参数的函数必须维护内部状态,使用起来有一定难度。函数式编程往往避免维护内部状态,然而所有的打开文件对象都会维护一个外界不可见的状态,比如read()函数或者readline()函数的内部状态是下一个字符或者下一行的位置。

显式迭代的另一种用法是可变集合使用pop()方法改变自身状态,使用pop()方法的示例如下:

>>> tail = iter([1, 2, 3, None, 4, 5, 6].pop, None)
>>> list(tail)
[6, 5, 4]

tail变量中保存的是列表[1, 2, 3, None, 4, 5, 6]使用pop()方法生成的迭代器。pop()方法默认弹出下标为-1的列表元素,也就是按照逆序依次弹出各个元素。每次执行pop()方法时,移除一个元素,列表内容发生变化,列表对象状态随之变化。当匹配到哨兵值后,迭代器不再返回数据,如果一直没有匹配到哨兵值,IndexError异常会终止函数的执行。

应尽量避免维护对象的内部状态,本教程不再涉及这一语言特征。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程