从for循环返回的Python
哪一种是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
# 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]