在Python中,代碼不是越多越好,而是越少越好。代碼不是越復雜越好,而是越簡單越好。請始終牢記,代碼越少,開發效率越高。
切片
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
-
切片,取前3個元素
>>> L[0:3]
說明:L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。 -
如果第一個索引是0,可以省略
>>> L[:3]
-
倒數切片
>>> L[-2:]
說明:從倒數第二個取,一直取到最后一個 -
前10個數,每兩個取一個
>>> L = list(range(100)) //創建一個0-99的list
>>> L[:10:2]
-
復制list
>>> L[:]
-
tuple也可以用切片操作,只是操作的結果仍是tuple
>>> (0, 1, 2, 3, 4, 5)[:3]
-
字符串也可以用切片操作,只是操作結果仍是字符串
>>> 'ABCDEFG'[:3]
列表生成式
- 生成列表:[1x1, 2x2, 3x3, ..., 10x10]
>>> [x * x for x in range(1, 11)]
說明:把要生成的元素x*x放到前面,后面跟for循環,就可以把list創建出來 - if ... else
跟在for后面的if是一個篩選條件,不能帶else
>>> [x for x in range(1, 11) if x % 2 == 0]
for前面的部分是一個表達式,必須加上else。表達式:x if x % 2 == 0,它無法根據x計算出結果,因為缺少else
>>> [x if x % 2 == 0 else -x for x in range(1, 11)]
生成器
定義:列表元素可以按照某種算法推算出來,可以在循環的過程中不斷推算出后續的元素。在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator。
- 創建生成器的方法
>>> g = (x * x for x in range(10))
- 通過next()函數獲得生成器的下一個返回值:
>>> next(g)
說明:生成器保存的是算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出StopIteration的錯誤。 - 使用for循環也可獲取
>>> g = (x * x for x in range(10))
>>> for n in g:
... print(n)
迭代器
- 可迭代對象:可以直接作用於for循環的對象統稱為可迭代對象
一類是集合數據類型,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。 - isinstance()判斷一個對象是否是可迭代對象
>>> from collections.abc import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('abc', Iterable)
True
>>> isinstance((x for x in range(10)), Iterable)
True
>>> isinstance(100, Iterable)
False
- 迭代器:可以被next()函數調用並不斷返回下一個值的對象稱為迭代器
- 使用isinstance()判斷一個對象是否是迭代器對象
>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False
說明:生成器都是可迭代對象,但list、dict、str雖然是可迭代對象,卻不是迭代器。
可以這樣簡單理解,迭代器可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。
- 使用iter()函數,把可迭代對象變成迭代器
>>> isinstance(iter([]), Iterator)
生成器和迭代器的總結
-
凡是可作用於for循環的對象都是可迭代類型;
-
凡是可作用於next()函數的對象都是迭代器類型,它們表示一個惰性計算的序列;
-
集合數據類型如list、dict、str等是可迭代對象但不是迭代器,不過可以通過iter()函數變為迭代器。
-
生成器是一種特殊的迭代器(注意這個邏輯關系反之不成立)。
-
合理使用生成器,可以降低內存占用、優化程序結構、提高程序速度。
-
生成器在 Python 2 的版本上,是協程的一種重要實現方式;而 Python 3.5 引入 async await 語法糖后,生成器實現協程的方式就已經落后了。
-
迭代器是一個有限集合,生成器則可以成為一個無限集。調用 next(),生成器根據運算會自動生成新的元素
-
聲明一個迭代器,
[i for i in range(10)]
-
聲明一個生成器,
(i for i in range(10))
-
生成器並不會像迭代器一樣占用大量內存,只有在被使用的時候才會調用。而且生成器在初始化的時候,並不需要運行一次生成操作,相比於迭代器節省了一次生成10個元素的過程,因此耗時明顯比迭代器短。