深入理解 Python 中的循环和迭代

深入理解 Python 中的循环和迭代_第1张图片

 

循环,特别是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循环

你可能感兴趣的:(python,开发语言,后端)