最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

Python 函數(shù)

函數(shù)注解

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

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

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

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

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

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

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

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

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

匿名函數(shù)

如何定義

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

當(dāng)函數(shù)功能非常簡(jiǎn)單,僅僅只是計(jì)算一個(gè)表達(dá)式的值時(shí),就可以用 lambda 表達(dá)式來(lái)替代。比如:

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

其實(shí)使用 lambda 表達(dá)式跟下面的效果是一樣的:

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

lambda 表達(dá)式主要運(yùn)用的場(chǎng)景是排序或者數(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')]

上面的例子就是用于排序列表元素,以列表元素元組的第二個(gè)元素進(jìn)行排序。此處的元組的第二個(gè)元素是字符串,關(guān)于字符串的比較,先比較字符串的首字符,首字符相同時(shí),比較第二個(gè)字符,以此類推。

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

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

捕獲變量值

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

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

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

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

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

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

若是向在匿名函數(shù)在定義時(shí)就捕獲值,可以將參數(shù)值定義為默認(rèn)參數(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

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

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

這里最終執(zhí)行的結(jié)果,也是因?yàn)樽罱K執(zhí)行,n 的值其實(shí)是迭代的最后一個(gè)值。

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

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

現(xiàn)在使用默認(rèn)值參數(shù)的形式,就能夠?qū)崿F(xiàn)在定義時(shí)綁定所需的值。

參考資料

來(lái)源

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

總結(jié)

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

相關(guān)文章

  • python實(shí)現(xiàn)最大優(yōu)先隊(duì)列

    python實(shí)現(xiàn)最大優(yōu)先隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)最大優(yōu)先隊(duì)列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 使用Python腳本提取基因組指定位置序列

    使用Python腳本提取基因組指定位置序列

    這篇文章主要為大家介紹了使用Python腳本提取基因組指定位置序列的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • python實(shí)現(xiàn)抽獎(jiǎng)小程序

    python實(shí)現(xiàn)抽獎(jiǎng)小程序

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)抽獎(jiǎng)小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Python sys.path詳細(xì)介紹

    Python sys.path詳細(xì)介紹

    這篇文章詳細(xì)介紹了Python sys.path,有需要的朋友可以參考一下
    2013-10-10
  • python json.dumps中文亂碼問(wèn)題解決

    python json.dumps中文亂碼問(wèn)題解決

    這篇文章主要介紹了如何解決python中中文亂碼問(wèn)題和json.dumps中文亂碼問(wèn)題,需要的朋友可以參考下
    2021-05-05
  • 詳解scrapy內(nèi)置中間件的順序

    詳解scrapy內(nèi)置中間件的順序

    這篇文章主要介紹了詳解scrapy內(nèi)置中間件的順序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • ubuntu系統(tǒng)下 python鏈接mysql數(shù)據(jù)庫(kù)的方法

    ubuntu系統(tǒng)下 python鏈接mysql數(shù)據(jù)庫(kù)的方法

    這篇文章主要介紹了ubuntu系統(tǒng)下 python鏈接mysql數(shù)據(jù)庫(kù)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • Python?numpy中np.random.seed()的詳細(xì)用法實(shí)例

    Python?numpy中np.random.seed()的詳細(xì)用法實(shí)例

    在學(xué)習(xí)人工智能時(shí),大量的使用了np.random.seed(),利用隨機(jī)數(shù)種子,使得每次生成的隨機(jī)數(shù)相同,下面這篇文章主要給大家介紹了關(guān)于Python?numpy中np.random.seed()的詳細(xì)用法,需要的朋友可以參考下
    2022-08-08
  • NumPy統(tǒng)計(jì)函數(shù)的實(shí)現(xiàn)方法

    NumPy統(tǒng)計(jì)函數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了NumPy統(tǒng)計(jì)函數(shù)的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • pytorch?膨脹算法實(shí)現(xiàn)大眼效果

    pytorch?膨脹算法實(shí)現(xiàn)大眼效果

    在PS中,我們可以利用液化工具對(duì)人像進(jìn)行瘦臉、放大眼睛等系列的常規(guī)操作。今天我們來(lái)了解一下這些操作的算法原理,并用pytorch?膨脹算法來(lái)實(shí)現(xiàn)大眼效果,感興趣的可以了解一下
    2021-11-11

最新評(píng)論

陆丰市| 嘉兴市| 陵川县| 安平县| 黔西| 长岛县| 庐江县| 竹山县| 仲巴县| 洪泽县| 平顶山市| 藁城市| 健康| 吐鲁番市| 莱阳市| 孟州市| 浙江省| 宣汉县| 荆州市| 启东市| 阜平县| 荃湾区| 蓝田县| 长兴县| 利津县| 锡林浩特市| 蓝田县| 南川市| 灵寿县| 微博| 松阳县| 白玉县| 内江市| 灵川县| 清水县| 霸州市| 东丽区| 德令哈市| 南昌市| 响水县| 五台县|