2013-10-31 83 views
-4
def love6(a, b): 
    if a==6 or b==6 or a+b==6 or abs(a-b)==6: 
     return True 
    return False 

我只做了一个python的return语句,为此我可以理解使用“return True”,但我无法理解使用“return False”? 这是通过python中的标准编程使用return语句的正确方法吗?或者这是使用return来忽略某些语句行的快捷方式?“if else”in python

+1

下载者在编辑之前缩进的代码只有一个空格,导致“快”的混淆。 –

回答

1

在Python中,缩进控制块中的语句进入。在这种情况下,“return False”是love6函数的一部分,因为它只有一组4个空格,并且返回True是if语句的一部分,因为它有两组4个空格。因此,如果if语句条件为真,则函数将返回True,否则函数将返回False。该功能可以更紧密地写为:

def love6(a,b): 
    return a==6 or b==6 or a+b==6 or abs(a-b)==6 
7

默认情况下,python函数返回None,除非通过return语句明确告知其他操作。

显然,该函数的规范是,如果a是6,它应该返回True,否则返回False。没有第二次返回,该函数将不会返回False,它将返回None。

Zen of Python (PEP 20)的第二条规则是“显式优于隐式”。此代码遵循该原则,显式返回True或False,而不依赖于None的隐式返回。

6

如果if声明不的比赛,该return True线执行,该代码继续第二return声明。

如果第二个返回语句不存在,该函数就会结束,并返回默认返回值None

虽然功能可以简化;在if声明本身使用的表达已经评价要么TrueFalse

def love6(a, b): 
    return a==6 or b==6 or a+b==6 or abs(a-b)==6 

if语句和两条回报是完全多余的位置。

+0

这里只是一个nitpicker,但是如果'a'是'__eq __()'返回输入'6'(即不是bool)的'5'的对象,那么'love6'会返回什么? ;-) – Alfe

+0

@Alfe:当然,如果'a'或'b'具有自定义'__eq__'挂钩,那么断言该语句返回一个布尔值是不正确的。但是这种自定义行为很少见(通常由ORM库使用)。 –

2

你的代码基本上与此相同:

def love6(a, b): 
    if a==6 or b==6 or a+b==6 or abs(a-b)==6: 
     return True 
    else: 
     return False 

您需要的最后return,因为没有它,该函数将返回None如果if语句的评价回来False。但是,您不需要else,因为Python一旦命中return,就会退出封闭函数。

+0

性能:'in'版本需要计算所有四个值,然后可以检查它们是否为'6'。只要找到匹配项,'或'版本就可以短路。所以从性能的角度来看'或'更好。你可以像(6)in(x()for x in(lambda:a,lambda:b,lambda:a + b,lambda:abs(ab)))''那样使用......但是这不再短;-) – Alfe

+0

@Alfe - 确实如此。这就是为什么我说“这个功能够简单”。这个功能的作用非常简单,所以两者之间的时间差异可以忽略不计。但是,是的,对于更大的功能,使用多个“或”是一个好习惯。 – iCodez

+0

让我们希望'a'和'b'不是一些数字类的实例,比'int'或'float'更复杂,因此'a + b'需要半个小时;-) – Alfe

2

如果return False是不存在,那么任何时候,条件是不正确的,该函数将不会返回任何东西。或者说,它会返回None,因为这是默认值;这可能意外地工作,因为None是虚假的,但通常更好的是明确的;使用隐含的代码None通常是一个错误。

FWIW,如果函数只是返回条件的结果,您可以...返回条件的结果:

return (a==6 or b==6 or a+b==6 or abs(a-b)==6)