色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python動態定義函數實現

454398 ? 來源:Python貓 ? 作者:Philip Trauner ? 2020-11-19 15:42 ? 次閱讀

作者:Philip Trauner 譯者:豌豆花下貓”

Python 中,沒有可以在運行時簡化函數定義的語法糖。然而,這并不意味著它就不可能,或者是難以實現。

from types import FunctionType

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

print(foo_func())

輸出:

bar

剖析

逐行檢視代碼,你會發現語言/解釋器的屏障是多么脆弱。

>>> from types import FunctionType

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

在本例中,help() 與 inspect 都可以完成工作,但是查看實際的源代碼,則會揭示出關于數據類型的更多細節。

>>> from inspect import signature
>>> signature(FunctionType)

1. code

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

2. globals

如果一個函數引用的變量不是在局部定義的,而是作為參數轉入、由默認參數值提供、或者通過閉包上下文提供,則它會在 globals 字典中查找。

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

3. name(可選)

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

4. argdefs(可選)

通過傳入一個包含任意類型的對象的元組,提供一個方式來供應默認參數值(def foo(bar="baz"))。(FunctionType((lambda bar: bar).__code__, {}, "foo", (10,))() == 10)。

5. closure(可選)

(如果需要在 CPython(PyPy,Jython,…)以外的其它 Python VM 中執行,可能不應該觸及,因為它嚴重地依賴于實現細節)。

一個cell 對象的元組。創建 cell 對象并非完全是直截了當的,因為需要調用 CPython 的內部組件,但有一個庫可以令它更加方便:exalt(無恥的廣告)。(譯注:這個庫是作者開發的。)

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

compile() 是一個內置方法,因此同時也是文檔豐富的。

exec 模式被用到,因為定義函數需用多個語句。

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

聚合全部內容,并將動態創建的函數指定給一個變量。

那個被前一句代碼編譯成的函數,成為了生成的代碼對象的第一個常量,因此僅僅指向 foo_code 是不充分的。這是 exec 模式的直接后果,因為生成的代碼對象可以包含多個常量。

>>> print(foo_func())

動態生成的函數可以像其它函數一樣被調用。

結尾

除了做實驗,需要用到動態創建函數的場景很少。

玩耍(Toying around) Python 的內部構件是一種深入學習這門語言的好方法。

如果需要,可以毫不費力地越過解釋器/語言的界線。

還是一如既往地:不要濫用語言 (好吧,一點點也無妨,對吧?)

譯者簡介: 豌豆花下貓,生于廣東畢業于武大,現為蘇漂程序員,有一些極客思維,也有一些人文情懷,有一些溫度,還有一些態度。

編輯:hfy

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • python
    +關注

    關注

    56

    文章

    4813

    瀏覽量

    85304
收藏 人收藏

    評論

    相關推薦

    創建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結果與Python代碼不同是為什么?

    創建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個推理過程中使用相同的圖像和模型。 從 C++ 代碼中獲得的結果與 Python* 代碼不同。
    發表于 03-06 06:22

    在D4100_usb.dll動態庫中應該使用哪些相關的函數才能實現Activex中的MemToFrameBuffer(),LoadToDMD() 功能?

    使用Activex時可以正常讀取圖片并顯示。但當使用D4100_usb.dll動態庫時,不清楚怎樣才能將數據顯示到DMD。 請問在D4100_usb.dll動態庫中應該使用哪些相關的函數才能
    發表于 02-28 06:17

    如何使用Python API創建自定義函數

    Cadence 統一調試平臺 Verisium Debug 提供多種調試功能,如 RTL 調試、UVM 仿真平臺調試、UPF 調試、DMS 調試等。從 IP 到 SoC 級調試,用戶可以利用豐富的調試功能來縮短調試時間。
    的頭像 發表于 02-15 14:27 ?174次閱讀
    如何使用<b class='flag-5'>Python</b> API創建自<b class='flag-5'>定義</b><b class='flag-5'>函數</b>

    深度學習入門:簡單神經網絡的構建與實現

    神經網絡。 首先,導入必要的庫: 收起 python ? import numpy as np ? 定義激活函數 Sigmoid: 收起 python ? def sigmoid(x)
    的頭像 發表于 01-23 13:52 ?212次閱讀

    使用Python實現xgboost教程

    使用Python實現XGBoost模型通常涉及以下幾個步驟:數據準備、模型訓練、模型評估和模型預測。以下是一個詳細的教程,指導你如何在Python中使用XGBoost。 1. 安裝XGBoost
    的頭像 發表于 01-19 11:21 ?636次閱讀

    stdio.h實現了printf函數?

    我們平時包含的 stdio.h 頭文件,里面是不是實現了 printf 函數? 為什么會有這個疑問?因為每次使用 printf,就得包含 stdio.h ,這就導致很多同學誤以為,stdio.h
    的頭像 發表于 12-18 10:28 ?334次閱讀

    SUMIF函數與SUMIFS函數的區別

    : 1. 函數定義 SUMIF函數 :用于對滿足單一條件的單元格求和。其基本語法為 SUMIF(range, criteria, [sum_range]) ,其中: range :應用條件的區域
    的頭像 發表于 10-30 09:51 ?4494次閱讀

    Python常用函數大全

    Python 世界里,有一些寶藏函數和模塊,它們可以讓你編程更輕松、代碼更高效。這篇文章將帶你一一認識這些神器,讓你的開發生活瞬間輕松不少!
    的頭像 發表于 10-27 17:20 ?467次閱讀

    Python建模算法與應用

    Python作為一種功能強大、免費、開源且面向對象的編程語言,在科學計算、數學建模、數據分析等領域展現出了卓越的性能。其簡潔的語法、對動態輸入的支持以及解釋性語言的本質,使得Python在多個平臺
    的頭像 發表于 07-24 10:41 ?767次閱讀

    如何實現Python復制文件操作

    Python 中有許多“開蓋即食”的模塊(比如 os,subprocess 和 shutil)以支持文件 I/O 操作。在這篇文章中,你將會看到一些用 Python 實現文件復制的特殊方法。下面我們開始學習這九種不同的方法來
    的頭像 發表于 07-18 14:53 ?532次閱讀

    python函數的萬能參數

    我們通過一個簡單的事例來展示一下函數的萬能參數,我們先寫一個最簡單的函數
    的頭像 發表于 07-17 14:56 ?428次閱讀
    <b class='flag-5'>python</b><b class='flag-5'>函數</b>的萬能參數

    神經網絡中激活函數定義及類型

    詳細介紹激活函數定義、類型。 激活函數定義和基本功能 2.1 定義 激活函數(Activat
    的頭像 發表于 07-02 10:09 ?850次閱讀

    ESP32下如何加自定義Python庫?

    我看官方有提供Micropython的bin文件,但我想根據自己外設擴充一下Python庫,這個應該從哪里入手? 之前做過RTT系統的python庫擴充,RTT有提供Micropython的源代碼,直接在里面加自己的庫就行 ESP32下如何加自
    發表于 06-18 06:27

    函數信號發生器的定義、功能及應用

    隨著現代電子技術的飛速發展,電子測試設備在科研、生產、教育等領域的應用越來越廣泛。其中,函數信號發生器作為一種重要的電子測試設備,在電子工程、通信、科研等領域發揮著至關重要的作用。本文將詳細介紹函數信號發生器的定義、分類、功能、
    的頭像 發表于 05-15 14:42 ?2128次閱讀

    PHP用戶定義函數詳細講解

    還可以根據需要定義函數。這些稱為“用戶定義函數”。 ? 句法: function function-name() ?{ ? ? statement 1 : ? ? statement
    的頭像 發表于 03-20 14:27 ?488次閱讀
    主站蜘蛛池模板: 国产偷国产偷亚洲高清SWAG | 九九影院午夜理论片无码 | 98久久无码一区人妻A片蜜 | 欧美 日韩 亚洲 在线 | 亚洲婷婷天堂综合国产剧情 | 草莓视频在线观看免费观看高清 | 精品久久久爽爽久久久AV | 伊人久久免费 | 青青娱乐网| 亚洲国产成人99精品激情在线 | 依人青青青在线观看 | 欧美 亚洲综合在线一区 | 亚洲 欧美无码原创区 | 日本高清色片 | 粉嫩自拍 偷拍 亚洲 | 亚洲精品午夜久久久伊人 | 无码一区二区在线欧洲 | 亚洲熟妇色自偷自拍另类 | 9亚洲欧洲免费无码在线 | 67194con免费福和视频 | 色怕怕 | 中国午夜伦理片 | 秋霞伦理高清视频在线 | 亚洲免费在线观看视频 | 竹菊影视一区二区三区 | 国产毛片AV久久久久精品 | 日日夜夜噜噜 | 无码一区国产欧美在线资源 | 麻豆精品一区二正一三区 | 色多多污污在线播放免费 | 一区二区三区国产亚洲网站 | 久久久久久天天夜夜天天 | 伊人久99久女女视频精品免 | 打开双腿狠狠蹂躏蜜桃臀 | 国产乱辈通伦影片在线播放亚洲 | 国产精品视频一区二区猎奇 | 漂亮的保姆3中文版完整版 漂亮的保姆3集电影免费观看中文 | 波多野结衣二区 | 灰原哀被啪漫画禁漫 | 国产一级做a爰片久久毛片男 | 免费在线观看黄色网址 |