有没有更好的方法在 python 中编写这段代码?
result = slow_function()
if result:
return result
[...]
该函数slow_function
可以返回一个值,或者None
它很慢,所以这是不可行的:
if slow_function():
return slow_function()
第一种方法没有什么问题,但是使用临时变量对 python 来说似乎有点过头了。
当您通过本地假设使用递归调用解决问题时,此代码非常有用f
,例如,您从列表中选择一个项目,然后检查是否有可行的解决方案,否则您必须选择另一个。就像是:
def f(n):
for x in xrange(n):
result = slow_function(x):
if result:
return result
[...]
像这样更惯用的东西不是更好吗:
def f(n):
for x in xrange(n):
return slow_function(x) if is not None
这可以扩展到检查任何类型的值。这将是一个易于阅读的return if语句。
代码爱好者的附加示例
假设您有一个数字列表列表:
lists = [[1,2,3],[4,5],[6,7,8],[9,10],...]
并且您想为每个列表选择一项,以便选择中最多有一个偶数。可能有很多列表,因此尝试每种组合都是浪费的,因为您已经可以看出,如果您开始选择 [1,2,4,...],则可能没有可行的解决方案。
def check(selected):
even_numbers = filter(lambda n: (n % 2) == 0, selected)
return len(even_numbers) < 2
def f(lists, selected=[]):
if not lists:
return selected
for n in lists[0]:
if check(selected + [n]):
result = f(lists[1:], selected + [n])
if result:
return result
像这样的语法不是更好吗:
def f(lists, selected=[]):
return selected if not lists
for n in lists[0]:
if check(selected + [n]):
return f(lists[1:], selected + [n]) if is not None
到目前为止,我所做的最好的事情是将函数转换为可行解决方案的生成器:
def f(lists, selected=[]):
if not lists:
yield selected
else:
for n in lists[0]:
if check(selected + [n]):
for solution in f(lists[1:], selected + [n]):
yield solution