我有一个函数做一些计算,g(x).我现在想写一个计算g(g(g(... g(x))))的函数,其中g被应用n次.我尝试使用repeat_fn(见下文)这样做,但这不起作用.
根据使用lambda表达式的递归函数,解决方案是使用functools.partial.这确实有效,但我不明白怎么做.另外,我不明白为什么我的方法不起作用.
g = lambda x: 2*x
# Function that returns the fˆn map
def repeat_fn(f, n):
if n == 1:
return f
else:
return lambda y: f( repeat_fn(f(y), n-1) )
def repeat_fn_base(fn, n, x):
if n == 1:
return fn(x)
else:
return fn(repeat_fn_base(fn, n-1, x))
def repeat_fn2(fn, n):
return functools.partial(repeat_fn_base, fn, n)
j = repeat_fn2(g, 5)
print(type(j))
print(j(2))
k = repeat_fn(g, 5)
print(type(k))
print(k(2))
Run Code Online (Sandbox Code Playgroud)
它似乎repeat_fn只在我使用时调用一次k = repeat_fn(g, 5),而我希望它被调用五次.显然,在我用参数提供k之前,递归才会开始.还会 …
我正在努力熟悉Python的最佳实践.根据Python的Zen,请求宽恕比要求许可更容易,但是,它也说平面比嵌套和可读性更好.你会怎么处理这个问题:
我有3本词典.我有一把钥匙,我想测试钥匙是否在字典中.钥匙只会出现在其中一个中.根据它所在的字典,我想做不同的事情.
使用try/except,我得出以下解决方案:
try:
val = dict1[key]
except KeyError:
try:
val = dict2[key]
except KeyError:
try:
val = dict3[key]
except KeyError:
do_stuff_key_not_found()
else:
do_stuff_dict3()
else:
do_stuff_dict2()
else:
do_stuff_dict1()
Run Code Online (Sandbox Code Playgroud)
根据Python的EAFP原则,这将是一种方法,但它看起来很混乱,并且不是很易读.
一个更简单的解决方案是:
if key in dict1:
val = dict1[key]
do_stuff_dict1()
elif key in dict2:
val = dict2[key]
do_stuff_dict2()
elif key in dict3:
val = dict3[key]
do_stuff_dict3()
else:
do_stuff_key_not_found()
Run Code Online (Sandbox Code Playgroud)
Pythonic处理这样一个案例的方法是什么?我应该坚持EAFP原则,还是平坦且可读性更重要?