python生成器與迭代器。

生成器

在python 中一邊循環一邊計算的機制,叫做生成器(generator)。

通過列表生成式,我們可以直接創建一個列表。但是,收到內存的限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的內存,如果我們只需要前面幾個元素,那么后面卻大多數的元素占用的內存就白白浪費掉了。所以,如果列表元素可以按照某種算法推算出來,就可以在循環過程中不斷推算出后續的元素。就不用創建完整的list,從而節省大量的空間。

生成器保存的是算法,每次調用 next(G) ,就計算出 G 的下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出 StopIteration 的異常。

?

資料參考:?https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

      https://www.zhihu.com/question/20829330

創建生成器的方法

①要把一個列表生成式的 [ ] 改成 ( )

類似于列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

a = (x for x in  range(5))
print(a)
next(a)
next(a)
list(a)

②使用yieId

yieId 與 ruturn 一樣會返回一個值,但是這兩者是有區別的:

   yieId語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執

def gensquares(N):for i in range(N):yield i ** 2a = gensquares(5)
b = gensquares(6)print(next(a))
print(next(b))
print(next(a))
print(next(b))
print(next(a))
print(next(b))print(list(a))
print(list(b))

?

總結

生成器是這樣一個函數,它記住上一次返回時在函數體中的位置。對生成器函數的第二次(或第 n 次)調用跳轉至該函數中間,而上次調用的所有局部變量都保持不變。

生成器不僅“記住”了它數據狀態;生成器還“記住”了它在流控制構造(在命令式編程中,這種構造不只是數據值)中的位置。

生成器的特點:

  1. 節約內存
  2. 迭代到下一次的調用時,所使用的參數都是第一次所保留下的,即是說,在整個所有函數調用的參數都是第一次所調用時保留的,而不是新創建的

?

?迭代器

迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。

可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。

?可迭代對象

以直接作用于 for 循環的數據類型有以下幾種:

一類是集合數據類型,如 list 、 tuple 、 dict 、 set 、 str 等;

一類是 generator ,包括生成器和帶 yield 的generator function。

這些可以直接作用于 for 循環的對象統稱為可迭代對象: Iterable 。

?

iter()函數

生成器都是 Iterator 對象,但 list 、 dict 、 str 雖然是 Iterable ,卻不是 Iterator 。

把 list 、 dict 、 str 等 Iterable 變成 Iterator 可以使用 iter() 函數:

?

?總結

  • 凡是可作用于 for 循環的對象都是 Iterable 類型;
  • 凡是可作用于 next() 函數的對象都是 Iterator 類型
  • 集合數據類型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過可以通過 iter() 函數獲得一個 Iterator 對象。

迭代器與生成器的區別

參考資料:http://blog.csdn.net/jinixin/article/details/72232604

生成器是一種特殊的迭代器,但迭代器不一定是生成器。

生成器是一種特殊的迭代器,生成器自動實現了“迭代器協議”(即__iter__和next方法),不需要再手動實現兩方法。

生成器在迭代的過程中可以改變當前迭代值,而修改普通迭代器的當前迭代值往往會發生異常,影響程序的執行。

?

轉載于:https://www.cnblogs.com/ksunone/p/8572088.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539168.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539168.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos mysql 設置_CentOS下MySQL安裝后配置和設置-阿里云開發者社區

CentOS下MySQL安裝后配置和設置:1:安裝完成路徑:1、數據庫目錄/var/lib/mysql/2、配置文件/usr/share/mysql(mysql.server命令及配置文件)3、啟動腳本/etc/rc.d/init.d/(啟動腳本文件mysql的目錄)4、相關命令/usr/bin(mysqladmin mysqldump等命令)注:1~3…

python怎樣將list轉化成字典_在python 中如何將 list 轉化成 dictionary

原標題:在python 中如何將 list 轉化成 dictionary 問題1:如何將一個list轉化成一個dictionary? 問題描述:比如在python中我有一個如下的list,其中奇數位置對應字典的key,偶數位置為相應的value解決方案: 1…

vscode gcc debug dbg gdb c cpp c++ cuckoo monitor

為什么80%的碼農都做不了架構師?>>> 裝cygwin 或者mingGW,裝gcc工具鏈,并將cygwin的bin目錄加入環境變量PATH中。 ctrlshiftb {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the tasks…

hive索引

創建 hive (zmgdb)> create index index_t1 on table v_t1(name) > as > org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler > with > deferred rebuild in table save_index_t1_table; OK Time …

python爬取知網論文關鍵詞_Python爬蟲根據關鍵詞爬取知網論文摘要并保存到數據庫中...

由于實驗室需要一些語料做研究,語料要求是知網上的論文摘要,但是目前最新版的知網爬起來有些麻煩,所以我利用的是知網的另外一個搜索接口 搜索出來的結果和知網上的結果幾乎一樣 在這個基礎上,我簡單看了些網頁的結構,…

網頁中查看pdf文檔

2019獨角獸企業重金招聘Python工程師標準>>> 介紹&#xff1a; PDFObject 是一個 JavaScript 庫&#xff0c;用來在HTML中動態嵌入 PDF 文檔。 實現代碼&#xff1a; <script type"text/javascript" src"pdfobject.js"></script>…

導入導出數據

導入數據 從文件中裝載數據 hive>LOAD DATA [LOCAL] INPATH ... [OVERWRITE] INTO TABLE t2 [PARTITION (provincebeijing)]; LOCAL&#xff1a;linux本地的文件。無LOCAL&#xff1a;是hdfs的文件 注意&#xff1a; 從本地文件系統中將數據導入到Hive表的過程中&#xf…

python opencv 讀取視頻流不解碼_python + opencv: 解決不能讀取視頻的問題

博主一開始使用python2.7和Opencv2.4.10來獲取攝像頭圖像&#xff0c;程序如下&#xff1a; cap cv2.VideoCapture(0) ret, frame cap.read()使用這個程序能夠打開攝像頭并獲取圖像&#xff0c;一切正常。 接著想使用OpenCv播放視頻&#xff0c;按照官方教程只要將VideoCaptu…

jmeter提取mysql返回值_jmeter連接數據庫和提取數據庫返回值

一、在MySQL命令行中&#xff0c;驗證MySQL是否能正常登陸。若不能登陸&#xff0c;則重置MySQL的密碼。二、下載mysql-connector-java-5.1.45-bin.jar&#xff0c;將其放入Jmeter安裝目錄的lib目錄下。完成MySQL數據庫的驅動。三、右鍵“線程組”->“配置元件”->“JDBC…

[轉] Lodash

與underscore 類似 &#xff0c; 是1個js庫&#xff0c;內部封裝了諸多對字符串、數組、對象等常見數據類型的處理函數。 模塊組成 Lodash 提供的輔助函數主要分為以下幾類&#xff0c;函數列表和用法實例請查看 Lodash 的官方文檔&#xff1a; Array&#xff0c;適用于數組類型…

讀模式與寫模式

RDBMS是寫模式 Hive是讀模式 我們傳統的關系型數據庫RDBMS是寫模式。在RDBMS里&#xff0c;我們對表進行數據操作時候&#xff0c;RDBMS會用數據庫的第一第二第三范式去檢查數據的規范性&#xff0c;如果不符合規范&#xff0c;數據庫就拒絕數據的加載和操作。這個驗證過程消耗…

用python畫雨滴_Python編程從入門到實踐練習(雨滴)

雨滴&#xff1a;尋找一幅雨滴圖像&#xff0c;并創建一系列整齊排列的雨滴。讓這些雨滴往下落&#xff0c;直到到達屏幕后消失。 先說今天的問題&#xff1a; 1.在更改函數形參時&#xff0c;調用的時候也要修改&#xff0c;否則會出現AttributeError 值得注意的是&#xff1a…

python你是否也走進了這個誤區了_Python是不是被嚴重高估了?

是python被曲解了python有非常強的局限性&#xff0c;那就是只適合在io和網絡或其他整合組件上耗費大量時間的快速迭代跨平臺需求&#xff0c;比如爬蟲和下載快速迭代才能顯示出python作為腳本語言不用編譯的優勢&#xff0c;而io和網絡的大量時間消耗才能掩蓋python本身糟糕透…

Hive文件格式

Hive有四種文件格式&#xff1a;TextFile&#xff0c;SequenceFile&#xff0c;RCFile&#xff0c;ORC TextFile 默認的格式&#xff0c;文本格式。 SequenceFile 簡介 見&#xff1a;http://blog.csdn.net/zengmingen/article/details/52242768 操作 hive (zmgdb)>cre…

learnpythonthehardway下載_Python【十一】:階段小結

今天來將前一段時間學習的Python的知識系統地梳理一遍&#xff0c;接下來開始實際的編程實踐了。 一、Python實驗環境搭建 使用Python編程&#xff0c;首先要有一個開發環境&#xff0c;如同C/C上又VS2008家族一樣&#xff0c;Linux/MacOS上的部署情況這里不再詳述&#xff0c;…

python使用ssh 中文_Python3制作簡易SSH登錄工具

下載W3Cschool手機App&#xff0c;0基礎隨時隨地學編程>>戳此了解導語做這個的起因大概是&#xff1a;電腦里的Xshell不知道為啥突然顯示“評估期已過”之類的提示。。。記得之前認證學校郵箱后是可以免費使用的。。。蒼天繞過誰。。。想起上次認證學校郵箱過了N個小時才…

hive java導入CVS

原文&#xff1a;http://bbs.chinahadoop.cn/thread-5343-1-1.html ---------------------------------------------------------------------------------- 本文的目的是hive讀取cvs文件&#xff0c;忽略字段中‘\,’&#xff0c;最終還是以,來分割文本 cvs格式是以逗號,隔開…

Django 博客教程(三):創建應用和編寫數據庫模型

創建 django 博客應用 在上一章節中我們創建了 django 博客的工程&#xff0c;并且成功地運行了它。然而這一切都是 django 為我們創建的項目初始內容&#xff0c;django 不可能為我們初始化生成我們需要的博客代碼&#xff0c;這些功能性代碼都得由我們自己編寫。 django 鼓勵…

python將16進制字符串轉換為整數_Python 16進制與字符串的轉換

電腦上裝了Python2.7和3.3兩個版本&#xff0c;平時運行程序包括在Eclipse里面調試都會使用2.7&#xff0c;但是由于某些原因在cmd命令行中輸入python得到的解釋器則是3.3, 一直沒對此做處理&#xff0c;因為這樣可以對兩個版本的差異有一個測試&#xff0c;而且虛擬機里面是2.…