循环

for

for 很简单,构建循环逻辑用的,前文的代码中,已经反复出现过了,此处就不做额外解释了。
for 跟 range 经常会一起配合使用,因为 range 可以构建一个整数的数组。在 Python 2 中,如果数组足够大,range 是有性能问题的,因为它一次性就把数组构建出来了,除了占了 CPU 之外,还占了不必要的内存,所以又多了个 xrange。Python 3 中则没有这个问题,当然也不再有 xrange。 (从 xrange 存在的历史来看,Python 的设计也是修修补补过来的)

for 也经常会跟 enumerate 这个函数一起使用来进行遍历,可以同时提供一个 list 内元素的 index (索引位置),参考如下代码:

>>> the_list = ['a', 'b', 'c']
>>> for i, item in enumerate(the_list):
...     print(i, item)
...
(0, 'a')
(1, 'b')
(2, 'c')

除了 list、tuple 的类型可以使用 for 之外,dict 也可以:

>>> the_dict = dict(a=1, b=2)
>>> for k in the_dict:
...     print(k)
...
a
b
>>> for k, v in the_dict.items():
...     print(k, v)
...
('a', 1)
('b', 2)

对了,字符串也可以被 for 来循环,那就是逐字逐字遍历了。
for 本质上是对 迭代器 进行遍历,但关于迭代器是什么,可以暂时不用去管,有一天真的看到了,或者需要用到的时候,再去进一步了解就可以了。

while

if 的逻辑翻译成中文,大概是 如果这样,那么...,而 while 翻译成中文,大概是 如果一直这样,那么...
重点就在 一直,我们把 循环 想象成一圈圈地跑步,while 条件: 然后...。每一圈跑到终点(也是新一圈的起点)的时候,先判断下条件是否还符合,如果符合了就继续跑下去,如此循环往复。

>>> a = 0
>>> while a < 5:
...     print(a)
...     a += 1
...
0
1
2
3
4

使用 while 的时候,务必小心,要避免死循环的产生。死循环,就是指 while 条件 中的 条件 一直符合,然后就不断地运行下去。比如下面就是最简单的一个死循环:

while True:
    print('dead loop')

continue、break

不论是 for 还是 while,都是支持 continue、break 这两个语法的。
我们继续把 循环 比喻成 跑圈: continue 相当于直接跳到新起点,跑下一圈;而 break 则表示,于此处停下,并且不跑了,因为已经跑完了

参考代码如下:

>>> for i in range(10000):
...     print(i)
...     if i==5: break
...
0
1
2
3
4
5

for、else

else 是一个 『使用广泛』的关键词,其实这种设计,我个人认为,有些场合下并不好。
if 跟 else 一起使用,这个很容易理解,但是,else 也可以跟 for 连用,它的意思是 for 里面每个元素都遍历了,如果没有 break,那么 (else) 最后如何如何……
有些拗口了吧?而且语义的感觉也不是很对味。

大概明白 for、else 的意思就可以了,未来可能在别人的代码中看到。
我们自己写代码的时候,完全可以换另外一种更自然的逻辑进行书写。
虽然这种态度和思路,会被一些人批判,认为对 native 的不尊重,甚至偏离了某些真理。大可不必如此,在同样能解决问题的基础上,可以有自己的选择。而且,这只是无足轻重的小细节。

使用 for+else,错误的示例:

>>> for i in range(100):
...     if i == 3:
...         print('found 3')
... else:
...     print('not found 3 ...')
...
found 3
not found 3 ...

使用 for+else,正确的示例:

>>> for i in range(100):
...     if i == 3:
...         print('found 3')
...         break
... else:
...     print('not found 3 ...')
...
found 3

换个角度,虽然代码多了两行,但是不是更容易理解?

>>> found = False
>>> for i in range(100):
...     if i == 3:
...         print('found 3')
...         found = True
...         break
... if not found:
...     print('not found 3 ...')
...
found 3