从for循环返回的Python

从for循环返回的Python,python,if-statement,Python,If Statement,哪一种是Python中的最佳实践 # style1 def check(value) for i in range(10): if i==value: break else: return False return True #style2 def check(value) for i in range(10): if i==value: return True

哪一种是Python中的最佳实践

# style1
def check(value)
    for i in range(10):
        if i==value:
            break
    else:
        return False
    return True

#style2
def check(value)
    for i in range(10):
        if i==value:
            return True
    return False
我觉得使用第二种样式很不方便,因为它返回时不会中断循环


注意:代码片段只是一个示例。

样式2,尽管我还想问为什么返回
1
-1
,而不是
True
False
,以及为什么首先要在一个范围内迭代。所以说真的,风格3或4:

def check3(value):
    return value in range(10)

def check4(value):
    return 0 <= value < 10
def check3(值):
范围内的返回值(10)
def check4(值):

return 0这相当复杂,您使用break作为goto语句

def check(value)
    for i in range(10):
        if i==value:
            break
    else:
        return -1
    return 1
只需做直接的事情,它更简单,更容易阅读,使用更少的控制流和代码行,因此更易于维护:

def check(value)
    for i in range(10):
        if i==value:
            return 1
    return -1
我注意到您对退出循环之前返回的担忧,在Python中这一点都没有问题,事实上,只要函数中的每个退出点都是明确的,就应该鼓励这样做

进一步建议: 比这更好的是,返回True或False更符合python

在Python3中,对于此代码,您可以简单地执行此操作,因为range支持成员资格测试:

def check(value)
    return value in range(10) # in Python 2, use xrange

对评论员的解释: 为了向困惑的评论员解释,在Python2中,您不想使用range,因为它在测试成员资格之前在内存中具体化了整个列表

您可以通过反汇编代码看到这一点:

>>> dis.dis('4 in range(10)')
          0 DELETE_SLICE+2 
          1 SLICE+2        
          2 BUILD_MAP        8302
          5 POP_JUMP_IF_FALSE 28257
          8 BUILD_LIST      10341
         11 <49>           
         12 <48>           
         13 STORE_SLICE+1  
这个额外的时间随着列表的大小而增加:

>>> timeit.repeat('4 in xrange(100)')
[0.2945590019226074, 0.25594496726989746, 0.2511298656463623]
>>> timeit.repeat('4 in range(100)')
[0.7569739818572998, 0.7626628875732422, 0.7740590572357178]

IHMO这将是非常固执己见的。
check()
的两个版本都完全有效。请参阅第一个样式的缩进是否有错误?@user2963623:否,Python支持循环上的
else
子句。如果循环没有
中断
,那么
else
将运行。我之所以说style2,唯一的原因是不是所有语言都有else,所以你很可能会花上10秒钟的时间。根据我的经验,很多python开发人员都不熟悉style1。记住,并不是每个人都认为他们需要阅读手册。在我看来,样式2的可读性也更高。
中的
操作于iterables,而不仅仅是列表,因此Python 2还支持范围(y)
中的
x。在Python 2中,您不是在范围对象上测试它,而是具体化整个列表,然后测试数字是否在列表中,它的效率要低得多。
xrange
不支持
\uuuuuuuuuuuuuuuuuuuuu
。成员资格测试在xrange中迭代。另外,请注意,Python3的
范围
仅在
中对int和bool有效。如果出于某种原因,您尝试将其与另一种类型(例如NumPy int32)一起使用,则它必须遍历范围。我认为此时我们确实超出了问题的范围。在Python 2中,范围返回一个列表。这很容易演示:
类型(范围(10))
=>
,帮助非常明确,因为它返回一个列表。参见文档:对于稍微复杂的情况,
任何
/
所有
都可以使用。。。在这个问题真正有意义之前,代码片段需要更加复杂。这并没有真正解决提问者的问题。@Aronhall这是一个有点奇怪的问题,但答案实际上只是“样式2很好”。
>>> timeit.repeat('4 in xrange(100)')
[0.2945590019226074, 0.25594496726989746, 0.2511298656463623]
>>> timeit.repeat('4 in range(100)')
[0.7569739818572998, 0.7626628875732422, 0.7740590572357178]