當前位置:首頁 » 編程語言 » python列表生成器if

python列表生成器if

發布時間: 2024-09-30 20:41:46

python列表生成器的循環技巧分享

Python列表生成器的循環技巧分享
這篇文章主要介紹了Python列表生成器的循環技巧分享,本文講解了列表生成器中一個循環和二個循環的不同寫法,需要的朋友可以參考下
列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式。
一個循環
在C語言等其他語言中,for循環一般是這樣的
如果python也這么寫,那麼真該看下python的基礎教程了~
但要注意的是,需要加一個[]來,否則會報錯...

在上面的例子中,不僅可以嵌套for,甚至可以嵌套if語句
再看看,原來是什麼樣子

兩個循環呢?
原來可能是這樣的?

現在可以這樣了!!!

Ⅱ 浠涔堟槸Python涓鐨勭敓鎴愬櫒鎺ㄥ煎紡

Python涓鏈変竴縐嶇揣鍑戠殑璇娉曪紝鍙浠ラ氳繃涓涓寰鐜鍜屾潯浠舵瀯寤轟竴涓鍒楄〃錛岃繖縐嶈娉曞彨鍋氬垪琛ㄦ帹瀵煎紡錛坙ist comprehension錛夛細 my_list = [ f(x) for x in sequence if cond(x) ] 綾諱技鍦幫紝鎴戜滑鍙浠ラ氳繃瀛楀吀鎺ㄥ煎紡

Python涓鏈変竴縐嶇揣鍑戠殑璇娉曪紝鍙浠ラ氳繃涓涓寰鐜鍜屾潯浠舵瀯寤轟竴涓鍒楄〃錛岃繖縐嶈娉曞彨鍋氬垪琛ㄦ帹瀵煎紡錛坙ist comprehension錛夛細
my_list = [ f(x) for x in sequence if cond(x) ]

綾諱技鍦幫紝鎴戜滑鍙浠ラ氳繃瀛楀吀鎺ㄥ煎紡錛坉ictionary comprehension錛夊壋寤哄瓧鍏革紝閫氳繃闆嗗悎鎺ㄥ煎紡錛坰et comprehension錛夊壋寤洪泦鍚堬細
my_dict = { k(x): v(x) for x in sequence if cond(x) }
my_set = { f(x) for x in sequence if cond(x) }

錛堣繖涓璇娉曟敮鎸佹洿鍔犲嶆潅鐨勬搷浣滐紝浣嗚繖閲屼粎浣滅ず渚嬶級
鏈鍚庯紝浣犺繕鍙浠ヤ嬌鐢ㄧ被浼肩殑璇娉曞壋寤轟竴涓鐢熸垚鍣錛
my_generator = ( f(x) for x in sequence if cond(x) )

涓嶈繃錛岃繖騫朵笉鍙鍋氱敓鎴愬櫒鎺ㄥ煎紡錛岃屾槸鍙鍋氱敓鎴愬櫒琛ㄨ揪寮忥紙generator expression錛夈備負浠涔堜笉鍙鍓嶈呭憿錛熷傛灉鍓嶄笁涓璇娉曢兘琚縐頒負鈥滄帹瀵煎紡鈥濓紝涓轟粈涔堢敓鎴愬櫒榪欎釜涓嶅彨鍛錛
PEP 289 鈥斺 鐢熸垚鍣ㄨ〃杈懼紡 鐨勬渶鍚庣粰鍑轟簡璇︾粏鐨勫囨敞錛屽叾涓鎸囧嚭Raymond Hettinger璧峰垵鎻愯浣跨敤鈥滅敓鎴愬櫒鎺ㄥ煎紡錛坓enerator comprehension錛夆濅竴璇嶏紝鍚庢潵Peter Norvig鎻愬嚭浜嗏滅瘡璁℃樉紺猴紙accumulation displays錛夆濓紝鍚庢潵Tim Peters鎺ㄨ崘浜嗏滅敓鎴愬櫒琛ㄨ揪寮忊濊繖涓
鍚嶈瘝銆備絾鏄瀹冨苟娌℃湁鍚嶈瘝鍑虹幇浜嗚繖鏍風殑鍙樺寲銆
EarlGrey錛氫笂闈㈡彁鍒扮殑榪欏嚑浣嶉兘鏄澶х墰鍟婏紒鍏蜂綋澶у跺彲浠ヨ胺姝屼竴涓嬨
鎵浠ユ垜鍦═witter涓婃彁鍑轟簡榪欎釜闂棰橈細
python 鏈変釜鎴戜笉鎳傜殑闂棰橈細涓轟粈涔堝畠浠琚縐頒負鈥滅敓鎴愬櫒琛ㄨ揪寮忊濓紝鑰屼笉鏄鈥滅敓鎴愬櫒鎺ㄥ煎紡鈥濓紵
Guido鐨勫洖絳旀寚鍑轟簡鏍稿績鍘熷洜錛
鎺ㄥ煎紡涓寮濮嬪睘浜庘滃瓧闈㈤噺鏄劇ず錛坙iteral display錛夆濊繖涓姒傚康銆傝岀敓鎴愬櫒琛ㄨ揪寮忎笉鏄涓縐嶆樉紺猴紙display錛夈
Matt Boehm鍚庢潵鎵懼埌浜員im Peters鎻愬嚭鈥滅敓鎴愬櫒琛ㄨ揪寮忊濅竴璇嶇殑閭浠訛紝鍏朵腑璁茶堪浜嗕竴浜涚粏鑺傦細
璇誨畬閭浠跺悗錛屾垜瀵硅繖涓闂棰樼殑鐞嗚В鏇存繁浜嗐傞栧厛錛屼負浠涔堜細浣跨敤鈥滄帹瀵煎紡鈥濓紙comprehension錛変竴璇嶏紵Tim鍦ㄩ偖浠朵腑鎸囧嚭錛岃繖涓璇嶆潵婧愪簬闆嗗悎璁轟腑鐨勬帹瀵煎叕鐞嗭紙Axiom of Comprehension錛夛紝瀹冩寚鐨勬槸閫氳繃瀵瑰彟涓涓闆嗗悎鐨勫厓緔犲簲鐢ㄦ煇涓璋撹瘝錛坧redicate錛屽嵆鏉
浠訛級鑰岀粍鎴愭柊鐨勯泦鍚堛傝繖鍜屽悜鍙︿竴涓搴忓垪涓鐨勫厓緔犲簲鐢ㄦ煇涓鏉′歡浠庤岀敓鎴愬垪琛ㄧ殑鍋氭硶闈炲父綾諱技銆
EarlGrey錛氭垜涔嬪墠鐪嬪埌寰堝氱炕璇戜負鈥滆В鏋愨濓紝鐪嬪埌榪欓噷鎵嶈夊緱鈥滄帹瀵煎紡鈥濇墠鏄鏇村噯紜鐨勮存硶銆
姝e侴uido鎵鎸囧嚭鐨勶紝Python鐨勮捐¤呭綋鏃舵洿娉ㄩ噸鐨勬槸鏄劇ず錛岃屼笉鏄鏉′歡銆傗滄樉紺衡濅竴璇嶅湪榪欓噷鎰忓懗鐫浠g爜鐨勮娉曠湅涓婂拰瀹冨皢鍒涘緩鐨勬暟鎹緇撴瀯寰堝儚銆傚垪琛ㄦ樉紺猴紙鍒楄〃鎺ㄥ煎紡錛夌湅涓婂幓鍍忎竴涓鍒楄〃銆傚逛簬闆嗗悎鍜屽瓧鍏告樉紺烘潵璇達紝涔熸槸涓鏍風殑閬撶悊銆備絾鏄鐢變簬娌℃湁鐢熸垚鍣
瀛楅潰閲忚娉曪紝鍥犳ゆ牴鏈灝辨病鏈変竴涓鐢熸垚鍣ㄦ樉紺哄彲浠ヨ繘琛屽規瘮錛屼篃灝變笉瀛樺湪鐢熸垚鍣ㄦ樉紺轟簡銆
鍦ㄨ捐¤ュ姛鑳界殑閭e皝閭浠朵腑錛屸滄帹瀵煎紡鈥濅竴嬈℃槸鈥滄樉紺衡濈殑鍚屼箟璇嶏紝鐢變簬鐢熸垚鍣ㄦ病鏈夋樉紺猴紝鎵浠ヤ篃涓嶅彲鑳芥湁鎺ㄥ煎紡銆
涓嶈繃Time鍦ㄤ粬鐨勯偖浠朵腑涔熻村埌錛屾帹瀵煎紡鐨勫囧欎箣澶勫湪浜庢潯浠躲傛帹瀵煎叕鐞嗙殑鏍稿績鍒欐槸璋撹銆備篃璁告槸鍥犱負Python鎺ㄥ煎紡涓鐨勬潯浠舵槸鍙閫夌殑錛屽叧娉ㄧ殑鐒︾偣琚杞縐誨埌浜嗘樉紺烘柟闈銆
浣嗘槸鎴戣や負錛屾垜浠搴旇ュ彨瀹冧滑鈥滅敓鎴愬櫒鎺ㄥ煎紡鈥濄傛垜浠鍦ㄦ弿榪拌繖綾昏娉曟椂錛屽苟娌℃湁浣跨敤鈥滄樉紺衡濅竴璇嶃傛垜浠娌℃湁鐞嗙敱灝嗏滄帹瀵煎紡鈥濅笌鈥滄樉紺衡濆拰瀛楅潰閲忚娉曡仈緋誨湪涓璧楓
鍒楄〃鎺ㄥ煎紡銆佸瓧鍏告帹瀵煎紡銆侀泦鍚堟帹瀵煎紡鍜岀敓鎴愬櫒琛ㄨ揪寮忥紝榪欏洓涓琛ㄨ揪寮忓悇鑷涔嬮棿鏈夌潃璁稿氱浉浼間箣澶勩傚傛灉灝嗗洓鑰呬箣闂寸殑綾諱技鐐規葷粨涓衡滄帹瀵煎紡鈥濓紝灝嗘瀬澶у湴綆鍖栫浉鍏蟲傚康銆傚畠浠涔嬮棿鐨勭浉浼肩偣榪滃ぇ浜庝笉鍚屼箣澶勶紝鎴戝緩璁澶у跺硅繖鍥涗釜琛ㄨ揪寮忎嬌鐢ㄥ悓鏍風殑姒傚康

Ⅲ python中for循環放在後面要怎麼理解

i因為閉包,lambda生成之後i引用的就是for循環中的i

建議你看一下python的列表生成器,

f = [(lambda n : i + n) for i in range(10)] 等同於

f=[]

for i in range(10)

f.append(lambda n : i + n)

下面是相關內容

列表生成式即List Comprehensions,是Python內置的非常簡單卻強大的可以用來創建list的生成式。

舉個例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):

>>> range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎麼做?方法一是循環:

>>> L = []>>> for x in range(1, 11):... L.append(x * x)
...>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

但是循環太繁瑣,而列表生成式則可以用一行語句代替循環生成上面的list:

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

寫列表生成式時,把要生成的元素x * x放到前面,後面跟for循環,就可以把list創建出來,十分有用,多寫幾次,很快就可以熟悉這種語法。

for循環後面還可以加上if判斷,這樣我們就可以篩選出僅偶數的平方:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

還可以使用兩層循環,可以生成全排列:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

三層和三層以上的循環就很少用到了。

運用列表生成式,可以寫出非常簡潔的代碼。例如,列出當前目錄下的所有文件和目錄名,可以通過一行代碼實現:

>>> import os # 導入os模塊,模塊的概念後面講到>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目錄['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']

for循環其實可以同時使用兩個甚至多個變數,比如dict的iteritems()可以同時迭代key和value:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> for k, v in d.iteritems():... print k, '=', v... y = B
x = A
z = C

因此,列表生成式也可以使用兩個變數來生成list:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }>>> [k + '=' + v for k, v in d.iteritems()]
['y=B', 'x=A', 'z=C']

最後把一個list中所有的字元串變成小寫:

>>> L = ['Hello', 'World', 'IBM', 'Apple']>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']

小結

運用列表生成式,可以快速生成list,可以通過一個list推導出另一個list,而代碼卻十分簡潔。

思考:如果list中既包含字元串,又包含整數,由於非字元串類型沒有lower()方法,所以列表生成式會報錯:

>>> L = ['Hello', 'World', 18, 'Apple', None]
>>> [s.lower() for s in L]
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>AttributeError: 'int' object has no attribute 'lower'

使用內建的isinstance函數可以判斷一個變數是不是字元串:

>>> x = 'abc'>>> y = 123>>> isinstance(x, str)True>>> isinstance(y, str)False

請修改列表生成式,通過添加if語句保證列表生成式能正確地執行。

Ⅳ Python中列表生成式和生成器的區別

列表生成式語法:

[x*x for x in range(0,10)] //列表生成式,這里是中括弧
//結果 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
(x*x for x in range(0,10)) //生成器, 這里是小括弧
//結果 <generator object <genexpr> at 0x7f0b072e6140>

二者的區別很明顯:
一個直接返回了表達式的結果列表, 而另一個是一個對象,該對象包含了對表達式結果的計算引用, 通過循環可以直接輸出

g = (x*x for x in range(0,10))
for n in g:
print n

結果

0
1
4
9
16
25
36
49
64
81

當表達式的結果數量較少的時候, 使用列表生成式還好, 一旦數量級過大, 那麼列表生成式就會佔用很大的內存,
而生成器並不是立即把結果寫入內存, 而是保存的一種計算方式, 通過不斷的獲取, 可以獲取到相應的位置的值,所以佔用的內存僅僅是對計算對象的保存

Ⅳ Python中列表生成器的使用

在Python中,列表生成器與列表推導式是構建高效大列表的工具。列表生成器尤其適用於元素眾多且內存佔用敏感的場景。它們通過不同的方法實現,但核心在於節省內存消耗。這里有兩種主要的使用方式:直接創建和自定義函數。

直接創建列表生成器,其語法與列表推導式類似,只是使用圓括弧()代替方括弧[]。例如,代碼`ge1 = (i**2 for i in range(10))`就定義了一個生成器,它不立即生成所有數據,而是在需要時逐個產生。

使用時,列表生成器更像是一個「惰性」數據源,可以使用`next()`方法或for循環動態生成數據。比如,`print(next(ge1))`將依次輸出0到9的平方。但要注意,`next()`只能向前產生,用完即止,再次調用會報錯。

自定義函數也是一種創建列表生成器的方式,通過`yield`關鍵字返回結果。例如,`ge2 = f(i**2 for i in range(10))`,`f()`函數生成的是一個平方數序列。

列表生成器與列表推導式的關鍵區別在於內存使用:列表推導式在創建時就生成所有數據,佔用內存;而列表生成器則按需生成,節省內存。如在PyCharm中,對比ge1(生成器)與co1(推導式)變數,可以看到後者包含了所有數據,而前者在未調用前幾乎不佔內存。

因此,當處理大型數據集時,列表生成器是內存管理的明智選擇。

Ⅵ Python怎麼設置條件表達式會提高效率

1.把range全部換成xrange
2.生成器,如 list=(item for item in fp)
3.利用psyco庫,提高函數和類的運行效率。
4.字元串拼接:盡量少用「+」的方式,而採用''.join ,還有"%s"%i這樣賦值的手段
5.函數的開銷很大。盡量把循環放在函數內進行。而不要讓每次迭代都調用函數。
6.「前提工作」先做好,比如該賦值,該拼接的,然後再引入到函數中,或者進行下面的循環。
7.盡量使用內置方法,因為內置的是C寫的,效率肯定高很多
8.每當要對序列中的內容進行循環處理時,就應當嘗試用列表解析來代替它,如:[i for i in xrang(10) if i%2==0]
9.學會使用itertools模塊。當python中添加了迭代器後,就為常見模式提供了一個新的模塊,因為它是以C語言編寫,所以提供了最高效的迭代器。
--多記錄一些。列表,字元串,字典,xrange,類文件對象,這些都是可迭代對象,換句話說,都可以直接用在for循環中進行迭代,如for item in open('1.txt')
--直接使用速度會快。另外,我對比了itertools里工具和xrange,比如都循環100000次列印數字,使用islice(count(),100000)均要比xrange(100000)快
--而xrange還要比range快。
10.用列表解析取代for循環。列表解析的效率等於或高於map。
11.垃圾回收機制,會對列表的操作有重大影響,如列表的append,或者列表解析。import gc,然後在數據載入模塊前gc.disable(),結束後再gc.enable()。

熱點內容
javaurl的正則表達式 發布:2024-11-24 15:53:45 瀏覽:245
c語言只可以執行編譯文件 發布:2024-11-24 15:53:33 瀏覽:756
126郵件伺服器地址 發布:2024-11-24 15:52:46 瀏覽:214
微信80安卓什麼時候更新動態 發布:2024-11-24 15:40:54 瀏覽:480
破天窩窩腳本 發布:2024-11-24 15:40:53 瀏覽:112
王者榮耀蘋果轉安卓怎麼轉的 發布:2024-11-24 15:40:49 瀏覽:677
取消win10開機密碼怎麼設置 發布:2024-11-24 15:26:03 瀏覽:796
編譯原理for循環三地址碼 發布:2024-11-24 15:16:44 瀏覽:201
php2048 發布:2024-11-24 15:14:49 瀏覽:894
php旋轉圖片 發布:2024-11-24 15:03:48 瀏覽:534