哪种是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
我觉得使用第二种风格感到不安,因为它会在不破坏循环的情况下返回。
注意:代码段只是一个示例。
答案 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
而不是True
和False
,为什么你&# 39;首先在一个范围内重复迭代。所以,风格3或4:
def check3(value):
return value in range(10)
def check4(value):
return 0 <= value < 10