前言
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)
新聞熱點
疑難解答