溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

partial()函數怎么在python中應用

發布時間:2021-04-01 17:50:54 來源:億速云 閱讀:186 作者:Leah 欄目:開發技術

partial()函數怎么在python中應用?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

在functools模塊中有一個工具partial(),可以用來"凍結"一個函數的參數,并返回"凍結"參數后的新函數。

很簡單的解釋,也是官方手冊給的示例。對于int()函數,它可以將給定的數值轉換成十進制整數,轉換時可以指定以幾進制的方式解析給定的數。例如:

# 以10進制解析123,并轉換成10進制整數
>>> int("123")
123

# 以2進制解析10101,并轉換成10進制整數
>>> int("10101", base=2)
21

# 以13進制解析"abc12c",并轉換成10進制整數
>>> int("abc12c", base=13)
4053672

現在不想這樣指定base=2參數來將二進制轉換為10進制整數了,而是像普通函數一樣,直接指定待轉換的值即可。于是,定義另外一個函數來封裝int(),例如:

def inttwo(x):
 return int(x, base=2)

inttwo("10101")

functools中提供的partial()就是做類似事情的:

inttwo = partial(int, base=2)

它表示int()中指定參數base=2,也就是"凍結"了這個參數。

>>> from functools import partial
>>> inttwo = partial(int,base=2)
>>> inttwo("10101")
21

之所以"凍結"加上了引號,是因為可以在inttwo()中再次指定參數來覆蓋partial()中"凍結"的參數:

>>> inttwo("10101",base=10)
10101

回頭再看partial()的定義:

functools.partial(func, *args, **keywords)

從它的定義不難知道,不僅僅是像int()中base這樣的kw參數格式,位置參數args也一樣能"凍結"。

partial()返回的其實是一個partial對象,這個對象包含了3個特殊的屬性:

>>> dir(inttwo)
[...... 'args', 'func', 'keywords']
  • func表示該對象所封裝的原始函數

  • args表示"凍結"的位置參數列表

  • keywords表示"凍結"的關鍵字參數

>>> inttwo.func
<class 'int'>
>>> inttwo.args
()
>>> inttwo.keywords
{'base': 2}

另外需要注意的是,partial()不會保留封裝函數的元數據,比如注釋文檔、注解等。

>>> def myfunc(x:int, y:int) -> int:
...  ''' sum x + y '''
...  return x + y


# 函數元數據信息
>>> myfunc.__doc__
' sum x + y '
>>> myfunc.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

# partial()包裝后的函數,沒有函數元數據
>>> newfunc = functools.partial(myfunc,y=3)

所以如果需要這些元數據,必須自己手動將元數據賦值給partial對象:

>>> newfunc.__doc__ = myfunc.__doc__
>>> newfunc.__annotations__ = myfunc.__annotations__
>>> newfunc.__doc__
' sum x + y '
>>> newfunc.__annotations__
{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}

最后,除了partial()可以將函數的參數"凍結",functools還提供了partialmethod()將方法的參數"凍結",但基本上用不上,就連partial()也很少用。

看完上述內容,你們掌握partial()函數怎么在python中應用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女