小编MTV*_*DNA的帖子

使用lambda的递归函数,为什么这不起作用?

我有一个函数做一些计算,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 recursion lambda

6
推荐指数
1
解决办法
170
查看次数

Python嵌套尝试除了vs if,elif,else

我正在努力熟悉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原则,还是平坦且可读性更重要?

python if-statement try-except

0
推荐指数
1
解决办法
645
查看次数

标签 统计

python ×2

if-statement ×1

lambda ×1

recursion ×1

try-except ×1