Python基礎教程——批量任務處理神器yield

2021-01-11 琴心劍膽寫代碼

Python中有一個特別晦澀難懂的概念,就是生成器和yield。特別地,如果我們使用scrapy框架進行爬蟲開發,就避不開yield這個關鍵詞,所以,我們需要知道yield是什麼。我們今天不解釋概念,直接用下面的圖說話:

這樣是最容易理解的

其實這東西的概念就是一句話:定義一個函數,函數中有yield,就是生成器,沒有yield,就是普通函數。

1、yield初步接觸

yield所在的函數(也就是生成器)它的行為和普通函數是不一樣的,我們看下面的這段代碼和它的輸出:

自己寫了一個生成器

大家看,如果我是一個尋常的p這個函數,它正常列印數字,當我使用yield的時候,它就不會執行函數了,它不列印,而是返回一個generator對象。

2、yield有什麼用

我們只需要牢記一點:生成器返回的對象只有調用它的__next__()方法的時候才會執行,而且它是可迭代的。

先看第一點,調用__next__()方法才會執行:

迭代器

第9行輸出一個迭代器對象,第10行輸出了具體的數字。

究極之問:這東西這麼設計到底有什麼用?我們從需求入手:

1、現在我要生成10個隨機數,這個在Python中也很簡單:

生成10個隨機數

2、現在我要生成1萬個隨機數。這很簡單,把代碼第5行的10改成10000就好了。但是問題是:對於伺服器程序來說,如果每次請求進來都要創建一個長度為10000的列表存儲數字,內存和CPU開銷都太大了,我們把它改成這樣:

使用生成器生成10個隨機數

劃重點:第12行代碼執行時並不會立即生成10個數,而是會在第13行的for循環執行的時候再生成。不信?我們改一下看它的結果:

注意第13行

第13行的輸出都出來了,再碰到for循環的時候才會有數據。

歸納總結一下:生成器執行時,遇到yield會出讓CPU,完成生成器的創建,但是只有真正對它進行迭代的時候,才執行具體的操作。scrapy這個爬蟲框架裡就是這麼設計的,它的邏輯就是:我使用生成器的方式先創建1000個任務,先不執行,等到需要執行的時候直接從生成器啟動。

真的已經很簡單了

4、寫在最後

生成器的__next__()方法當我們使用for循環遍歷它時,會自動調用,當然,也可以手動調用。

手動調用生成器的__next__()

大家看輸出流程,第一次調用have()的__next__(),輸出before之後就回來得到True,並不會執行after,第二次調用have()的__next__()的時候,去執行after,然後準備下一次迭代,因為沒有代碼了,不能進行下一次迭代了,所以拋出異常。

生成器其實確實是一個神器,我們以後如果涉及到並發編程,涉及到爬蟲,還會再碰到它,但是我相信通過本文的學習,大家都已經掌握了。

相關焦點

  • python基礎教程之python是什麼?
    這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。首選是網絡應用,包括網站、後臺服務等等;其次是許多日常需要的小工具,包括系統管理員需要的腳本任務等等;另外就是把其他語言開發的程序再包裝起來,方便使用。最後說說Python的缺點。
  • 淺議yield 語句
    python 中最富爭議的語句就是 yield 語句,yield 語句提供了用戶構造實現生成器(generator)的可能,但由於其語法和函數很相像,所以容易誤用和誤解:  讓我們來看下面一段經典的 yield 語句使用:  1. yield
  • 如何批量處理圖像自動白平衡?(附源碼)
    還好我會python,100行代碼輕鬆搞定》的文章。最近收到網友評論:「有無批量處理圖像自動白平衡的例子?「可達鴨表示:安排!什麼是圖像白平衡?肯定有人會問什麼是白平衡,這裡給大家簡單說一下。遞歸訪問文件:考慮到用戶給出的待處理的圖片可能有含有多級目錄,遞歸訪問能確保處理好所有的圖片。numpy的運用:也可以使用數組代替,然後用for循環逐個像素值進行計算。不過,考慮的運行效率問題,最好選擇numpy或pandas。
  • 編程界新晉「網紅」Python到底是什麼?學Python真的有用嗎?
    因此我們可以把一切通過數位化方式完成的辦公室任務,並帶來效率提升的應用叫做自動化辦公。那麼,什麼叫通過「數位化方式」完成辦公室任務呢?舉例:「文件批量重命名」,我們來拆解一下手動完成這個任務需要的步驟。
  • python圖像處理-gif動圖
    比如你所以把一些尺寸不同的圖片合成動圖時,需要先將所有圖片統一尺寸,需要使用resize方法;或者你想在動圖上加上文字,可以結合之前處理單張圖片添加文字的方法,處理完之後在統一合成;或者你還想調整動圖的速率等等,具體更多內容可以留言問我。
  • Python開發:Win10創建定時任務執行Python腳本
    :  Win10創建定時任務  電腦桌面→我的電腦→右鍵→管理  計算機管理→系統工具→任務計劃程序→創建基本任務    創建基本任務  創建基本任務之後,可以通過歷史記錄查看當前任務的執行信息,如果任務歷史記錄被禁用,可以點擊右側的 啟用所有任務歷史記錄 按鈕
  • Java API + Python AI,實現跨平臺任務調度
    六 業務處理服務集成Celery任務調度為什麼要跨平臺呢?>7,增加測試test_mq_service.py,發送消息8,運行測試python manage.py test,看到消息發送和接收五,任務處理請求信息發送和接收現在API服務和AI業務處理服務已經能夠發送和接收ActiveMQ消息,將它們連接起來:
  • VPF:適用於 Python 的開源視頻處理框架,加速視頻任務、提高 GPU...
    雷鋒網 AI 開發者按:近日,NVIDIA 開源了適用於 Python 的視頻處理框架「VideoProcessingFramework(VPF)」。該框架為開發人員提供了一個簡單但功能強大的 Python 工具,可用於硬體加速的視頻編碼、解碼和處理類等任務。
  • 200個精選ML、NLP、Python及數學最佳教程(附連結)
    Short Term Memory (LSTM)1.12 卷積神經網絡 Convolutional Neural Networks (CNNs)1.13 循環神經網絡 Recurrent Neural Nets (RNNs)1.14 強化學習 Reinforcement Learning1.15 生產對抗模型 Generative Adversarial Networks (GANs)1.16 多任務學習
  • python迭代器和生成器總結——新的斐波那契數列
    python迭代器題目:給定一個序列,循環輸出序列中的每個元素。通過一個for循環就可以實現,如下:python生成器前面的demo裡,通過給一個類添加__iter__和__next__方法,使得該類的對象可以通過for語句來遍歷。那麼,假設我們有一個test方法,我們希望test方法的返回值可以被for語句遍歷,該怎麼寫?比如下面這樣:
  • Python基礎教程(一) - 快速入門
    從今天開始學習python,會將學習到的相關知識整理到這裡。今後的所有內容都基於Ubuntu系統中進行的,和其他語言一樣,讓我們先來"Hello World!"吧。Hello world!#!/usr/bin/python為Linux系統下Python解釋器的路徑,通常python解釋器的路徑安裝在/usr/local/bin或/usr/bin目錄下。
  • 初識python
    2,python歷史。宏觀上:python2 與 python3 區別:python2 源碼不標準,混亂,重複代碼太多,python3 統一 標準,去除重複代碼。3,python的環境。編譯型:一次性將所有程序編譯成二進位文件。缺點:開發效率低,不能跨平臺。優點:運行速度快。
  • Python新手爬蟲,簡單製作抓取廖雪峰的教程的小爬蟲
    在整個抓取過程中,除了普通的文本以外,還需要處理 3個地方,分別是:代碼、圖片、視頻,因為目前只寫到了文本文件,所以直接抓到圖片或者視頻的地址,標識清楚後寫入到 txt,這裡可以在進一步,寫到 word/pdf 或者其他文件,留待以後改進!
  • 10款實用的批量圖像處理工具
    首頁 > 評論 > 關鍵詞 > 工具最新資訊 > 正文 10款實用的批量圖像處理工具
  • Python能幹什麼?為什麼會這麼火
    2.自動化運維:自動化處理大量的運維任務3.數據分析師:快速開發快速驗證,分析數據得到結果5.自動化測試:編寫為簡單的實現腳本,運用在Selenium/lr中,實現自動化。6.網站開發:藉助django,flask框架自己搭建網站。
  • 常用的十大 python 圖像處理工具
    但無論是用於何種用途,這些圖像都需要進行處理。圖像處理就是分析和處理數字圖像的過程,主要旨在提高其質量或從中提取一些信息,然後可以將其用於某種用途。圖像處理中的常見任務包括顯示圖像,基本操作如裁剪、翻轉、旋轉等,圖像分割,分類和特徵提取,圖像恢復和圖像識別。
  • Python數據讀取之生成器(generator)
    創建生成器生成器有兩種創建方式:列表生成式的 [] 改成 ()使用yield方法1 列表生成式的 [] 改成 ()把列表生成式中的 [] 改成 () 就創建了一個generator>>> L = [x * x for x in range(10)]>>>
  • Python基礎教程(一) - 函數和函數式編程
    前面使用過很多print()來進行列印,這是python提供的內建函數,你也可以自己創建函數,這叫做用戶自定義函數。創建函數你可以定義一個由自己想要功能的函數,用def語句來創建,標題行由def關鍵字,函數的名字,以及參數的集合(如果有的話)組成。
  • 《魔獸世界懷舊服》法師神器任務怎麼做 法師神器任務攻略
    導 讀 魔獸世界中法師是一個很牛的職業,當然法師想要變得很厲害,那就一定不能少了法師的神器,但是神器任務的難度還是比較大的
  • python時間序列平穩性檢驗專題及常見問題 - CSDN
    在做時間序列分析時,我們經常要對時間序列進行平穩性檢驗,而我們常用的軟體是SPSS或SAS,但實際上python也可以用來做平穩性檢驗,而且效果也非常好,今天筆者就講解一下如何用python來做時間序列的平穩性檢驗。首先我們還是來簡單介紹一下平穩性檢驗的相關概念。圖1.