反覆運算

標籤: 

該主題包含 0 則回覆,有 1 個參與人,並且由  BettyBDChiang6 年, 11 月 前 最後更新。

正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)
  • 作者
    文章
  • #1180

    BettyBDChiang
    參與者

    轉載自廖雪峰的官方網站

    如果給定一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為反覆運算(Iteration)。

    在Python中,反覆運算是通過for … in來完成的,而很多語言比如C或者Java,反覆運算list是通過下標完成的,比如Java代碼:

    for (i=0; i<list.length; i++) {
        n = list[i];
    }

    可以看出,Python的for迴圈抽象程度要高於Java的for迴圈,因為Python的for迴圈不僅可以用在list或tuple上,還可以作用在其他可反覆運算物件上。

    list這種資料類型雖然有下標,但很多其他資料類型是沒有下標的,但是,只要是可反覆運算物件,無論有無下標,都可以反覆運算,比如dict就可以反覆運算:

    >>> d = {'a': 1, 'b': 2, 'c': 3}
    >>> for key in d:
    ...     print(key)
    ...
    a
    c
    b

    因為dict的存儲不是按照list的方式順序排列,所以,反覆運算出的結果順序很可能不一樣。
    預設情況下,dict反覆運算的是key。如果要反覆運算value,可以用for value in d.values(),如果要同時反覆運算key和value,可以用for k, v in d.items()。

    由於字串也是可反覆運算物件,因此,也可以作用於for迴圈:

    >>> for ch in 'ABC':
    ...     print(ch)
    ...
    A
    B
    C

    所以,當我們使用for迴圈時,只要作用於一個可反覆運算物件,for迴圈就可以正常運行,而我們不太關心該物件究竟是list還是其他資料類型。

    那麼,如何判斷一個物件是可反覆運算物件呢?方法是通過collections模組的Iterable類型判斷:

    >>> from collections import Iterable
    >>> isinstance('abc', Iterable) # str是否可反覆運算
    True
    >>> isinstance([1,2,3], Iterable) # list是否可反覆運算
    True
    >>> isinstance(123, Iterable) # 整數是否可反覆運算
    False

    最後一個小問題,如果要對list實現類似Java那樣的下標迴圈怎麼辦?Python內置的enumerate函數可以把一個list變成索引-元素對,這樣就可以在for迴圈中同時反覆運算索引和元素本身:

    >>> for i, value in enumerate(['A', 'B', 'C']):
    ...     print(i, value)
    ...
    0 A
    1 B
    2 C

    上面的for迴圈裡,同時引用了兩個變數,在Python裡是很常見的,比如下面的代碼:

    >>> for x, y in [(1, 1), (2, 4), (3, 9)]:
    ...     print(x, y)
    ...
    1 1
    2 4
    3 9

    小結

    任何可反覆運算物件都可以作用於for迴圈,包括我們自訂的資料類型,只要符合反覆運算條件,就可以使用for迴圈。

正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)

抱歉,回覆主題必需先登入。