有没有更好的方法来用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
最佳答案
在不知道您还想返回什么的情况下,有几种选择。
你可以只返回函数的结果,
None
或者不:return slow_function()
在这种情况下,您依靠调用者知道如何处理
None
值,并且实际上只是将您的逻辑转移到哪里。如果你有一个默认值要返回而不是 None,你可以这样做:
return slow_function() or default
在上面这个中,如果
slow_function
是None
(这是“假”),它将返回后一个值,否则,如果slow_function
返回一个“真实”值,它将返回。请注意,如果slow_function
可以返回其他“虚假”值,例如False
、[]
或 0,这些将被忽略。或者,有时您拥有的是完全有效的代码。您想与一个值进行比较,如果它是值,则返回它。您拥有的代码的作用显而易见,有时这比代码的“聪明”更重要。
根据评论,如果您的代码必须在值为 None
时继续运行,那么 最明显 的方法是将其存储为临时值。但是,这不是一件坏事,因为它读取干净。
- 计算一个值并将其存储为结果
- 如果有有效结果,则返回。
- 否则,继续做一些事情以获得更好的结果。
更好 通常是非常主观的,从计算的角度来看,我看不出有任何明显的方法可以改进这一点,而且正如所写的那样,它非常易于阅读,这是一个明显的优势。其他解决方案可能更短或更聪明,但人类可读性通常是代码的一个被忽视的优势。
关于python - Python 中更好的 "return if not None",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19415614/