摘要:項目地址列表推導中提到的方法可以通過簡化的語法快速構建我們需要的列表或其它可迭代對象,與它們功能相似的,還提供列表推導的語法。
項目地址:https://git.io/pytips
0x03 - Python 列表推導0x02 中提到的 map/filter 方法可以通過簡化的語法快速構建我們需要的列表(或其它可迭代對象),與它們功能相似的,Python 還提供列表推導(List Comprehension)的語法。最初學 Python 的時候,我只是把這種語法當做一種語法糖,可以用來快速構建特定的列表,后來學習 Haskell 的時候才知道這種形式叫做 List Comprehension(中文我好像沒有找到固定的翻譯,有翻譯成列表速構、列表解析之類的,但意思上都是在定義列表結構的時候按照一定的規則進行推導,而不是窮舉所有元素)。
這種列表推導與數學里面集合的表達形式有些相似,例如$[0, 10)$之間偶數集合可以表示為:
$$left{x | x in N, x lt 10, x mod 2 == 0 ight}$$
翻譯成 Python 表達式為:
evens = [x for x in range(10) if x % 2 == 0] print(evens)
[0, 2, 4, 6, 8]
這與filter效果一樣:
fevens = filter(lambda x: x % 2 == 0, range(10)) print(list(evens) == evens)
True
同樣,列表推導也可以實現map的功能:
squares = [x ** 2 for x in range(1, 6)] print(squares) msquares = map(lambda x: x ** 2, range(1, 6)) print(list(msquares) == squares)
[1, 4, 9, 16, 25] True
相比之下,列表推導的語法更加直觀,因此更 Pythonic 的寫法是在可以用列表推導的時候盡量避免map/filter。
除了上面簡單的迭代、過濾推導之外,列表推導還支持嵌套結構:
cords = [(x, y) for x in range(3) for y in range(3) if x > 0] print(cords) # 相當于 lcords = [] for x in range(3): for y in range(3): if x > 0: lcords.append((x, y)) print(lcords == cords)
[(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] True字典與集合的推導
這樣一比較更加能夠突出列表推導的優勢,但是當嵌套的循環超過2層之后,列表推導語法的可讀性也會大大下降,所以當循環嵌套層數增加時,還是建議用直接的語法。
Python 中除了列表(List)可以進行列表推導之外,字典(Dict)、集合(Set)同樣可以:
dns = {domain : ip for domain in ["github.com", "git.io"] for ip in ["23.22.145.36", "23.22.145.48"]} print(dns) names = {name for name in ["ana", "bob", "catty", "octocat"] if len(name) > 3} print(names)
{"github.com": "23.22.145.48", "git.io": "23.22.145.48"} {"octocat", "catty"}生成器
0x01中提到的生成器(Generator),除了在函數中使用 yield 關鍵字之外還有另外一種隱藏方法,那就是對元組(Tuple)使用列表推導:
squares = (x for x in range(10) if x % 2 == 0) print(squares) print(next(squares)) next(squares) for i in squares: print(i)
at 0x1104fbba0> 0 4 6 8
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37795.html
摘要:項目地址提供兩種內置排序方法,一個是只針對的原地排序方法,另一個是針對所有可迭代對象的非原地排序方法。 項目地址:https://git.io/pytips Python 提供兩種內置排序方法,一個是只針對 List 的原地(in-place)排序方法 list.sort(),另一個是針對所有可迭代對象的非原地排序方法 sorted()。 所謂原地排序是指會立即改變被排序的列表對象,就...
摘要:項目地址中的函數式編程函數式編程英語或稱函數程序設計,又稱泛函編程,是一種編程范型,它將電腦運算視為數學上的函數計算,并且避免使用程序狀態以及易變對象。 項目地址:https://git.io/pytips Python 中的函數式編程 函數式編程(英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程范型,它將電腦運算視為數學上的函數計算,并且...
摘要:項目地址迭代器與生成器迭代器與生成器是中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例子。生成器前面說到創建迭代器有種方法,其中第三種就是生成器。 項目地址:https://git.io/pytips 迭代器與生成器 迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例...
摘要:借鑒了中的某些迭代器的構造方法,并在中實現該模塊是通過實現,源代碼。 項目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對象,或者通過 yield 簡化定義的可迭代對象,而在一些函數式編程語言(見 0x02 Python 中的函數式編程)中,類似的迭代器常被用于產生特定格式的列表(或序列)...
摘要:項目地址所有用過的人應該都看過下面兩行錯誤信息這就是界的錕斤拷今天和接下來幾期的內容將主要關注中的字符串字節及兩者之間的相互轉換。 項目地址:https://git.io/pytips 所有用過 Python (2&3)的人應該都看過下面兩行錯誤信息: UnicodeEncodeError: ascii codec cant encode characters in position...
閱讀 2902·2021-11-25 09:43
閱讀 2320·2021-11-24 09:39
閱讀 2708·2021-09-23 11:51
閱讀 1400·2021-09-07 10:11
閱讀 1449·2019-08-27 10:52
閱讀 1929·2019-08-26 12:13
閱讀 3356·2019-08-26 11:57
閱讀 1394·2019-08-26 11:31