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

深入淺析Python 函數(shù)注解與匿名函數(shù)

 更新時間:2020年02月24日 13:53:43   作者:大夢三千秋  
這篇文章主要介紹了Python 函數(shù)注解與匿名函數(shù)的相關知識,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

函數(shù)注解與匿名函數(shù)

關于函數(shù)參數(shù)的定義,調(diào)用以及函數(shù)參數(shù)的內(nèi)容,在下面的文章中已經(jīng)做了初步的介紹,有需要的可以訪問進行了解:

Python 函數(shù)

函數(shù)注解

在編寫函數(shù),當下肯定清楚函數(shù)如何使用的。若是函數(shù)較為復雜,過段時間,編寫者有可能需要花一段時間去重新了解函數(shù)的使用,那其他使用者也同樣會遇到這樣的困惑。

所以當編寫完函數(shù)后,可以為函數(shù)的參數(shù)添加一些額外的信息。這里給函數(shù)參數(shù)添加注解,能夠提示程序員如何正確使用這個函數(shù)。如下示例:

def add(x:int, y:int) -> int:
 '''Returns the sum of two numbers
 '''
 return x + y

在這里,Python 解釋器并不會對這些注解添加任何的語義(可能第三方工具和框架會)。它們并不會被類型檢查,運行的時候跟沒有添加注解前是沒有任何差距的。但若是有需要的人閱讀源碼時,這些都能給閱讀者提供幫助。同時會出現(xiàn)在文檔里。

>>> help(add)
Help on function add in module __main__:

add(x: int, y: int) -> int
 Returns the sum of two numbers

函數(shù)注解只存儲于函數(shù)的 __annotations__ 屬性中。比如:

>>> add.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

注解的主要用途還是文檔。Python 并沒有類型聲明,當閱讀源碼的時候,比較難知道傳遞什么樣的參數(shù)給這個函數(shù)。這時候,注解就能夠給閱讀者更多的提示,能夠讓他們正確使用函數(shù)。

匿名函數(shù)

如何定義

在前面提及的文章中,講到了使用 def 定義一個函數(shù)。但若是函數(shù)能夠單行實現(xiàn),這個時候可以考慮使用匿名函數(shù)(lambda 表達式)來實現(xiàn)這種功能。

當函數(shù)功能非常簡單,僅僅只是計算一個表達式的值時,就可以用 lambda 表達式來替代。比如:

>>> add = lambda x, y: x + y
>>> add
<function <lambda> at 0x0000021496CD98B8>
>>> add(2, 3)
5
>>> add('hello', ' world')
'hello world'

其實使用 lambda 表達式跟下面的效果是一樣的:

>>> def add(x, y):
... return x + y
...
>>> add(2, 3)
5
>>> add('hello', ' world')
'hello world'

lambda 表達式主要運用的場景是排序或者數(shù)據(jù) reduce:

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> sorted(pairs, key=lambda pair: pair[1])
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

上面的例子就是用于排序列表元素,以列表元素元組的第二個元素進行排序。此處的元組的第二個元素是字符串,關于字符串的比較,先比較字符串的首字符,首字符相同時,比較第二個字符,以此類推。

在這里, four 與 one , f 比 o 排序更前,所以 four 排在 one 前面, three 和 two 首字符相同,比較的是第二個字符 h 和 w ,所以 three 排在 two 前面。

盡管 lambda 表達式能夠定義簡單函數(shù),但其實是有限制的。只能指定單個表達式,它的值就是最后返回的值。即是不能包含其他的語言特性,包括多個語句、迭代以及異常處理等等。

捕獲變量值

如何在定義匿名函數(shù)時捕獲某些變量的值?現(xiàn)在,先看看以下示例代碼的效果:

>>> x = 10
>>> a = lambda y: x+y
>>> x = 20
>>> b = lambda y: x+y

在這里,先猜猜 a(10) 和 b(10) 的結果?若覺得結果是 20 和 30 ,那就錯了:

>>> a(10) 30 >>> b(10) 30

產(chǎn)生上面的結果,是因為 lambda 表達式中的 x 是一個自由變量,它是在運行的時候綁定值,而不是在定義的時候就綁定,這里跟函數(shù)的默認值參數(shù)定義是不同的。因此,在調(diào)用這個 lambda 表達式時, x 的值其實是執(zhí)行時的值。例如:

>>> x = 10 >>> a(10) 20 >>> x = 20 >>> b(10) 30

若是向在匿名函數(shù)在定義時就捕獲值,可以將參數(shù)值定義為默認參數(shù):

>>> x=10 >>> a = lambda y, x=x: x+y >>> x=20 >>> b = lambda y, x=x: x+y >>> a(10) 20 >>> b(10) 30

還有一個需要注意:假如想用循環(huán)或列表推導創(chuàng)建一個 lambda 表達式列表,期望函數(shù)能夠在定義時就記住每次的迭代值。以下的寫法是無法達到效果的:

>>> func = [lambda x: x+n for n in range(5)] >>> for f in func: ... print(f(0)) ...

這里最終執(zhí)行的結果,也是因為最終執(zhí)行,n 的值其實是迭代的最后一個值。

修改函數(shù),使其達到想要達到的效果,也是上面提及的默認值的做法:

>>> func = [lambda x, n=n: x+n for n in range(5)] >>> for f in func: ... print(f(0)) ...

現(xiàn)在使用默認值參數(shù)的形式,就能夠實現(xiàn)在定義時綁定所需的值。

參考資料

來源

[1] David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013.

[2] "4.7.6 Lambda Expressions".docs.python.org.Retrieved 23 February 2020.

總結

到此這篇關于Python 函數(shù)注解與匿名函數(shù)的文章就介紹到這了,更多相關Python 函數(shù)注解與匿名函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python遠程調(diào)用rpc模塊xmlrpclib的方法

    python遠程調(diào)用rpc模塊xmlrpclib的方法

    今天小編就為大家分享一篇python遠程調(diào)用rpc模塊xmlrpclib的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python中應用Winsorize縮尾處理的操作經(jīng)驗

    Python中應用Winsorize縮尾處理的操作經(jīng)驗

    縮尾處理相當于對數(shù)據(jù)進行掐頭(尾)去尾,然后再按照一定的方法填補被掐掉的數(shù)據(jù),下面這篇文章主要給給大家介紹了關于Python中應用Winsorize縮尾處理的相關資料,需要的朋友可以參考下
    2022-07-07
  • Python成功解決讀文件出現(xiàn):IOError:?[Errno?0]?Error的錯誤

    Python成功解決讀文件出現(xiàn):IOError:?[Errno?0]?Error的錯誤

    在Python編程中,處理文件是常見的任務之一,但偶爾也會遇到各種錯誤,包括IOError,盡管Python?3.x中IOError已被OSError和FileNotFoundError等更具體的異常所取代,由于[Errno?0]不直接指向具體的錯誤類型,我們將討論一系列可能導致IOError的常見情況,需要的朋友可以參考下
    2024-07-07
  • python-docx文檔格式修改方式

    python-docx文檔格式修改方式

    使用python-docx庫修改docx文檔格式的兩種方法:第一種是通過自定義函數(shù)設置段落和字體樣式,第二種是預設Word中的樣式后通過代碼替換文檔整體樣式。這兩種方式各有優(yōu)缺點,第一種方法更靈活,而第二種方法可以更全面地保留格式細節(jié)
    2024-09-09
  • 詳解pyqt中解決國際化tr()函數(shù)不起作用的問題

    詳解pyqt中解決國際化tr()函數(shù)不起作用的問題

    本文主要介紹了pyqt中解決國際化tr()函數(shù)不起作用的問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python寫的Socks5協(xié)議代理服務器

    Python寫的Socks5協(xié)議代理服務器

    這篇文章主要介紹了Python寫的Socks5協(xié)議代理服務器,代碼來自網(wǎng)上,需要的朋友可以參考下
    2014-08-08
  • 淺析python的Lambda表達式

    淺析python的Lambda表達式

    在本文里我們給大家整理了關于python的Lambda表達式相關知識點以及相關實例,需要的朋友們學習下。
    2019-02-02
  • numpy之多維數(shù)組的創(chuàng)建全過程

    numpy之多維數(shù)組的創(chuàng)建全過程

    這篇文章主要介紹了numpy之多維數(shù)組的創(chuàng)建全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 如何用python開發(fā)Zeroc Ice應用

    如何用python開發(fā)Zeroc Ice應用

    這篇文章主要介紹了如何用python開發(fā)Zeroc Ice應用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • python+opencv實現(xiàn)霍夫變換檢測直線

    python+opencv實現(xiàn)霍夫變換檢測直線

    這篇文章主要為大家詳細介紹了python+opencv實現(xiàn)霍夫變換檢測直線,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評論