成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python入門必備:細講Python推導式

開發 前端
在Python中有一種更高效更簡潔的處理序列方式——推導式,本文詳細探討關于推導式的細節。

由于Python的良好生態,很多時候我們的程序只是通過調用別人寫好的方法即可實現功能。

不過,很多時候我們還是需要處理序列。不管是入門中還是早已入門的小伙伴,對于處理序列毫無疑問會選擇用for循環。但在Python中還有一種更高效更簡潔的處理序列方式——推導式。本文詳細探討關于推導式的細節。

 for循環有啥不好,非要學推導式? 

我們來看一個例子,如何把一個數值列表中大于0的數值篩選出來。下圖給出for循環的做法

可以看到for循環還是妥妥地把問題解決,代碼并不復雜。

分析代碼與原問題的表達對應關系:

  • 行5,表達從數值列表取出數值。
  • 行6,表達"大于0的數值篩選出來"
  • 但原問題沒有提及到創建一個用于保存結果的列表和如何把結果加入結果列表。
  • 上面的代碼中的行4與行7,都是多余的動作。

 是時候讓推導式出場了 

上圖是一種比較"官方"的寫法,把整個推導式寫到一行里,我更喜歡下圖的寫法。

這就是列表推導式,很簡單吧。看起來其實與之前的for循環寫法差不多。但推導式有以下好處::

  • 不需要像for循環那樣,先定義一個列表,然后在循環中編寫如何把結果放入列表的代碼。
  • 表達更為清晰了,推導式的每個部分都與原問題的表達一一對應。
  • 行15,表達了 我要把什么樣的東西放入結果中,這里只有一個n,表示符合要求的數值。
  • 行16與行17與之前for循環分析是一致。注意看,這里不再需要寫冒號了。
  • 推導式的外面用一個[]包圍著,表示結果是一個列表。
  • 推導式的性能更好。在序列的數據量不大的情況下推導式的性能優勢不會太明顯,如果序列的元素數量成千上萬,那么推導式比for形式性能通常優勝2倍以上。

 通過對比學習推導式 

覺得怎么樣,推導式是不是語義表達好的同時性能又高呢。下面通過與for循環形式對比來學習推導式的寫法。

圖中左邊是for循環,右邊是推導式:

紅框部分表示遍歷序列,可以看到兩者形式一樣,但注意,推導式不需要在最后寫冒號:

同樣地,上圖紅框表示如何判斷每個元素,這里表示過濾的條件。

我們可以寫各種各樣復雜的判斷條件。

上圖紅框是推導式最后一部分,他決定了輸出結果

比如說,如果希望每個輸出值是原來的兩倍,我們就可以寫 n*2

結果可以是各種各樣的類型,比如紅框部分如果寫 f'值:{n}',那么結果就是一系列的字符串。

更進一步 

我們來看一個稍微復雜點的例子。

假設我們有多個文件,每個文件都有多行數值(都是整數),行數不確定。如圖:

現在需要把多個這樣的文件的所有數值拿出來,然后把小于50的數值篩選出來作為結果,并且標注每個數值的來源文件。

下圖是基本數據的定義:

方法 get_nums_from_file 不是這里的重點,我們只需要知道,給他一個文本路徑,他會讀取文件中的每行的整數,以返回一個整數列表

這個問題可以描述為"列表中的元素還可以提取出一個列表",這樣的情況下同樣可以用推導式。如下:

  • 其實與普通的for循環嵌套是差不多的套路
  • 行38,首先遍歷paths列表
  • 行39,在上一個循環中獲取文件中的整數列表再次遍歷這個整數列表
  • 行40,對應原問題的篩選條件。
  • 行37,這里可以使用下方兩個for的變量f和n,因此可以輕而易舉找到每個數值的來源

有時候不應該強行使用推導式

我們很容易犯的一個錯誤是,手上拿著一個錘子,看啥都認為是釘子,更何況拿著的是一個雷神之錘。

推導式簡潔又高效的好處,很容易讓人著迷于使用他來解決一切的集合處理問題。我們接著上面的需求來說明。

現在需求不僅僅過濾小于50的數值,而是取出"小于所在文件的所有數值的平均",并且結果需要顯示該文件的平均值。

下面是推導式的解決方法:

推導式最大的問題在于無法在過程中建立臨時變量

這個需求下,由于沒法用臨時變量保存一個文件的平均值,因此導致多次求平均,不僅代碼結構亂,而且效率還很低。

這時候老老實實使用for循環是個很好的選擇。如下:

未來,推導式可能的進化 

Python的推導式其實來源于函數式編程中的思想,目前市面上的幾門面向對象編程語言都加入了相關方面的語法,未來Python的推導式可能會參考他們從而改進自身的推導式語法。如圖為C#的Linq,特點是他允許在過程中定義臨時變量。

可以看到,如果Python的推導式加入這樣的語法功能,那么本文說的推導式的缺點就不再出現。Python的推導式在未來的進化值得期待。

小結 

  • 在處理序列時,推導式是一個高效簡潔的方式
  • 當需求需要在循環中創建各種臨時的狀態數據時,推導式就不再適合處理。建議考慮使用for循環。

在Python中,推導式很多時候被當作是否熟悉Python的標志之一,同時推導式也存在許多爭議,我們應該清楚了解推導式再談如何應用,畢竟任何技術都必需在適當的地方才能發揮最大的作用。

你已經學會了推導式了嗎?平時使用for循環比較多還是推導式比較多?

責任編輯:趙寧寧 來源: 數據大宇宙
相關推薦

2024-11-28 07:00:00

Python列表推導式集合推導式

2021-03-02 09:35:33

Python循環開發

2010-01-25 15:15:46

Android傳值

2024-04-24 11:27:16

字典推導式Python

2024-05-20 12:00:00

Python列表推導式

2024-11-21 06:00:00

Python列表推導式

2024-05-20 08:30:00

Python編程

2021-03-03 12:55:30

Python列表推導式代碼

2022-10-08 15:32:24

Python開發技巧

2010-01-22 15:25:46

VB.NET Time

2024-02-21 20:43:02

Python列表推導式

2023-04-28 07:42:02

2024-12-17 09:00:00

lambda函數Python

2025-01-03 08:48:20

列表推導式Python編程

2010-06-10 16:20:37

BGP路由協議

2010-01-21 14:06:03

VB.NET MyCl

2024-04-30 15:05:36

Python接口自動化

2024-06-21 15:19:40

2024-10-28 17:06:50

2024-11-27 06:46:47

Python列表推導式嵌套邏輯
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品在线免费观看 | 日日夜夜免费精品视频 | 欧美成人在线网站 | 天天澡天天狠天天天做 | 国产亚洲一区二区三区在线 | 久久y| 成人网av| 国产精品综合久久 | 欧美成年视频 | 久久伊人免费视频 | 国产成人免费在线 | 毛片a级| 日韩中文字幕免费在线观看 | 国产精品123区 | 欧美一区二区在线观看 | 精品国产欧美一区二区 | 国产一区91精品张津瑜 | 国产成人免费视频 | 午夜精品久久久 | 久久久久一区二区三区 | 国产视频中文字幕在线观看 | 狠狠干网站 | 亚洲在线| av男人的天堂av | 91资源在线 | 久久久久午夜 | 在线中文字幕第一页 | 成人特区| 国产二区三区 | 国产成人精品视频在线观看 | 91精品在线播放 | 免费在线观看黄视频 | av网站在线看| 久久精品国产99国产精品亚洲 | 中文字幕一区二区三区精彩视频 | 国产成人精品一区二区三区视频 | 日日日操 | 91九色视频 | www.99re| 免费一二区 | 欧美午夜激情在线 |