循环,特别是for
循环,是Python中常见的语句,甚至于Guido van Rossum(Python创始人)在评论递归的时候说过在Python中“递归已死”,我想这句话的意思不是说在Python中不能用递归,而是说因为Python中的for
循环语句足够强大,可以不考虑递归,而是用for
循环实现原本用递归做的事情。
本来,在《Python大学实用教程》和《跟老齐学Python:轻松入门》两本书中都对for
循环语句做了很完整地介绍,并且在这两本书中也有关于可迭代等概念,但是,如何将两者融合起来理解,从而能够更好地实现for
循环,对新手还是有挑战的。
本文就在以上两本书所述基础上,从更深入和综合的角度进行阐述,以便能更好地使用for
循环。
踩过的坑
在实用for
循环中,特别是初学者,会遇到很多坑,这里列举几个,看看你是否遇到过?
1、第二次无果
假设有一个数字组成的列表和一个生成器,生成器给出这些数字的平方:
>>> numbers = [1, 2, 3, 5, 7]
>>> squares = (n**2 for n in numbers)
用tuple
函数,将squares
转化为元组。
>>> tuple(squares)
(1, 4, 9, 25, 49)
现在,又向计算这个生成器对象squares
里面所有数字的和,观察一下,应该能看出来,其和是88
,然而:
>>> sum(squares)
0
这里计算结果为0
,是Python的BUG吗?
2、检查无效
再用下面的方法得到那个生成器对象:
>>> numbers = [1, 2, 3, 5, 7]
>>> squares = (n**2 for n in numbers)
如果检查9
是否在squares
生成器中,显然这是真的True
。但是同样的检查如果再做一遍,就不是这个结果了——不可重复,不科学?
>>> 9 in squares
True
>>> 9 in squares
False
3、解包
创建一个包含两个键值对的字典:
>>> counts = {'apples': 2, 'oranges': 1}
用多变量的赋值语句对字典解包:
>>> x, y = counts
先猜一下,这样做会有什么结果?报错,还是两个变量分别引用了两个键值对——引用键值对,兼职不可能吧,除非将键值对包裹在字典里。
但是,一没有报错,二没有返回键值对,而是:
>>> x
'apples'
这似乎也合乎情理和逻辑。
复习for循环
温故而知新,先来回顾一下for
循环。
严格地说,Python中的for
循环并不“传统”,或者说不符合众多语言中所继承的C语言风格的for
循环