当循环遍历字典时,键和对应的值可以使用items()
方法同时提取出来。
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'} >>> for k, v in knights.items(): ... print(k, v) ... gallahad the pure robin the brave
当遍历一个序列时,使用enumerate()
函数可以同时得到位置索引和对应的值。
>>> for i, v in enumerate(['tic', 'tac', 'toe']): ... print(i, v) ... 0 tic 1 tac 2 toe
同时遍历两个或更多的序列,使用zip()
函数可以成对读取元素。
>>> questions = ['name', 'quest', 'favorite color'] >>> answers = ['lancelot', 'the holy grail', 'blue'] >>> for q, a in zip(questions, answers): ... print('What is your {0}? It is {1}.'.format(q, a)) ... What is your name? It is lancelot. What is your quest? It is the holy grail. What is your favorite color? It is blue.
要反向遍历一个序列,首先正向生成这个序列,然后调用reversed()
函数。
>>> for i in reversed(range(1, 10, 2)): ... print(i) ... 9 7 5 3 1
要按顺序循环一个序列,请使用sorted()
函数,返回一个新的排序的列表,同时保留源不变。
>>> basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] >>> for f in sorted(set(basket)): ... print(f) ... apple banana orange pear
如果在遍历列表的时候同时想改变它,创建一个新的列表会更简单更安全。
>>> import math >>> raw_data = [56.2, float('NaN'), 51.7, 55.3, 52.5, float('NaN'), 47.8] >>> filtered_data = [] >>> for value in raw_data: ... if not math.isnan(value): ... filtered_data.append(value) ... >>> filtered_data [56.2, 51.7, 55.3, 52.5, 47.8]
深入条件控制
while
和if
语句中使用的条件可以包含任意的操作,而不仅仅是比较。
比较操作符in
和not in
检查一个值是否在一个序列中出现(不出现)。is
和is not
比较两个对象是否为相同的对象;这只对列表这样的可变对象比较重要。所有比较运算符都具有相同的优先级,低于所有数值运算符。
可以级联比较。例如,a < b == c
测试a
是否小于b
并且b
是否等于c
。
可以使用布尔运算符and
和or
组合,比较的结果(或任何其他的布尔表达式)可以用not
取反。这些操作符的优先级又低于比较操作符;它们之间,not
优先级最高,or
优先级最低,所以 A and not B or C
等效于 (A and (not B)) or C
。与往常一样,可以使用括号来表示所需的组合。
布尔运算符and
和 or
是所谓的 短路 运算符:依参数从左向右求值,结果一旦确定就停止。例如,如果A
和 C
都为真,但B
是假, A and B and C
将不计算表达式 C
。当用作一个普通值而非逻辑值时,短路操作符的返回值通常是最后一个计算的。
可以把比较或其它逻辑表达式的返回值赋给一个变量。例如,
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance' >>> non_null = string1 or string2 or string3 >>> non_null 'Trondheim'
序列和其它类型的比较
序列对象可以与具有相同序列类型的其他对象相比较。比较按照 字典序 进行: 首先比较两个序列的首元素,如果不同,就决定了比较的结果;如果相同,就比较后面两个元素,依此类推,直到其中一个序列穷举完。如果要比较的两个元素本身就是同一类型的序列,就按字典序递归比较。如果两个序列的所有元素都相等,就认为序列相等。如果一个序列是另一个序列的初始子序列,较短的序列就小于另一个。字符串的词典序使用Unicode码点数字来排序单个字符。下面是同类型序列之间比较的一些例子:
>>> (1, 2, 3) < (1, 2, 4) True >>> [1, 2, 3] < [1, 2, 4] True >>> (1, 2, 3, 4) < (1, 2, 4) True >>> 'ABC' < 'C' < 'Pascal' < 'Python' True >>> (1, 2, 3) == (1.0, 2.0, 3.0) True >>> (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4) True >>> (1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
字典序:
注意使用<
或 >
比较不同类型的对象也是合法的,只要对象具有恰当的比较方法。例如,不同的数字类型按照它们的数值比较,所以 0 等于 0.0,等等。否则,解释器将引发一个TypeError
异常,而不是给出一个随便的顺序。