python函數教程:深入淺析Python 函數註解與匿名函數

這篇文章主要介紹了Python 函數註解與匿名函數的相關知識,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑑價值,需要的朋友可以參考下
函數註解與匿名函數

關於函數參數的定義,調用以及函數參數的內容,在下面的文章中已經做了初步的介紹,有需要的可以訪問進行了解:

Python 函數

函數註解

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

所以當編寫完函數後,可以爲函數的參數添加一些額外的信息。這裏給函數參數添加註解,能夠提示程序員如何正確使用這個函數。如下示例:

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

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

>>> help(add)
Help on function add in module __main__:
 
add(x: int, y: int) -> int
 Returns the sum of two numbers

函數註解只存儲於函數的 annotations 屬性中。比如:

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

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

匿名函數

如何定義

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

當函數功能非常簡單,僅僅只是計算一個表達式的值時,就可以用 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 表達式主要運用的場景是排序或者數據 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 表達式能夠定義簡單函數,但其實是有限制的。只能指定單個表達式,它的值就是最後返回的值。即是不能包含其他的語言特性,包括多個語句、迭代以及異常處理等等。

捕獲變量值

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

>>> 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

產生上面的結果,是因爲 lambda 表達式中的 x 是一個自由變量,它是在運行的時候綁定值,而不是在定義的時候就綁定,這裏跟函數的默認值參數定義是不同的。因此,在調用這個 lambda 表達式時, x 的值其實是執行時的值。例如

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

若是向在匿名函數在定義時就捕獲值,可以將參數值定義爲默認參數:
>>> x=10 >>> a = lambda y, x=x: x+y >>> x=20 >>> b = lambda y, x=x: x+y >>> a(10) 20 >>> b(10) 30
還有一個需要注意:假如想用循環或列表推導創建一個 lambda 表達式列表,期望函數能夠在定義時就記住每次的迭代值。以下的寫法是無法達到效果的:

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

這裏最終執行的結果,也是因爲最終執行,n 的值其實是迭代的最後一個值。

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

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

現在使用默認值參數的形式,就能夠實現在定義時綁定所需的值。

參考資料

來源

[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學習聚集地,點擊進入,這裏有資深程序員分享以前學習心得,學習筆記,還有一線企業的工作經驗,且給大家精心整理一份python零基礎到項目實戰的資料,每天給大家講解python最新的技術,前景,學習需要留言的小細節
總結

到此這篇關於Python 函數註解與匿名函數的文章就介紹到這了,更多相關Python 函數註解與匿名函數內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章