Python iter()函数中使用哨兵值,Python内置的iter()
函数把集合对象转换为迭代器,list, dict
和set
类都可以通过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
异常会终止函数的执行。
应尽量避免维护对象的内部状态,本教程不再涉及这一语言特征。