在帮朋友解决一个问题的时候遇到了这个,恍惚间才发现自己不熟悉,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的用法详解——最简单,最清晰的解释