亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python函數(shù)式編程學(xué)習(xí)之yield表達式形式詳解

 更新時間:2018年03月25日 15:54:25   作者:renpingsheng  
這篇文章主要給大家介紹了關(guān)于python函數(shù)式編程學(xué)習(xí)之yield表達式形式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。

前言

yield的英文單詞意思是生產(chǎn),剛接觸Python的時候感到非常困惑,一直沒弄明白yield的用法。最近又重新學(xué)習(xí)了下,所以整理了下面這篇文章,供自己和大家學(xué)習(xí)參考,下面話不多說了,來一起看看詳細的介紹吧。

先來看一個例子

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)

g = foo()
next(g)

在上面的例子里,因為foo函數(shù)中有yield關(guān)鍵字,所以foo()函數(shù)的執(zhí)行結(jié)果g是一個生成器,此時可以使用next(g)或者g.__next__()方法觸發(fā)生成器的執(zhí)行

程序的執(zhí)行結(jié)果為

starting...

使用next(g)觸發(fā)生成器的執(zhí)行時,程序會按照正常的順序從上向下執(zhí)行,遇到y(tǒng)ield,程序就會暫停

并把yield后面所接的值返回

打印next(g)的執(zhí)行結(jié)果

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)

g = foo()
print(next(g))

程序執(zhí)行結(jié)果

starting...
None

在上面的例子里,執(zhí)行一次next(g)方法,程序暫停在yield那一行,此時再次調(diào)用next(g),程序會從yield語句那一行繼續(xù)向下運行

修改上面的代碼,多調(diào)用幾次next方法,并打印next方法的返回結(jié)果

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
print(next(g))
print("*"*20)
print(next(g))

上面這段代碼的執(zhí)行結(jié)果為

starting...
None
********************
res: None
None

可以看到,程序確實按猜想的步驟運行,但是上面的程序也有一個很明顯的缺點:那就是上面的代碼沒有任何的實際意義:res的值永遠為None

在實際的開發(fā)中,使用yield表達式形式的目的是yield可以得到一個值,然后yield把這個值賦值給某個變量,這樣才有實際意義

那應(yīng)該怎么操作才能為res變量賦一個值呢??那就是調(diào)用生成器自身的send方法

send方法可以觸發(fā)一次生成器執(zhí)行,同時還可以把send方法的參數(shù)傳遞給yield

修改上面的代碼

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
next(g)
print(g.send(5))

程序的執(zhí)行結(jié)果為:

starting...
res: 5
None

來分析一下上面的代碼的執(zhí)行過程 :

      1.程序開始執(zhí)行以后,因為foo函數(shù)中有yield關(guān)鍵字,所以foo函數(shù)并不會真的執(zhí)行,而是先得到一個生成器g.

      2.直到調(diào)用next方法,foo函數(shù)正式開始執(zhí)行,先執(zhí)行foo函數(shù)中的print方法,然后進入while循環(huán)

      3.程序遇到y(tǒng)ield關(guān)鍵字,程序暫停,此時next(g)語句執(zhí)行完成

      4.程序執(zhí)行g(shù).send(5),程序會從yield關(guān)鍵字那一行繼續(xù)向下運行,send會把5這個值傳遞給yield

      5.yield接收到send方法傳遞過來的值,然后由yield賦值給res變量

      6.由于send方法中包含next()方法,所以程序會繼續(xù)向下運行執(zhí)行print方法,然后再次進入while循環(huán)

      7.程序執(zhí)行再次遇到y(tǒng)ield關(guān)鍵字,yield會返回后面的值,由于yield后面沒有接任何參數(shù),所以yield會返回None,程序再次暫停,直到再次調(diào)用next方法或send方法

修改代碼,多次調(diào)用send方法

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
next(g)
print(g.send(5))
print("*"*20)
print(g.send(10))
print("#"*20)
print(g.send(15))

執(zhí)行程序,得到如下結(jié)果

starting...
res: 5
None
********************
res: 10
None
####################
res: 15
None

可以看到,上面代碼的執(zhí)行過程如同上面的分析的執(zhí)行過程一樣運行

在上面的例子里,如果調(diào)用send方法時,傳遞的參數(shù)為None,得到的結(jié)果會是怎么樣的呢??

從上面的分析中,可以知道:

如果`g.send()`方法發(fā)送給yield關(guān)鍵字的參數(shù)為None,則yield關(guān)鍵字傳遞給res變量的值就為None
由于yield后面本來沒有接任何值,所以yield返回的值默認也為None,所以程序執(zhí)行結(jié)果會得到兩個None

修改代碼,驗證上面的猜想

def foo():
 print("starting...")
 while True:
  res = yield
  print("res:",res)
g = foo()
next(g)
print("#"*20)
print(g.send(None))

查看程序的執(zhí)行結(jié)果

starting...
####################
res: None
None

從程序的執(zhí)行結(jié)果可以看出,如果調(diào)用生成器的send方法時,傳遞的參數(shù)為None,則程序執(zhí)行的結(jié)果將會是兩個None

使用yield表達式形式實現(xiàn)linux系統(tǒng)中的"grep -rl root /etc"命令

代碼如下:

import os
def init(func):
 def wrapper(*args, **kwargs):
  g = func(*args, **kwargs)
  next(g)
  return g
 return wrapper
@init
def get_file_path(target):
 """
 get file abspath
 # 階段一:遞歸找文件的絕對路徑,把文件的完事路徑發(fā)送給階段二
 :param target:
 :return:
 """
 while True:
  start_path = yield
  g = os.walk(start_path)
  for parent_dir, _, files in g:
   for file in files:
    file_path = r"%s\%s" % (parent_dir, file)
    target.send(file_path)
@init
def opener(target):
 """
 get file obj
 # 階段二:收到文件的完整路徑,打開文件獲取文件對象,把文件對象發(fā)送給階段三
 :param target:
 :return:
 """
 while True:
  file_path = yield
  with open(file_path, encoding='utf-8') as f:
   target.send((file_path, f))
@init
def cat_file(target):
 """
 read file content
 # 階段三:收到文件對象,for循環(huán)讀取文件的每一行內(nèi)容,把每一行內(nèi)容發(fā)給階段四
 :param target:
 :return:
 """
 while True:
  file_path, f = yield
  for line in f:
   file_content = target.send((file_path, line))
   if file_content:
    break
@init
def grep(target, pattern):
 """
 grep function
 # 階段四:收到文件的一行內(nèi)容,判斷要查找的內(nèi)容是否在這一行中,如果在,則把文件名發(fā)送給階段五
 :param target:
 :param pattern:
 :return:
 """
 tag = False
 while True:
  file_path, line = yield tag
  tag = False
  if pattern in line:
   target.send(file_path)
   tag = True
@init
def printer():
 """
 print file name
 # 階段五:收到文件名,打印結(jié)果
 :return:
 """
 while True:
  filename = yield
  print(filename)
path1 = "/root"   # 定義要搜索的路徑
path2 = "/etc"   # 定義要搜索的路徑
g = get_file_path(opener(cat_file(grep(printer(), "root"))))
print(g)
g.send(path1)
g.send(path2)

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • python基于openpyxl生成excel文件

    python基于openpyxl生成excel文件

    這篇文章主要介紹了python基于openpyxl生成excel文件的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python中如何使用Matplotlib庫繪制圖形

    Python中如何使用Matplotlib庫繪制圖形

    Matplotlib是一個Python的2D繪圖庫,通過Matplotlib開發(fā)者可以僅需要幾行代碼,便可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等,這篇文章主要給大家介紹了Python中如何使用Matplotlib庫繪制圖形的相關(guān)資料
    2022-07-07
  • python pygame實現(xiàn)2048游戲

    python pygame實現(xiàn)2048游戲

    這篇文章主要為大家詳細介紹了python pygame實現(xiàn)2048游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Python裝飾器用法實例總結(jié)

    Python裝飾器用法實例總結(jié)

    這篇文章主要介紹了Python裝飾器用法,結(jié)合實例形式總結(jié)分析了Python裝飾器的功能、原理及常見使用方法,需要的朋友可以參考下
    2018-05-05
  • python使用正則表達式的search()函數(shù)實現(xiàn)指定位置搜索功能

    python使用正則表達式的search()函數(shù)實現(xiàn)指定位置搜索功能

    SEARCH函數(shù),函數(shù)名。主要用來返回指定的字符串在原始字符串中首次出現(xiàn)的位置 ,從左到右查找,忽略英文字母的大小寫。接下來通過本文給大家介紹python使用正則表達式的search()函數(shù)實現(xiàn)指定位置搜索功能,需要的朋友一起看看吧
    2017-11-11
  • Python多進程fork()函數(shù)詳解

    Python多進程fork()函數(shù)詳解

    今天小編就為大家分享一篇關(guān)于Python多進程fork()函數(shù)詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • 6種將Python代碼打包成exe應(yīng)用的方式

    6種將Python代碼打包成exe應(yīng)用的方式

    這篇文章主要給大家介紹了關(guān)于6種將Python代碼打包成exe應(yīng)用的方式,對于很多python的初學(xué)者來說,很希望將自己用python寫的.py文件生成exe直接在電腦上運行,需要的朋友可以參考下
    2023-08-08
  • Python中工廠模式的實現(xiàn)小結(jié)

    Python中工廠模式的實現(xiàn)小結(jié)

    工廠模式是一種創(chuàng)建型設(shè)計模式,通過定義一個工廠類,將對象的實例化過程封裝起來,本文主要介紹了Python中工廠模式的實現(xiàn)小結(jié),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 實現(xiàn)Python圖形界面框架TkInter寫GUI界面應(yīng)用簡介過程操作

    實現(xiàn)Python圖形界面框架TkInter寫GUI界面應(yīng)用簡介過程操作

    TkInter是Python用于開發(fā)GUI界面的標準庫,如果你想快速開發(fā)一個帶有GUI界面的小工具(笑小程序),且又能同時在Linux、Windows、Mac上使用,TkInter天生支持跨平臺,天生具備穩(wěn)定性,我認為它能滿足內(nèi)部工具的簡單需求
    2021-09-09
  • python+selenium+PhantomJS抓取網(wǎng)頁動態(tài)加載內(nèi)容

    python+selenium+PhantomJS抓取網(wǎng)頁動態(tài)加載內(nèi)容

    一般我們使用python的第三方庫requests及框架scrapy來爬取網(wǎng)上的資源,但是設(shè)計javascript渲染的頁面卻不能抓取,此 時,我們使用web自動化測試化工具Selenium+無界面瀏覽器PhantomJS來抓取javascript渲染的頁面,下面實現(xiàn)一個簡單的爬取
    2020-02-02

最新評論