成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PyTips 0x03 - Python 列表推導(dǎo)

sugarmo / 483人閱讀

摘要:項(xiàng)目地址列表推導(dǎo)中提到的方法可以通過簡化的語法快速構(gòu)建我們需要的列表或其它可迭代對象,與它們功能相似的,還提供列表推導(dǎo)的語法。

項(xiàng)目地址:https://git.io/pytips

0x03 - Python 列表推導(dǎo)

0x02 中提到的 map/filter 方法可以通過簡化的語法快速構(gòu)建我們需要的列表(或其它可迭代對象),與它們功能相似的,Python 還提供列表推導(dǎo)(List Comprehension)的語法。最初學(xué) Python 的時(shí)候,我只是把這種語法當(dāng)做一種語法糖,可以用來快速構(gòu)建特定的列表,后來學(xué)習(xí) Haskell 的時(shí)候才知道這種形式叫做 List Comprehension(中文我好像沒有找到固定的翻譯,有翻譯成列表速構(gòu)、列表解析之類的,但意思上都是在定義列表結(jié)構(gòu)的時(shí)候按照一定的規(guī)則進(jìn)行推導(dǎo),而不是窮舉所有元素)。

這種列表推導(dǎo)與數(shù)學(xué)里面集合的表達(dá)形式有些相似,例如$[0, 10)$之間偶數(shù)集合可以表示為:

$$left{x | x in N, x lt 10, x mod 2 == 0 ight}$$

翻譯成 Python 表達(dá)式為:

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)也可以實(shí)現(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)的時(shí)候盡量避免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)

# 相當(dāng)于
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)勢,但是當(dāng)嵌套的循環(huán)超過2層之后,列表推導(dǎo)語法的可讀性也會(huì)大大下降,所以當(dāng)循環(huán)嵌套層數(shù)增加時(shí),還是建議用直接的語法。

Python 中除了列表(List)可以進(jìn)行列表推導(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://systransis.cn/yun/37795.html

相關(guān)文章

  • PyTips 0x0e - Python 內(nèi)置排序方法

    摘要:項(xiàng)目地址提供兩種內(nèi)置排序方法,一個(gè)是只針對的原地排序方法,另一個(gè)是針對所有可迭代對象的非原地排序方法。 項(xiàng)目地址:https://git.io/pytips Python 提供兩種內(nèi)置排序方法,一個(gè)是只針對 List 的原地(in-place)排序方法 list.sort(),另一個(gè)是針對所有可迭代對象的非原地排序方法 sorted()。 所謂原地排序是指會(huì)立即改變被排序的列表對象,就...

    Baoyuan 評(píng)論0 收藏0
  • PyTips 0x02 - Python 中的函數(shù)式編程

    摘要:項(xiàng)目地址中的函數(shù)式編程函數(shù)式編程英語或稱函數(shù)程序設(shè)計(jì),又稱泛函編程,是一種編程范型,它將電腦運(yùn)算視為數(shù)學(xué)上的函數(shù)計(jì)算,并且避免使用程序狀態(tài)以及易變對象。 項(xiàng)目地址:https://git.io/pytips Python 中的函數(shù)式編程 函數(shù)式編程(英語:functional programming)或稱函數(shù)程序設(shè)計(jì),又稱泛函編程,是一種編程范型,它將電腦運(yùn)算視為數(shù)學(xué)上的函數(shù)計(jì)算,并且...

    FrozenMap 評(píng)論0 收藏0
  • PyTips 0x01 - 迭代器與生成器

    摘要:項(xiàng)目地址迭代器與生成器迭代器與生成器是中比較常用又很容易混淆的兩個(gè)概念,今天就把它們梳理一遍,并舉一些常用的例子。生成器前面說到創(chuàng)建迭代器有種方法,其中第三種就是生成器。 項(xiàng)目地址:https://git.io/pytips 迭代器與生成器 迭代器(iterator)與生成器(generator)是 Python 中比較常用又很容易混淆的兩個(gè)概念,今天就把它們梳理一遍,并舉一些常用的例...

    chemzqm 評(píng)論0 收藏0
  • PyTips 0x16 - Python 迭代器工具

    摘要:借鑒了中的某些迭代器的構(gòu)造方法,并在中實(shí)現(xiàn)該模塊是通過實(shí)現(xiàn),源代碼。 項(xiàng)目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對象,或者通過 yield 簡化定義的可迭代對象,而在一些函數(shù)式編程語言(見 0x02 Python 中的函數(shù)式編程)中,類似的迭代器常被用于產(chǎn)生特定格式的列表(或序列)...

    mayaohua 評(píng)論0 收藏0
  • PyTips 0x07 - Python 字符串

    摘要:項(xiàng)目地址所有用過的人應(yīng)該都看過下面兩行錯(cuò)誤信息這就是界的錕斤拷今天和接下來幾期的內(nèi)容將主要關(guān)注中的字符串字節(jié)及兩者之間的相互轉(zhuǎn)換。 項(xiàng)目地址:https://git.io/pytips 所有用過 Python (2&3)的人應(yīng)該都看過下面兩行錯(cuò)誤信息: UnicodeEncodeError: ascii codec cant encode characters in position...

    go4it 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<