日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python 列表推導(dǎo)式需要注意的地方

瀏覽:14日期:2022-07-07 13:09:25

原文地址:The Do’s and Don’ts of Python List Comprehension原文作者:Yong Cui, Ph.D.譯文出自:掘金翻譯計(jì)劃本文永久鏈接:github.com/xitu/gold-m…譯者:samyu2000校對(duì)者:luochen1992,shixi-li

Python 列表推導(dǎo)式并不是給初學(xué)者用的,因?yàn)樗浅7粗庇X(jué),甚至對(duì)于有其他編程語(yǔ)言背景的人也是如此。

我們接觸到 List 的使用時(shí),學(xué)習(xí)的內(nèi)容都是零散的。所以我們?nèi)鄙僖粋€(gè)關(guān)于如何在各種各樣的場(chǎng)景下使用 List 的知識(shí)體系。

本文提供了一些 List 的使用指南,盡可能涵蓋各個(gè)方面。希望本文可以成為你的一站式實(shí)用手冊(cè)。

使用建議

1.建議使用迭代的方式

使用 List 最基本的方式是以一個(gè)可迭代對(duì)象為基礎(chǔ),創(chuàng)建一個(gè) List 對(duì)象,這個(gè)可迭代對(duì)象可以是任意可以迭代元素的Python對(duì)象。使用方法如下。

[expression for item in iterable]

下面這段代碼展示了一個(gè)使用列表相關(guān)技術(shù)創(chuàng)建 List 對(duì)象的例子。在這個(gè)例子中,我們定義了一個(gè) Integer 列表,并基于這個(gè)對(duì)象創(chuàng)建了保存每個(gè)數(shù)字的平方數(shù)和立方數(shù)的 List 對(duì)象。

>>> # 創(chuàng)建一個(gè) Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 創(chuàng)建平方數(shù)和立方數(shù)列表>>> powers = [(x*x, pow(x, 3)) for x in integers]>>> print(powers)[(1, 1), (4, 8), (9, 27), (16, 64), (25, 125), (36, 216)]

上面的例子把 List 對(duì)象當(dāng)作迭代器使用。我們應(yīng)該知道,許多類型的對(duì)象也是可迭代的,比如 List、Set、Dictionary 和 String 等等。其他數(shù)據(jù)類型,像 range、map、filter,以及 pandas 包中的 Series、DataFrame,都是可迭代的。下面的代碼演示了某些對(duì)象的使用方法。

>>> # 使用 range 對(duì)象>>> integer_range = range(5)>>> [x*x for x in integer_range][0, 1, 4, 9, 16]>>> # 使用 Series 對(duì)象 >>> import pandas as pd>>> pd_series = pd.Series(range(5))>>> print(pd_series)0 01 12 23 34 4dtype: int64>>> [x*x for x in pd_series][0, 1, 4, 9, 16]

2.如果只需用到其中的某些元素,應(yīng)當(dāng)使用條件判斷語(yǔ)句

假設(shè)你需要將符合某種條件的元素歸集起來(lái),并創(chuàng)建一個(gè) list。下面展示了相關(guān)的語(yǔ)法。

[expression for item in iterable if condition]

if 語(yǔ)句用來(lái)實(shí)現(xiàn)條件判斷。下面的代碼展示了這種用法的一個(gè)簡(jiǎn)單示例。

>>> # 同樣創(chuàng)建一個(gè) Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 篩選出偶數(shù),創(chuàng)建一個(gè)這些偶數(shù)的平方數(shù)列表>>> squares_of_evens = [x*x for x in integers if x % 2 == 0]>>> print((squares_of_evens))[4, 16, 36]

3.使用條件判斷語(yǔ)句

List 對(duì)象中還可以使用 if-else 形式的條件判斷,語(yǔ)法如下。

[expression0 if condition else expression1 for item in iterable]

這跟前面的那種用法有些類似,別把這兩種用法混淆。在本例中,條件語(yǔ)句本身是一個(gè)整體。下面的代碼提供了一個(gè)例子。

>>> # 創(chuàng)建一個(gè) Integer 列表>>> integers = [1, 2, 3, 4, 5, 6]>>> # 遍歷 integers 中的元素,如果是偶數(shù),取平方數(shù)存入新的列表>>> # 如果是奇數(shù),取立方數(shù)存入新的列表>>> custom_powers = [x*x if x % 2 == 0 else pow(x, 3) for x in integers]>>> print(custom_powers)[1, 4, 27, 16, 125, 36]

4.如果有嵌套結(jié)構(gòu),可以使用嵌套的循環(huán)

有可能可迭代對(duì)象中的元素自身也是可迭代的,盡管這種情況不太常見(jiàn)。如果你對(duì)嵌套的可迭代對(duì)象有興趣,可以使用 for 來(lái)實(shí)現(xiàn)循環(huán)嵌套。語(yǔ)法如下。

[expression for item_outer in iterable for item_inner in item_outer]# 與下面的代碼等同for item_outer in iterable: for item_inner in item_outer: expression

上面的代碼展示了使用for實(shí)現(xiàn)嵌套循環(huán)的例子。

>>> # 創(chuàng)建一個(gè)包含元組的列表>>> prices = [(’$5.99’, ’$4.99’), (’$3.5’, ’$4.5’)]>>> # 獲取元組中的每個(gè)價(jià)格,以此創(chuàng)建一個(gè)一維列表>>> prices_formatted = [float(x[1:]) for price_group in prices for x in price_group]>>> print(prices_formatted)[5.99, 4.99, 3.5, 4.5]

5.替換高階函數(shù)

有的人比較習(xí)慣函數(shù)式編程,比如使用高階函數(shù)也是這種習(xí)慣的表現(xiàn)之一。特別說(shuō)明一下,高階函數(shù)是那些需要使用輸入或輸出參數(shù)的函數(shù)。在 Python 中,常用的高階函數(shù)有 map() 和 filter()。

>>> # 創(chuàng)建一個(gè) integer 類型的列表>>> integers = [1, 2, 3, 4, 5]>>> # 使用 map 創(chuàng)建平方數(shù)列表>>> squares_mapped = list(map(lambda x: x*x, integers))>>> squares_mapped[1, 4, 9, 16, 25]>>> # 使用列表推導(dǎo)式創(chuàng)建平方數(shù)列表>>> squares_listcomp = [x*x for x in integers]>>> squares_listcomp[1, 4, 9, 16, 25]>>> # 使用 filter 取得 integers 中的偶數(shù)列表>>> filtered_filter = list(filter(lambda x: x % 2 == 0, integers))>>> filtered_filter[2, 4]>>> # 使用列表推導(dǎo)式取得 integers 中的偶數(shù)列表>>> filterd_listcomp = [x for x in integers if x % 2 == 0]>>> filterd_listcomp[2, 4]

從上面的例子可以看出,使用 list 的某些特性比使用高階函數(shù)更具有可讀性,而且也能實(shí)現(xiàn)較復(fù)雜的嵌套結(jié)構(gòu)。

使用禁忌

1.不要忘了定義構(gòu)造函數(shù)

有人認(rèn)為列表推導(dǎo)式很酷炫,是 Python 特有的功能,所以為了炫耀自己的 Python 水平,即使有更好替代方案也要使用它。

>>> # 使用 range 創(chuàng)建列表對(duì)象>>> numbers = [x for x in range(5)]>>> print(numbers)[0, 1, 2, 3, 4]>>> # 以一個(gè)字符串為基礎(chǔ),創(chuàng)建一個(gè)小寫字母的字符列表>>> letters = [x.lower() for x in ’Smith’]>>> print(letters)[’s’, ’m’, ’i’, ’t’, ’h’]

上述例子中,我們使用了 range 和 string,這兩種數(shù)據(jù)結(jié)構(gòu)都是可迭代的,list()構(gòu)造函數(shù)可以直接使用 iterable 創(chuàng)建一個(gè) list 對(duì)象。下面的代碼提供了更合理的解決方案。

>>> # 使用 range 創(chuàng)建列表對(duì)象>>> numbers = list(range(5))>>> print(numbers)[0, 1, 2, 3, 4]>>> # 以一個(gè)字符串為基礎(chǔ),創(chuàng)建一個(gè)小寫字母的字符列表>>> letters = list(’Smith’.lower())>>> print(letters)[’s’, ’m’, ’i’, ’t’, ’h’]

2.不要忘了生成器表達(dá)式

在 Python 中,生成器是一種特殊的可迭代對(duì)象,它會(huì)延遲加載元素,直到被請(qǐng)求才會(huì)加載。這在處理大量數(shù)據(jù)時(shí)會(huì)非常高效,它能提升存儲(chǔ)效率。相比之下,list 對(duì)象為了方便計(jì)數(shù)和索引,一次性創(chuàng)建所有的元素。所以跟生成器相比,在元素個(gè)數(shù)相同時(shí),list 需要占用更多內(nèi)存。

我們可以定義一個(gè)生成器函數(shù)來(lái)創(chuàng)建生成器。我們也可以使用下面的語(yǔ)句來(lái)創(chuàng)建生成器,這是一種稱為生成器表達(dá)式的方法。

(expression for item in iterable)

你可能會(huì)注意到,除了使用圓括號(hào)外,它的語(yǔ)法跟使用 list 的語(yǔ)句很相似。所以需要注意區(qū)分。

考慮下面這個(gè)例子。我們要計(jì)算前一百萬(wàn)個(gè)數(shù)字的平方和。如果使用 list 來(lái)實(shí)現(xiàn),方法如下。

>>> # 創(chuàng)建列表對(duì)象 squares >>> squares = [x*x for x in range(10_000_000)]>>> # 計(jì)算它們的總和>>> sum(squares)333333283333335000000>>> squares.__sizeof__()81528032

跟使用 list 相比,使用 generator 內(nèi)存開(kāi)銷小得多,只有 96 字節(jié)。原因很簡(jiǎn)單———— generator 不需要獲取所有的元素。相反,它只需要獲取各個(gè)元素在序列中的位置,創(chuàng)建下一個(gè)元素并呈現(xiàn)它,而且不必保存在內(nèi)存中。

結(jié)論

本文中,我們整理了 list 應(yīng)用的一些關(guān)鍵要領(lǐng)。這些該做的和不該做的都非常清晰明了。我估計(jì)你會(huì)在合適的場(chǎng)景中用到它。下面是本文內(nèi)容的小結(jié)。

使用迭代的方式。 Python 中有許多類型的 iterable,你應(yīng)當(dāng)在掌握基礎(chǔ)(list 和 tuple)的同時(shí)融會(huì)貫通。 使用條件判斷語(yǔ)句。 如果你對(duì)在 iterable 中篩選某些元素感興趣,可以多多研究條件判斷。 使用條件判斷表達(dá)式。 如果你需要有選擇性地獲取某些數(shù)據(jù),可以使用條件判斷表達(dá)式。 使用嵌套的循環(huán)。 如果你要處理嵌套的 iterable,可以使用嵌套的循環(huán)結(jié)構(gòu)。 用 list 替代高階函數(shù) 在很多情況下,可以用 list 替代高階函數(shù)。 不要忘記 list 的構(gòu)造函數(shù) 定義 list 的構(gòu)造函數(shù),可以使用 iterable 創(chuàng)建一個(gè) list 對(duì)象。如果你直接使用 iterable,推薦用這個(gè)方法。 不要忘了生成器表達(dá)式 它的語(yǔ)法與 list 中的語(yǔ)法相似。在處理大量的對(duì)象時(shí),這是一種節(jié)省內(nèi)存開(kāi)銷的辦法。list 和 generator 不同的是,為了日后的索引和訪問(wèn), list 必須提前創(chuàng)建,如果元素個(gè)數(shù)很多,就會(huì)消耗很大的內(nèi)存。

以上就是Python 列表推導(dǎo)式需要注意的地方的詳細(xì)內(nèi)容,更多關(guān)于Python 列表推導(dǎo)式的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产va在线视频| 99xxxx成人网| 激情综合在线| 桃色一区二区| 一区二区精品伦理...| 国语精品一区| 国产精品最新| 精品国产欧美日韩一区二区三区| 欧美日韩网址| 久久亚洲精精品中文字幕| 国产精品视频一区视频二区| 亚洲日产国产精品| 亚洲精品美女91| 国产精品一级| 日韩av影院| 国产精品成人自拍| 精品国产欧美日韩| 私拍精品福利视频在线一区| 欧美日韩中文一区二区| 视频在线在亚洲| 欧美视频精品全部免费观看| 国产高潮在线| 91视频一区| 亚洲特色特黄| 国产亚洲精品美女久久| 日韩网站中文字幕| 日本h片久久| 性欧美69xoxoxoxo| 久久精品xxxxx| 亚洲精品系列| 在线精品亚洲欧美日韩国产| 亚洲欧美日韩在线观看a三区| 国产日韩中文在线中文字幕| 久久久水蜜桃av免费网站| 亚洲精品一区二区妖精| 91九色综合| 久久婷婷av| 国产欧美日韩精品一区二区免费| 女人天堂亚洲aⅴ在线观看| 开心激情综合| 日韩不卡在线观看日韩不卡视频 | 国产精品v日韩精品v欧美精品网站 | 国产亚洲精品久久久久婷婷瑜伽| 亚洲激情婷婷| 国产精品欧美三级在线观看 | 欧美日韩一区二区国产| 欧美日韩亚洲在线观看| 国产精品一区二区三区四区在线观看 | 中文字幕成人| 久久久久.com| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲精品影院在线观看| 久久久久99| 97在线精品| 精品国产亚洲一区二区三区大结局| 国产99精品| 亚洲综合电影| 国产尤物精品| 亚洲一区资源| 日本在线啊啊| av免费不卡国产观看| 久久av免费| 国产精品最新自拍| 亚洲精品无吗| 亚洲精品少妇| 欧美一区在线观看视频| 日韩精品乱码av一区二区| 日韩午夜视频在线| 91精品国产自产观看在线| 综合精品一区| 亚洲黄页一区| 日韩有码av| 玖玖玖国产精品| 亚洲狼人精品一区二区三区| 日韩中文字幕亚洲一区二区va在线| 亚洲性图久久| 视频一区二区不卡| 99亚洲视频| 日韩三级精品| 国产精品亚洲片在线播放| 精品一区二区三区在线观看视频 | 香蕉精品999视频一区二区| 美女毛片一区二区三区四区 | 美女网站一区| 亚洲精品激情| 国产精品亚洲综合久久| 成人在线超碰| 亚洲欧美日韩视频二区| 日韩有吗在线观看| 国产精品久久久久9999高清| 久久99精品久久久久久园产越南| 国产情侣一区| 亚洲成a人片| 偷拍亚洲精品| 捆绑调教美女网站视频一区| 久久青青视频| 免费毛片在线不卡| 久久xxxx精品视频| 高清一区二区| 亚洲精品美女91| 国产精品久久久久久久久久10秀 | 国产一区二区三区天码| 日韩午夜黄色| 成人污污视频| 日韩av影院| 99香蕉国产精品偷在线观看 | 日韩美女一区二区三区在线观看| 亚洲在线一区| 超级白嫩亚洲国产第一| 中文字幕日本一区| 99久久视频| 成人午夜在线| 亚洲+小说+欧美+激情+另类| 欧美天堂一区| 夜夜嗨一区二区| 国产免费av国片精品草莓男男| 亚洲午夜精品久久久久久app| 国产精品宾馆| 亚洲精品福利| 日韩视频一区| 欧美一区二区性| 国产精品jk白丝蜜臀av小说| 亚洲综合二区| 麻豆精品91| 欧美日韩国产高清电影| 日韩免费小视频| 国产成年精品| 日本va欧美va精品发布| 国产亚洲激情| 黄色日韩在线| 亚洲综合精品四区| 蜜臀国产一区二区三区在线播放| 蜜臀av免费一区二区三区| 给我免费播放日韩视频| 久久精品色播| 日韩欧美视频专区| 亚洲免费资源| 国产日韩欧美在线播放不卡| 日韩中文字幕无砖| 日本不卡的三区四区五区| 亚洲国产一区二区三区在线播放| 精品中文在线| а√天堂8资源在线| 一本大道色婷婷在线| 日韩在线短视频| 亚洲va中文在线播放免费| 欧美成a人国产精品高清乱码在线观看片在线观看久| 国产欧美日韩精品高清二区综合区 | 91久久中文| 欧美三区四区| 午夜久久福利| 亚洲v天堂v手机在线| 日本成人手机在线| 国产精品videosex极品| 日本在线高清| 久久成人国产| 精品国产午夜肉伦伦影院| 日本免费一区二区三区四区| 亚洲免费激情| 亚洲综合国产| 精品视频一区二区三区在线观看 | 欧美色综合网| 久久久精品网| 久久av超碰| 蜜臀国产一区二区三区在线播放| 日韩欧美精品一区二区综合视频| 精品视频亚洲| 日韩高清不卡一区二区| av亚洲一区二区三区| 日本不卡高清| 国产一区二区三区日韩精品| 麻豆久久久久久| 青青久久av| 日本精品一区二区三区在线观看视频| 国产在线一区不卡| 日韩精品福利一区二区三区| 高清一区二区| 国产欧美一区二区三区精品观看 | 日本少妇一区二区| 不卡视频在线| 国产精品嫩模av在线| 九色porny丨国产首页在线| 日本麻豆一区二区三区视频| 午夜国产精品视频免费体验区| 久久婷婷国产| 亚洲一区欧美激情| 婷婷综合网站| 免费福利视频一区二区三区| 日韩av一级片| 日精品一区二区三区| 在线亚洲免费| 欧美美女一区| 日韩精品国产精品| 91成人精品视频| 久久精品亚洲欧美日韩精品中文字幕| 国产精品草草| 精品五月天堂| 夜鲁夜鲁夜鲁视频在线播放| 亚洲日本网址| 亚洲大全视频|