Python學習筆記(六)Python的列表生成式、生成器

来源:http://www.cnblogs.com/lixiangnotes/archive/2016/04/07/5362543.html
-Advertisement-
Play Games

列表生成式 List Comprehensions 列表生成式是Python內置的非常簡單卻強大的可以用來創建list的生成式。 簡單的數值範圍的list可以使用一下方式生成: 稍微複雜的可以利用list生成式: 迴圈後面還可以加上if判斷,例如僅篩選出偶數的平方: 使用兩層迴圈可以生成全排列: 生 ...


列表生成式

List Comprehensions 列表生成式是Python內置的非常簡單卻強大的可以用來創建list的生成式。
簡單的數值範圍的list可以使用一下方式生成:

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

稍微複雜的可以利用list生成式:

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

迴圈後面還可以加上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']

生成器

生成器(generator)是一種一邊迴圈一邊計算的機制。
生成器的應用場景:只需要獲得list中的前幾個元素,節省存儲空間;需要的list不完全遵守一定的規則時。
創建生成器的幾種方式:

類似列表生成式的方式

只要把列表生成式的[]改成(),就創建了一個generator,如下所示:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

g是一個generator,不可以直接獲得值,可以通過next()函數獲得generator的下一個返回值,沒有跟多元素時,拋出StopIteration的錯誤。
另一種獲得generator值得方式:因為generator是可迭代對象,更好的方式是通過使用for迴圈來獲得其值,這種方式不用關心StopIteration的錯誤。使用方式如下:

>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)
... 
0
1
4
9
16
25
36
49
64
81

如果推算的演算法比較複雜,用類似列表生成式的for迴圈無法實現時,還可以使用函數來實現。
比如著名的斐波拉契數列,出第一個和第二個數外,任意一個數都可以由前兩個數相加得到:

1,1,2,3,5,8,13,21,34,...

該數列使用列表生成式無法實現,使用函數的實現方式如下:

def fib(max):
       n, a, b = 0, 0, 1
       while n < max:
              print(b)
              a, b = b, a+b
              n = n + 1
        return 'done'

要把fib函數變成generator,只需要把print(b)改為yield b就可以了:

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

generator與函數執行流程的差異:函數是順序執行,遇到return語句或者最後一行函數語句就返回;而generator函數每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
如果想要拿到函數中的返回值,必須捕獲StopIteration錯誤,返回值包含在StopIteration的value中:

>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
...     except StopIteration as e:
...         print('Generator return value:', e.value)
...         break

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查找了msdn上關於bool的介紹,整理如下: bool 關鍵字是 System.Boolean 的別名。它用於聲明變數來存儲布爾值 true 和 false。 如果需要一個也可以有 null 值的布爾型變數,請使用 bool?。 bool 變數的預設值為 false。bool? 變數的預設值為 n ...
  • ...
  • ...
  • 在採用了依賴註入的應用中,我們總是直接利用DI容器直接獲取所需的服務實例,換句話說,DI容器起到了一個服務提供者的角色,它能夠根據我們提供的服務描述信息提供一個可用的服務對象。ASP.NET Core中的DI容器體現為一個實現了IServiceProvider介面的對象。 一、ServiceProv... ...
  • HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服務端組件、客戶端組件和 Agent 組件,廣泛適用於各種不同應用場景的 TCP/UDP 通信系統,提供 C/C++、C#、Delphi、E(易語言)、Java、Python 等編程語言介面。HP-Socket 對通信層實現完全封 ...
  • 前兩天給同事做 code review,感覺自己對 Java 的 Generics 掌握得不夠好,便拿出 《Effective Java》1 這本書再看看相關的章節。在 Item 24:Eliminate unchecked warnings 這一節中,作者拿 ArrayList 類中的 publi ...
  • XML概述 XML概述 XML的歷史背景 XML的歷史背景 GML(1969):通用標記語言 IBM公司的一些專家們一起研究的一個課題: 軟體必須有高度的可移植性,而且必須有一個統一的標準。為了實現軟體的一處編寫多處運行這個願景所誕生。 SGML(1985):專家們對GML升級,標準的通用標記語言。 ...
  • 輸出空心的菱形圖案,這在等級考試與公司面試時也出現過類似題目,本範例的目的在於熟練掌握 for 迴圈的嵌套使用。 創建 Diamond 類,在該類的主方法中調用 printHollowRhombus() 方法完成 10 行的空心菱形輸出。其中 printHollowRhombus() 方法是在範例中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...