Python循环和迭代器

作者:最西瓜 来源:《Core Python Programming, Second Edition》CH8. Conditionals and Loops

Python 支持一种特殊形式的三元操作符 ret = X if C or Y 当条件 C 为真时,返回 X 否则返回 Y

Python 的 for 语句跟别的传统不一样,它只能对迭代器起作用,在内部调用迭代器的 next() 方法,并且在结束时捕获 StopIteration 异常。这一点非常像是 PHP 中的 foreach 关键字。对于迭代器有一些限制:不可以回溯、不可以拷贝、不可在迭代期间新增或删除元素。用 iter() 可以取得序列的迭代器。为了达到删除的目的,使用列表解析(List Comprehensions)或者 itertools 模块中的函数。iter() 函数有两种形式:iter(obj) 可以用序列或者实现了 __iter__() 和 next() 函数的类对象作为参数;iter(func, sentinel) 用函数对象和哨兵值(sentinel)作为参数;

列表解析的形式如下:

1
2
3
4
5
[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]

[(x**2) for x in range(6)]
[x for x in seq if x%2]

列表解析还支持多重嵌套 for 循环:[(x+1,y+1) for x in range(3) for y in range(5)] 完整的描述在 PEP202 中。生成器表达式(Generator Expressions)是列表解析的迭代器版本,它不直接创建列表,而是在每次迭代中返回一个值,形式如下:(expr for iter_var in iterable if cond_expr) ,以下是一些高级用法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
rows = [1,2 3, 17]
def cols():
    yield 56
    yield 2
    yield 1

x_product_pairs = ((i, j) for i in rows for j in cols())
for pair in x_product_pairs:
    print pair

# 得到文件中最长一行的字符数
max(len(x.strip()) for x in open("~/afile"))

为了模拟传统 for 循环,可以使用 range([start,] end[, step=1]) 函数,start 和 step 都是可选的,如果 start 不提供则默认从 0 开始,range() 函数返回 k, start <= k < end, k 以 step 步进。xrange() 是 range() 的迭代器版本。

Python 中有 pass 语句来表示什么也不执行,通常用于 stub 代码中或者异常处理中。

Python 的 for 和 while 可以包含 else 子句,只有在循环正常结束,而不是通过 break 跳出时才会执行 else 部分。