Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

4.1.1 手动遍历迭代器

很多开发人员可能习惯使用for循环遍历可迭代对象中的所有元素,这样操作并没有问题,但效率并不是最高的。其实,不用for循环也可以遍历可迭代对象中的所有元素。

我们可使用next()函数遍历可迭代对象并在代码中捕获StopIteration异常。下面展示一个读取文件中所有行的示例,代码如下:


def manual_iter():
    with open('/etc/passwd') as f:
        try:
            while True:
                line = next(f)
                # end 指定为 空,输出行不会有一个空白行
                print(line, end='')
        except StopIteration:
            pass

上述代码中,StopIteration用来指示迭代的结尾。next()函数可以通过返回一个指定值来标记结尾,如None或空字符,示例如下:


with open('/etc/passwd') as f:
    while True:
        line = next(f, None)
        if not line:
            break
        # end 指定为 空,输出行不会有一个空白行
        print(line, end='')

很多时候,我们会习惯使用for循环语句来遍历一个可迭代对象。但当需要对迭代做更加精确的控制时,了解底层迭代机制就显得尤为重要了。

下面示例演示了迭代的一些基本细节,代码(hands_iter.py)如下:


num_list = [1, 2, 3]
items = iter(num_list)
for i in range(len(num_list)):
    print(f'first items next is:{next(items)}')

for i in range(len(num_list) + 1):
    print(f'second items next is:{next(items)}')

执行py文件,输出结果如下:


first items next is:1
first items next is:2
first items next is:3
second items next is:1
second items next is:2
second items next is:3
Traceback (most recent call last):
  File "/advanced_programming/chapter4/hands_iter.py", line 27, in <module>
    print(f'second items next is:{next(items)}')
StopIteration

比对输出结果,查看第一个循环输出和第二个循环输出的结果,可以发现第二个循环抛出异常了。