Sri*_*thy 23 python infinite-loop while-loop
我已经看到了两种在Python中创建无限循环的方法:
while 1:
do_something()
Run Code Online (Sandbox Code Playgroud)while True:
do_something()
Run Code Online (Sandbox Code Playgroud)这些之间有什么区别吗?比另一个更pythonic?
gz.*_*gz. 45
从根本上说它没关系,这种细节并不会真正影响某些东西是否是"pythonic".
如果你对琐事感兴趣,那就有一些不同之处.
在Python 2.3之前,内置布尔类型不存在,因此打算在古代版本上运行的代码倾向于使用该while 1:表单.例如,您将在标准库中看到它.
True和False内置函数不是Python 3之前的保留字,因此可以分配给它们,改变它们的值.这有助于上面的情况,因为代码可以True = 1用于向后兼容,但意味着True每次使用时都需要在全局字典中查找名称.
由于上述限制,两个版本编译的字节码在Python 2中是不同的,因为它不能用于常量整数的优化True.因为Python可以告诉它何时编译1它总是非零,它会删除条件跳转并且根本不加载常量:
>>> import dis
>>> def while_1():
... while 1:
... pass
...
>>> def while_true():
... while True:
... pass
...
>>> dis.dis(while_1)
2 0 SETUP_LOOP 5 (to 8)
3 >> 3 JUMP_ABSOLUTE 3
6 POP_TOP
7 POP_BLOCK
>> 8 LOAD_CONST 0 (None)
11 RETURN_VALUE
>>> dis.dis(while_true)
2 0 SETUP_LOOP 12 (to 15)
>> 3 LOAD_GLOBAL 0 (True)
6 JUMP_IF_FALSE 4 (to 13)
9 POP_TOP
3 10 JUMP_ABSOLUTE 3
>> 13 POP_TOP
14 POP_BLOCK
>> 15 LOAD_CONST 0 (None)
18 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)所以,while True:它更容易阅读,并且while 1:对旧版本的Python有点好处.由于您现在不太可能需要在Python 2.2上运行,或者需要担心循环的字节码计数,因此前者略微优先.
por*_*uod 10
最pythonic方式永远是最可读的方式.使用while True:
这并不重要.虽然我个人总是使用while True,但它更难以阅读或理解.
更一般地说,人们用Python编写的大量while-break循环可能是其他东西.有时候我会看到人们写作i = 0; while True: i += 1 ...,可以在for i in itertools.count()写while True: foo = fun() if foo is None: break这篇文章的时候用人们写作,这可能for foo in iter(fun, None)需要学习,但需要更少的样板和机会来犯愚蠢的错误.