python使用函数的结果来决定是否应该使用函数结果

时间:2017-04-17 11:20:54

标签: python function if-statement

通常您希望使用None作为函数的返回值。如果你想要在函数返回None时做一件事并且如果不使用函数的结果,那么是否存在Python习惯用法以避免调用函数两次。以下是一个愚蠢的例子。

def foo(a, b):
  if b == 0:
    return(None)
  else:
    return(a/b)


a = b = 2
if foo(a, b) is None: #Do one thing. 1st call to function.
  print('b cannot be null')
else: #Use the result of function. 2nd function call.
  print('The result is: ' + str(foo(a,b)) )

这种有状态的方式是替代方案(只有一个函数调用,但需要将结果分配给一个变量)?:

res = foo(a, b)
if res is not None: 
  print('The result is: ' + str(res) )
else:
  print('b cannot be null')

1 个答案:

答案 0 :(得分:2)

在你的例子中,foo返回None表示:"参数中的某些内容是错误的,我无法返回有效值"。 在这种情况下,使用例外会更清楚:

def foo(a, b):
    if b == 0:
        raise ValueError("b can't be zero")
    else:
        return a/b

因此,如果b为空,则foo不会返回任何内容 - 并且您不必测试返回值以检查它是否有效,或者它是否意味着"发生了一些错误"。如果foo返回某些内容,您就确定它是有效的结果。

现在,要使用foo,您可以使用try ... except块:

a = 2
b = 0

try:
    print('The result is: ' + str(foo(a,b)) )
except ValueError as msg:
    print(msg)

# b can't be zero

如果你没有在foo中拨打这样的电话,那么你的程序将会停止并提供一条信息丰富的错误消息:

foo(a, b)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-36-89e9686ab4be> in <module>()
     14     print(msg)
     15 
---> 16 foo(a, b)

<ipython-input-36-89e9686ab4be> in foo(a, b)
      1 def foo(a, b):
      2     if b == 0:
----> 3         raise ValueError("b can't be zero")
      4     else:
      5         return a/b

ValueError: b can't be zero

这也很好,因为你的程序应该在出现问题时立即失败。