1. 程式人生 > >深入理解Python中的生成器

深入理解Python中的生成器

生成器(generator)概念

生成器不會把結果儲存在一個系列中,而是儲存生成器的狀態,在每次進行迭代時返回一個值,直到遇到StopIteration異常結束。

生成器語法

生成器表示式: 通列表解析語法,只不過把列表解析的[]換成()
生成器表示式能做的事情列表解析基本都能處理,只不過在需要處理的序列比較大時,列表解析比較費記憶體。

Python
1234567891011>>>gen=(x**2forxinrange(5))>>>gen<generator object<genexpr
>at0x0000000002FB7B40>>>>forgingen:...print(g,end='-')...0-1-4-9-16->>>forxin[0,1,2,3,4,5]:...print(x,end='-')...0-1-2-3-4-5-

生成器函式: 在函式中如果出現了yield關鍵字,那麼該函式就不再是普通函式,而是生成器函式。

但是生成器函式可以生產一個無線的序列,這樣列表根本沒有辦法進行處理。

yield 的作用就是把一個函式變成一個 generator,帶有 yield 的函式不再是一個普通函式,Python 直譯器會將其視為一個 generator。

下面為一個可以無窮生產奇數的生成器函式。

Python
1 2 3 4 5 6 7 8 9 10 11 defodd(): n=1 whileTrue: yieldn n+=2 odd_num=odd() count=0 foroinodd_num: ifcount>=5:break print(o) count+=1

當然通過手動編寫迭代器可以實現類似的效果,只不過生成器更加直觀易懂

Python
12

相關推薦

深入理解Python生成器

生成器(generator)概念 生成器不會把結果儲存在一個系列中,而是儲存生成器的狀態,在每次進行迭代時返回一個值,直到遇到StopIteration異常結束。 生成器語法 生成器表示式: 通列表解析語法,只不過把列表解析的[]換成() 生成器表

深入理解python生成器表示式和列表解析

前言       沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python協程的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了協程,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說

深入理解 Python 的迭代

(點選上方公眾號,可快速關注)編譯: linux中國 / MjSeven  英文: Trey H

深入理解Python的replace方法

先討論一下它的用法: str = “abcdef” str.replace(old,new,[max])方法用於字串的修改,將字串str中的字元old替換為 新的new字串,max是可選引數,可以寫也可以不寫,不寫的情況下,表示將str中所

深入理解 Python 的裝飾器

function 問題 深入 工程 嵌套 tag 不同 class 完全   裝飾器本質上也是函數,接收函數對象來作為參數,並在裝飾器的內部來調用接受的函數對象完成相關的函數調用,也可以這樣理解 ,為了方便在幾個不同函數調用之前或者完成相關的統一操作,註意是完成統一的操

個人理解python生成器與迭代器

概念 可迭代物件:在python中,列表,元組,字典,字串這些可以用for迴圈遍歷的物件稱為可迭代物件。 迭代器:我們建立一個容器,該容器中可以生成一些資料,這些資料可以遍歷,該容器被我們稱為迭代器。 生成器:生成器為迭代器的一種,使用yield返回函式,每次呼叫yield函式程式都會暫

Python機器學習筆記:深入理解Keras序貫模型和函式模型

  先從sklearn說起吧,如果學習了sklearn的話,那麼學習Keras相對來說比較容易。為什麼這樣說呢?   我們首先比較一下sklearn的機器學習大致使用流程和Keras的大致使用流程: sklearn的機器學習使用流程: 1 2 3 4

深入理解python(一)python語法總結:基礎知識和對python物件的理解

用python也用了兩年了,趁這次疫情想好好整理下。 大概想法是先對python一些知識點進行總結,之後就是根據python核心原始碼來對python的實現方式進行學習,不會閱讀整個原始碼,,,但是應該會把資料結構的實現、函式呼叫過程、以及python虛擬機器的基本原理根據原始碼解釋下。 當然限於筆者只是一個

深入理解C++public、protected及private用法

strong ostream pro index nbsp contain table bsp 新的 深入理解C++中public、protected及private用法 投稿:shichen2014 字體:[增加 減小] 類型:轉載 時間:2014-08-23 我要評論

深入理解C++的Const,Mutable以及Volatile

private 結果 返回 成員變量 一個 del oid 深入 lock 我一直認為const表示一個常量,常量就是一個無法被修改的值,但是沒有深入理解const的實現,甚至不知道mutable和volatile的存在,最近在書中看到了這一部分的知識,所以本文將詳細解析

python生成器

語句 數列 while pytho spa ret yield col ner 1.簡介 通過列表生成式,我們可以直接創建一個列表,但是受到內存的限制,列表容量肯定是有限的。 如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢? 在Py

通過例子深入理解javascript的new操作符

not 而是 efi undefine new blog div 函數功能 成功 1.首先看一道題目 1 function Cat(name,age){ 2 this.name=name; 3 this.age=age; 4 } 5 console.l

Python生成器和叠代器的功能介紹

family line 介紹 mil auto 叠代器 常用 方法 lean 生成器和叠代器的功能介紹 1. 生成器(generator) 1. 賦值生成器 1. 創建 方法:x = (varia

JDK學習---深入理解java的String

test bound test6 -h 很多 lai 靈活性 圖形 會有 本文參考資料: 1、《深入理解jvm虛擬機》 2、《大話數據結構》、《大化設計模式》 3、http://www.cnblogs.com/ITtangtang/p/3976820.html#344102

深入理解 Java的 流 (Stream)

重要 抽象 bool sta 也會 簡單 throws image true 首先,流是什麽? 流是個抽象的概念,是對輸入輸出設備的抽象,Java程序中,對於數據的輸入/輸出操作都是以“流”的方式進行。設備可以是文件,網絡,內存等。 流具有方向性,至於是輸入流還是輸出流則

深入理解PHP賦值與引用

str ring int 之前 不同 重新 small nts 計數 【原文】 先看下面的問題: 1 2 3 4 5 6 7 8 <?php $a = 10;//將常量值賦給變量,會為a分配內存空間 $b = $a;//變量賦值給變量,是不是

深入理解JavaScript的函數操作

要求 使用情況 並不是 回文 工作 alert http load 函數 匿名函數 對於什麽是匿名函數,這裏就不做過多介紹了。我們需要知道的是,對於JavaScript而言,匿名函數是一個很重要且具有邏輯性的特性。通常,匿名函數的使用情況是:創建一個供以後使用的函數。 簡單

深入理解jQuery的each方法

foreach 參數 回調 jquery function 默認 break font ++ 寫在前面 我們先回顧一下數組中的forEach方法吧。在數組的實例上有個forEach方法供所有實例使用,forEach裏面接收一個回調函數,而且回調函數默認接收三個參數:當前項

圖說js的this——深入理解javascriptthis指針

前端 javascript this沒搞錯吧!js寫了那麽多年,this還是會搞錯!沒搞錯,javascript就是回搞錯!…………在寫java的時候,this用錯了,idea都會直接報錯!比如……但是,js,……idea,愛莫能助了……在面向對象編程裏有兩個重要的概念:一個是類,一個是實例化的對象,類是一個

python3----如何簡單地理解Python的if __name__ == '__main__'

tails 命令 out ons 其中 應該 python -name 1-n 1. 摘要 通俗的理解__name__ == ‘__main__‘:假如你叫小明.py,在朋友眼中,你是小明(__name__ == ‘小明‘);在你自己眼中,你是你自己(__name__ ==