1. 程式人生 > 其它 >Python的for迴圈究竟是什麼回事兒

Python的for迴圈究竟是什麼回事兒

技術標籤:pythonpython程式語言

Python 是一個設計優美的解釋型高階語言,它提供了很多能讓程式設計師感到舒適的功能特性。但有的時候 Python 的一些輸出結果對於初學者來說似乎並不是那麼一目瞭然。

GitHub 有個倉庫收集 Python 中那些難以理解和鮮為人知的功能特性,並嘗試討論這些現象背後真正的原理!

雖然有些例子並不一定會讓你覺得“臥槽”(WTF),但它們依然有可能會告訴你一些你所不知道的 Python 有趣特性。我覺得這是一種學習程式語言內部原理的好辦法,而且我相信你也會從中獲得樂趣!

如果你是一位經驗比較豐富的 Python 程式設計師,你可以嘗試挑戰看是否能一次就找到例子的正確答案。你可能對其中的一些例子已經比較熟悉了,那這也許能喚起你當年踩這些坑時的甜蜜回憶。

for 迴圈怎麼會事兒?

some_string = "wtf"
some_dict = {}
for i, some_dict[i] in enumerate(some_string):
    pass

Output:

>>> some_dict # 建立了索引字典.
{0: 'w', 1: 't', 2: 'f'}

說明:
Python 語法[1] 中對 for 的定義是:

for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]

其中 exprlist 指分配目標. 這意味著對可迭代物件中的每一項都會執行類似 {exprlist} = {next_value} 的操作.

一個有趣的例子說明了這一點:

for i in range(4):
    print(i)
    i = 10

Output:

0
1
2
3

你可曾覺得這個迴圈只會執行一次?

說明:

由於迴圈在Python中工作方式, 賦值語句 i = 10 並不會影響迭代迴圈, 在每次迭代開始之前, 迭代器(這裡指 range(4)) 生成的下一個元素就被解包並賦值給目標列表的變數(這裡指 i)了.
在每一次的迭代中, enumerate(some_string) 函式就生成一個新值 i (計數器增加) 並從 some_string 中獲取一個字元. 然後將字典 some_dict 鍵 i (剛剛分配的) 的值設為該字元. 本例中迴圈的展開可以簡化為:

>>> i, some_dict[i] = (0, 'w')
>>> i, some_dict[i] = (1, 't')
>>> i, some_dict[i] = (2, 'f')
>>> some_dict