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

Python騷操作之動(dòng)態(tài)定義函數(shù)

 更新時(shí)間:2019年03月26日 09:29:50   作者:豌豆花下貓  
這篇文章主要介紹了Python騷操作之動(dòng)態(tài)定義函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在 Python 中,沒(méi)有可以在運(yùn)行時(shí)簡(jiǎn)化函數(shù)定義的語(yǔ)法糖。然而,這并不意味著它就不可能,或者是難以實(shí)現(xiàn)。

from types import FunctionType

foo_code = compile('def foo(): return "bar"', "<string>", "exec")
foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")

print(foo_func())

輸出:bar

剖析

逐行檢視代碼,你會(huì)發(fā)現(xiàn)語(yǔ)言/解釋器的屏障是多么脆弱。

>>> from types import FunctionType

Python 文檔通常不會(huì)列出那些非用于手動(dòng)創(chuàng)建的類的特征(這是完全合理的)。有三種方法可以解決這個(gè)問(wèn)題:help()、inspect(無(wú)法查看內(nèi)置方法)、以及最后的解決方案,即查看 CPython 源代碼。

在本例中,help() 與 inspect 都可以完成工作,但是查看實(shí)際的源代碼,則會(huì)揭示出關(guān)于數(shù)據(jù)類型的更多細(xì)節(jié)。

>>> from inspect import signature
>>> signature(FunctionType)
<Signature (code, globals, name=None, argdefs=None, closure=None)>

1. code

內(nèi)部是一個(gè)PyCodeobject,作為types.CodeType對(duì)外開放。非內(nèi)置方法擁有一個(gè)__code__屬性,該屬性保存了相應(yīng)的代碼對(duì)象。利用內(nèi)置 compile() 方法,可以在運(yùn)行期創(chuàng)建types.CodeType對(duì)象。

2. globals

如果一個(gè)函數(shù)引用的變量不是在局部定義的,而是作為參數(shù)轉(zhuǎn)入、由默認(rèn)參數(shù)值提供、或者通過(guò)閉包上下文提供,則它會(huì)在 globals 字典中查找。

內(nèi)置的 globals() 方法會(huì)返回一個(gè)對(duì)當(dāng)前模塊的全局符號(hào)表(global symbol table)的引用 ,因此能被用來(lái)提供一個(gè)總是與當(dāng)前表的狀態(tài)相一致的字典。傳入任意其它的字典也是可以的(FunctionType((lambda: bar).__code__, {"bar" : "baz"}, "foo")() == "baz")。

3. name(可選)

控制所返回的函數(shù)的__name__ 屬性。只真正對(duì) lambdas 有用(由于匿名性,它們通常沒(méi)有名稱),并且重命名函數(shù)。

4. argdefs(可選)

通過(guò)傳入一個(gè)包含任意類型的對(duì)象的元組,提供一個(gè)方式來(lái)供應(yīng)默認(rèn)參數(shù)值(def foo(bar="baz"))。(FunctionType((lambda bar: bar).__code__, {}, "foo", (10,))() == 10)。

5. closure(可選)

(如果需要在 CPython(PyPy,Jython,…)以外的其它 Python VM 中執(zhí)行,可能不應(yīng)該觸及,因?yàn)樗鼑?yán)重地依賴于實(shí)現(xiàn)細(xì)節(jié))。

一個(gè)cell 對(duì)象的元組。創(chuàng)建 cell 對(duì)象并非完全是直截了當(dāng)?shù)?,因?yàn)樾枰{(diào)用 CPython 的內(nèi)部組件,但有一個(gè)庫(kù)可以令它更加方便:exalt(無(wú)恥的廣告)。(譯注:這個(gè)庫(kù)是作者開發(fā)的。)

>>> foo_code = compile('def foo(): return "bar"', "<string>", "exec")

compile() 是一個(gè)內(nèi)置方法,因此同時(shí)也是文檔豐富的。

exec 模式被用到,因?yàn)槎x函數(shù)需用多個(gè)語(yǔ)句。

>>> foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")

聚合全部?jī)?nèi)容,并將動(dòng)態(tài)創(chuàng)建的函數(shù)指定給一個(gè)變量。

那個(gè)被前一句代碼編譯成的函數(shù),成為了生成的代碼對(duì)象的第一個(gè)常量,因此僅僅指向 foo_code 是不充分的。這是 exec 模式的直接后果,因?yàn)樯傻拇a對(duì)象可以包含多個(gè)常量。

>>> print(foo_func())

動(dòng)態(tài)生成的函數(shù)可以像其它函數(shù)一樣被調(diào)用。

結(jié)尾

除了做實(shí)驗(yàn),需要用到動(dòng)態(tài)創(chuàng)建函數(shù)的場(chǎng)景很少。

玩耍(Toying around) Python 的內(nèi)部構(gòu)件是一種深入學(xué)習(xí)這門語(yǔ)言的好方法。

如果需要,可以毫不費(fèi)力地越過(guò)解釋器/語(yǔ)言的界線。

還是一如既往地:不要濫用語(yǔ)言 (好吧,一點(diǎn)點(diǎn)也無(wú)妨,對(duì)吧?)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用python將圖片版PDF轉(zhuǎn)文字版PDF

    利用python將圖片版PDF轉(zhuǎn)文字版PDF

    今天為大家介紹一下如何使用利用python將圖片版PDF轉(zhuǎn)文字版PDF,這里我們需要用到python3.6,pypdf2,ghostscript,PythonMagick,百度文字識(shí)別服務(wù)和pdfkit
    2019-05-05
  • python實(shí)現(xiàn)漫天飄落的七彩花朵效果

    python實(shí)現(xiàn)漫天飄落的七彩花朵效果

    要實(shí)現(xiàn)漫天飄落的七彩花朵效果,你可以使用Python的圖形庫(kù),如Pygame或Pyglet,這些庫(kù)可以幫助你創(chuàng)建動(dòng)畫和圖形效果,本文給大家介紹了如何使用python實(shí)現(xiàn)漫天飄落的七彩花朵效果,感興趣的朋友可以參考下
    2024-01-01
  • spark?dataframe全局排序id與分組后保留最大值行

    spark?dataframe全局排序id與分組后保留最大值行

    這篇文章主要為大家介紹了spark?dataframe全局排序id與分組后保留最大值行實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 詳解pycharm自動(dòng)import所需的庫(kù)的操作方法

    詳解pycharm自動(dòng)import所需的庫(kù)的操作方法

    這篇文章主要介紹了pycharm自動(dòng)import所需的庫(kù)的操作方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • PyQt5+requests實(shí)現(xiàn)車票查詢工具

    PyQt5+requests實(shí)現(xiàn)車票查詢工具

    這篇文章主要為大家詳細(xì)介紹了PyQt5+requests實(shí)現(xiàn)車票查詢工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python實(shí)現(xiàn)自動(dòng)化對(duì)Word文檔添加或移除行號(hào)

    Python實(shí)現(xiàn)自動(dòng)化對(duì)Word文檔添加或移除行號(hào)

    Word文檔中的行號(hào)(行編號(hào))功能是對(duì)于精細(xì)化的文檔編輯以及解析非常有用的功能,添加行號(hào)能夠極大地提升文檔的可讀性和定位效率,本文將介紹如何使用Python來(lái)實(shí)現(xiàn)自動(dòng)化對(duì)Word文檔添加或移除行號(hào),為文檔處理工作帶來(lái)便捷,需要的朋友可以參考下
    2024-07-07
  • Python基礎(chǔ)之條件控制操作示例【if語(yǔ)句】

    Python基礎(chǔ)之條件控制操作示例【if語(yǔ)句】

    這篇文章主要介紹了Python基礎(chǔ)之條件控制操作,結(jié)合實(shí)例形式分析了Python使用if語(yǔ)句進(jìn)行條件控制的相關(guān)操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • 解決win10 vscode 無(wú)法激活python 虛擬環(huán)境的問(wèn)題

    解決win10 vscode 無(wú)法激活python 虛擬環(huán)境的問(wèn)題

    這篇文章主要介紹了win10 vscode 無(wú)法激活python 虛擬環(huán)境的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • python翻譯軟件實(shí)現(xiàn)代碼(使用google api完成)

    python翻譯軟件實(shí)現(xiàn)代碼(使用google api完成)

    這篇文章主要介紹了python結(jié)合google api完成的翻譯軟件實(shí)現(xiàn)代碼,大家參考使用
    2013-11-11
  • Python?operator模塊的使用詳解

    Python?operator模塊的使用詳解

    本文主要介紹了Python?operator模塊的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2023-06-06

最新評(píng)論

九寨沟县| 长岭县| 内丘县| 大余县| 长兴县| 调兵山市| 琼中| 大余县| 吴堡县| 灵山县| 宝兴县| 松江区| 盐池县| 江源县| 江西省| 井冈山市| 淮北市| 拉萨市| 蓬溪县| 南宁市| 开江县| 晋州市| 海伦市| 蒙城县| 岳池县| 新沂市| 灵丘县| 信阳市| 长丰县| 元阳县| 汕尾市| 罗田县| 四川省| 新绛县| 探索| 宣恩县| 博兴县| 武川县| 弥勒县| 紫阳县| 融水|