前言
Python 中的 for 循环和其他语言中的 for 循环工作方式是不一样的,今天就带你深入了解 Python 的 for 循环,看看它是如何工作的,以及它为什么按照这种方式工作。
循环中的陷阱
我们先来看一下 Python 循环中的「陷阱」,在我们了解了循环的工作方式后,再来看下这些陷阱到底是怎么出现的。
陷阱 1:循环两次
现在我们先假设有一个数字组成的列表,和一个用于返回这些数字的平方的生成器:
>>> nums = [1, 2, 3, 4]>>> squares = (n**2 for n in nums)
我们可以将这个生成器对象传递给元组构造器,从而可以得到一个元组:
>>> tuple(squares)(1, 4, 9, 16)
这个时候,如果我们再将这个构造器对象传递给 sum 函数,按理说应该会返回这些数字的和吧:
>>> sum(squares)0
返回的是个 0,先拖住下巴。
陷阱 2:检查是否包含
我们还是使用上面的数字列表和生成器:
>>> nums = [1, 2, 3, 4]>>> squares = (n**2 for n in nums)
如果我 squares 生成器中是否包含 9,答案是肯定的,若果我再问一次呢?
你敢答应吗
>>> 9 in squaresTrue>>> 9 in squaresFalse
发现,第二次不灵了~
怎么不灵了
陷阱 3:拆包
现在假设有一个字典:
>>> counts = {1:'a', 2:'b'}
然后,我们用多个变量对字典进行拆包:
>>> x,y = counts
你觉得这时候,x 和 y 中会是什么?
>>> x1>>> y2
我们只得到了键。
下面,我们先来了解下 Python 中的循环工作原理,然后再反过头来看这些陷阱问题。
一些概念
首先,先了解一些基本概念:
可迭代和序列
可迭代就是指任意可以使用 for 循环遍历的东西,可迭代意味着可以遍历,任何可以遍历的东西都是可迭代的。
for item in some_iterable: print(item)
序列是一种常见的可迭代类型,如列表、元组、字符串等。
序列是可迭代的,它有着一些特点,它们是从 0 开始索引,索引长度不超过序列的长度;它们有序列长度;并且它们可以被切分。
Python 中的大部分东西都是可以迭代的,但是可以迭代并不意味着它是序列。如集合、字典、文件和生成器都是可迭代的,但是它们都不是序列。
>>> my_set = {1, 2, 3}>>> my_dict = {'k1': 'v1', 'k2': 'v2'}>>> my_file = open('some_file.txt')>>> squares = (n**2 for n in my_set)
新闻热点
疑难解答