python楊輝三角_python中的部分高階特性
阿新 • • 發佈:2020-12-09
程式碼環境:python3.6
列表生成式
建立一個 list,python 內建了一個非常簡潔卻強大的方式。
舉個例子,生成一個[1, 2, 3, 4, 5]
的 list,可以用:
[
如果我們要生成一個偶數的 list,可以用:
[
我們還可以用兩層迴圈(三層及三層迴圈以上很少用)實現多種組合,舉例:
[
生成器 generator
通過列表生成式,我們可以直接建立一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立一個包含 100 萬個元素的列表,不僅佔用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的 list,從而節省大量的空間。在 python 中,這種一邊迴圈一邊計算的機制,稱為生成器:generator。
generator 最常建立的方法有兩種:
- 將列表生成式裡面的
[]
改成()
; - 在一個函式中,如果包含
yield
關鍵字,這個函式就是 generator。
而使用 generator 也有兩種方法:
- 假如我們有一個生成器物件
gen
,可以直接用next(gen)
不斷獲得下一個返回值(這種方法基本很少用到),直到gen
丟擲異常StopIteration
。 - 只需要用 for 迴圈依次輸出元素即可,程式碼遇到
StopIteration
下面我們就建立 generator 的兩種方法進一步說明。
第一種方法在程式碼邏輯簡單的時候最方便,舉個例子:
gen
第二種方法適用於邏輯複雜的狀況,我們用程式碼實現 楊輝三角,將每行看做一個 list,不斷輸出下一行的 list:
def
可迭代物件 iterable、迭代器 iterator
- 可作用於 for 迴圈的物件都是 iterable 型別;
- 一個物件,如果定義了
__iter__
和__next__
這兩個方法,它就是迭代器。我們可以簡單理解為:可作用於next()
函式的物件都是 iterator 型別。
list、dict、str 都是 iterable,但不是 iterator,因為它們沒有實現__next__
iter()
函式把 iterable 變成 iterator,比如iter([1, 2, 3])
就是一個 iterator。
注意:上面我們講到的 generator,就是一個 iterator,因為 generator 自動建立了__iter__
和__next__
這兩個函式;但反過來,iterator 不一定是 generator。