摘要:項目地址列表推導(dǎo)中提到的方法可以通過簡化的語法快速構(gòu)建我們需要的列表或其它可迭代對象,與它們功能相似的,還提供列表推導(dǎo)的語法。
項目地址:https://git.io/pytips
0x03 - Python 列表推導(dǎo)0x02 中提到的 map/filter 方法可以通過簡化的語法快速構(gòu)建我們需要的列表(或其它可迭代對象),與它們功能相似的,Python 還提供列表推導(dǎo)(List Comprehension)的語法。最初學(xué) Python 的時候,我只是把這種語法當做一種語法糖,可以用來快速構(gòu)建特定的列表,后來學(xué)習(xí) Haskell 的時候才知道這種形式叫做 List Comprehension(中文我好像沒有找到固定的翻譯,有翻譯成列表速構(gòu)、列表解析之類的,但意思上都是在定義列表結(jié)構(gòu)的時候按照一定的規(guī)則進行推導(dǎo),而不是窮舉所有元素)。
這種列表推導(dǎo)與數(shù)學(xué)里面集合的表達形式有些相似,例如$[0, 10)$之間偶數(shù)集合可以表示為:
$$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
同樣,列表推導(dǎo)也可以實現(xiàn)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
相比之下,列表推導(dǎo)的語法更加直觀,因此更 Pythonic 的寫法是在可以用列表推導(dǎo)的時候盡量避免map/filter。
除了上面簡單的迭代、過濾推導(dǎo)之外,列表推導(dǎo)還支持嵌套結(jié)構(gòu):
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字典與集合的推導(dǎo)
這樣一比較更加能夠突出列表推導(dǎo)的優(yōu)勢,但是當嵌套的循環(huán)超過2層之后,列表推導(dǎo)語法的可讀性也會大大下降,所以當循環(huán)嵌套層數(shù)增加時,還是建議用直接的語法。
Python 中除了列表(List)可以進行列表推導(dǎo)之外,字典(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),除了在函數(shù)中使用 yield 關(guān)鍵字之外還有另外一種隱藏方法,那就是對元組(Tuple)使用列表推導(dǎo):
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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37795.html
摘要:項目地址提供兩種內(nèi)置排序方法,一個是只針對的原地排序方法,另一個是針對所有可迭代對象的非原地排序方法。 項目地址:https://git.io/pytips Python 提供兩種內(nèi)置排序方法,一個是只針對 List 的原地(in-place)排序方法 list.sort(),另一個是針對所有可迭代對象的非原地排序方法 sorted()。 所謂原地排序是指會立即改變被排序的列表對象,就...
摘要:項目地址中的函數(shù)式編程函數(shù)式編程英語或稱函數(shù)程序設(shè)計,又稱泛函編程,是一種編程范型,它將電腦運算視為數(shù)學(xué)上的函數(shù)計算,并且避免使用程序狀態(tài)以及易變對象。 項目地址:https://git.io/pytips Python 中的函數(shù)式編程 函數(shù)式編程(英語:functional programming)或稱函數(shù)程序設(shè)計,又稱泛函編程,是一種編程范型,它將電腦運算視為數(shù)學(xué)上的函數(shù)計算,并且...
摘要:項目地址迭代器與生成器迭代器與生成器是中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例子。生成器前面說到創(chuàng)建迭代器有種方法,其中第三種就是生成器。 項目地址:https://git.io/pytips 迭代器與生成器 迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個概念,今天就把它們梳理一遍,并舉一些常用的例...
摘要:借鑒了中的某些迭代器的構(gòu)造方法,并在中實現(xiàn)該模塊是通過實現(xiàn),源代碼。 項目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對象,或者通過 yield 簡化定義的可迭代對象,而在一些函數(shù)式編程語言(見 0x02 Python 中的函數(shù)式編程)中,類似的迭代器常被用于產(chǎn)生特定格式的列表(或序列)...
摘要:項目地址所有用過的人應(yīng)該都看過下面兩行錯誤信息這就是界的錕斤拷今天和接下來幾期的內(nèi)容將主要關(guān)注中的字符串字節(jié)及兩者之間的相互轉(zhuǎn)換。 項目地址:https://git.io/pytips 所有用過 Python (2&3)的人應(yīng)該都看過下面兩行錯誤信息: UnicodeEncodeError: ascii codec cant encode characters in position...
閱讀 2915·2021-11-25 09:43
閱讀 2342·2021-11-24 09:39
閱讀 2724·2021-09-23 11:51
閱讀 1416·2021-09-07 10:11
閱讀 1461·2019-08-27 10:52
閱讀 1948·2019-08-26 12:13
閱讀 3369·2019-08-26 11:57
閱讀 1406·2019-08-26 11:31