Python从for循环返回

时间:2014-07-07 03:52:55

标签: 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
    return False

我觉得使用第二种风格感到不安,因为它会在不破坏循环的情况下返回。

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

2 个答案:

答案 0 :(得分:3)

这是相当复杂的,你将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中根本不存在问题,事实上只要你的函数中的每个出口点都清楚,就应该鼓励它。

进一步的建议:

比这更好,返回真或假会更像Pythonic。

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

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

对评论员的解释:

为了向混乱的评论员解释,在Python 2中,你不想使用范围,因为它在测试成员资格之前实现了内存中的整个列表。

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

>>> 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(10)')
[0.2592649459838867, 0.25824499130249023, 0.2570168972015381]
>>> timeit.repeat('4 in range(10)')
[0.30319905281066895, 0.2991337776184082, 0.31210994720458984]

这个额外的时间随着列表的大小而增长很多:

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

答案 1 :(得分:2)

样式2,虽然我也问你为什么要回归1-1而不是TrueFalse,为什么你&# 39;首先在一个范围内重复迭代。所以,风格3或4:

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

def check4(value):
    return 0 <= value < 10