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

本文深入探讨Python中的循环和迭代,包括踩过的坑、for循环、可迭代对象和序列、迭代器、生成器等。通过实例分析,解释了Python循环与迭代的工作原理,强调了迭代器协议的重要性,指出Python的迭代器是一次性的惰性可迭代对象,只能遍历一次。同时,文章揭示了在Python中迭代器无处不在的现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值