Python | 傳回函數 | yield & partial用法
- 題目
-
- 測試
- 答案
-
- partial()
- 局部函數
- 講解
-
- partial()
- 局部函數
- 其他
在幫朋友解決一個問題的時候遇到了這個,恍惚間才發現自己不熟悉,mark下
題目
測試
測試代碼
assert favorite_subject(0)=="statistics"
assert favorite_subject(1)()=="statistics"
assert favorite_subject(5)()()()()()=="statistics"
答案
partial()
大材小用之
partial()
函數
from functools import partial
def favorite_subject(m):
if m == 0:
return 'statistics'
else:
return partial(favorite_subject, m-1)
局部函數
def favorite_subject(m):
def _f(v=m-1):
return favorite_subject(v)
if m == 0:
return 'statistics'
else:
return _f
講解
partial()
為什麼說
partial()
是大材小用呢。
partial()
主要是用于當機參數,這裡隻有一個參數
m
,用來做這題隻是附帶效果。
可以參考菜鳥教程和這篇部落格
functools.partial(func, *args, **keywords)
其中:
func
: 該對象所封裝的原始函數
args
: "當機"的位置參數清單
keywords
: "當機"的關鍵字參數
常見例子:
from functools import partial
def mod( n, m ):
return n % m
mod_by_100 = partial( mod, 100 )
print mod( 100, 7 ) # 2
print mod_by_100( 7 ) # 2
有關鍵字參數:
可以不按照原函數的參數位置和個數
from functools import partial
bin2dec = partial( int, base=2 )
print bin2dec( '0b10001' ) # 17
print bin2dec( '10001' ) # 17
hex2dec = partial( int, base=16 )
print hex2dec( '0x67' ) # 103
print hex2dec( '67' ) # 103
局部函數
高階函數可以把函數作為結果值傳回,傳回的函數後需要加調用()才執行。
這篇部落格講閉包講的不錯:Python——傳回函數
其他
可能yield也能用吧,可以參考這篇:python中yield的用法詳解——最簡單,最清晰的解釋