我已经看到了两种在Python中创建无限循环的方法:

while 1:

do_something()

while True:

do_something()

这些之间有什么区别吗? 一个比另一个更pythonic吗?

也许无限循环不是pythonic吗? (请参阅balpha)

从根本上讲,这并不重要,这样的细节并不会真正影响某些东西是否为" 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

因此,while True:稍微易于阅读,而while 1:对旧版本的Python则有点友善。由于这些天您不太可能需要在Python 2.2上运行,也不必担心循环的字节码计数,因此前者在某种程度上是可取的。

+1:很好的解释了为什么问题应该降到零以下。

我想指出的是,以我的拙见,做某事的最Python方式是不要为这样的细节烦恼。尽管该帖子绝对有趣且内容丰富,但我对此表示赞赏,但我坚持认为while True:更具Python风格。至少以我解释pythonic奇数词的方式,您的学习成绩可能会有所不同。

刚尝试做True = False,效果"如预期",有趣:)

如果您非常努力,仍可以在3.x中重新定义True。在3.0中,import builtins; builtins.__dict__[True] = 0可以做到;在3.3中,您必须有更多的创造力,但仍然有可能。如果情况变得更糟,您始终可以ctypes进入C API(或与其他实现等效)。有趣的是,编译器假定您无法做到,因此某些表达式将被编译出来,而另一些表达式将以实现/版本相关的方式使用您的新值。而且,如果您能很好地利用所有这些资源,则可能会找到更好的时间利用方式...

最Python的方式将永远是最易读的。使用while True:

对于C程序员而言,最易读的是1:。

" while 1:"与" for(;;)" :-)完全不同

@nomemory:问题是关于" Pythonic"的,它与C程序员几乎没有关系。如果您希望C程序员能读懂某些东西,请使用C。

@ S.Lott:我想说的是可读性是非常相对的。

没关系。两者都不难理解,尽管我个人总是使用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),这需要学习,但需要更少的样板,也没有机会犯傻。

都不行

它们都意味着我必须扫描代码以查找break,而不是能够在其所属位置看到停止条件。

我尝试尽可能避免这种情况,如果不可能,请让代码这样说:

while not found_answer:

check_number += 1

if check_number == 42:

found_answer = True

编辑:似乎上面的"避免"一词不够清楚。通常应该完全避免使用基本上无限的循环并将其从循环内的某个位置放置(使用break)。有时这是不可能的。在那种情况下,我喜欢使用类似上面的代码的东西,但是,它仍然表示相同的概念,上面的代码不过是一种折衷,但是至少,我可以像我一样在开始时就说明循环的目的不会调用函数do_something_with_args(*args)。

但是在您的代码中,您只需扫描代码中的found_answer = True。

我不认为这是可取的。通常使用break的原因是无法轻松或有效地表达停止条件。如果从字面上讲是使用像found_answer这样的变量,则必须扫描该变量而不是break-通常,您仍然需要continue而不是break才能使其退出循环。

@迈克·格雷厄姆:是的,我说我想完全避免这种情况。如果使用它,我会通过给布尔值一个名称来解释该循环停止的原因来使事情变得清晰(即可读)。

@Scott Griffiths:但是与True不同,not found_answer或not received_quit_command向代码读者讲了一些内容。

@balpha:那是一个公平的观点,但是当您真正需要的只是开始时的简单注释时,您不禁要引入一个新变量并添加一个额外的条件评估,以使循环的意图更加清楚,我感到不解。

@Scott Griffiths:...以及在break语句中。但是,是的,这可能是个问题。我喜欢在可能的地方使用函数和变量名作为"注释"。但是你的观点是正确的。无论如何,我的观点还是尝试做完全不同的事情。我真的不明白为什么我的答案不清楚。

如果您有一种算法可以在有限时间内终止,那么我建议您这样做,它总是比while True更安全:

maxiter = 1000

for i in xrange(maxiter):

# your code

# on success:

break

else:

# that algorithm has not finished in maxiter steps! do something accordingly

我在这方面不同意,并且有一所杰出的学校制定尽可能严格的标准。如果期望值是零,那么说" == 0"并且不要依赖" <= 1",因为为-1可能表示之前处理的完全非预期分支;否则,则为0。肯定会检测到一个无限循环,而其他代码仍然必须确保这一点。

IMO的第二种选择更为明显。

如果您可以摆脱while并编写更紧凑的代码,那可能更像pythonic。

例如:

# Get the even numbers in the range 1..10

# Version 1

l = []

n = 1

while 1:

if n % 2 == 0: l.append(n)

n += 1

if n > 10: break

print l

# Version 2

print [i for i in range(1, 11) if i % 2 == 0]

# Version 3

print range(2, 11, 2)

第一个版本也可以在尚未定义True的早期版本中使用。

在这一点上,为Python 3编程之后,无论如何仍然要保持向后兼容性。

我不知道哪个是不支持True的Python的最新版本?

我认为这主要是风格问题。两者都应该很容易理解为无限循环。

但是,我个人更喜欢第二种选择。这是因为它只需要花很少的时间就能理解,特别是对于没有C背景的程序员而言。

我相信第二个表达式更明确,因此更Python化。

更好的方法是"有条件时退出循环"时为"真"。

这只是样式问题,任何编程初学者都可以理解这两种选择。

但是,第二个选项仅在未将True分配给False的情况下才有效,这在Python 3之前是可行的:

>>> True = False

>>> True

False

那是一个很好的观察,但是与其他开发人员一起在项目上执行此操作的任何人几乎肯定会被打败他们一生。

是的,这当然只是玩笑。

python里while 1是什么意思_关于python:“ while 1”和“ while True”之间有什么区别?...相关推荐

  1. python里的英文歌叫什么_用Python分析韩国女团最喜欢的英文单词

    原标题:用Python分析韩国女团最喜欢的英文单词 本文经Python中文社区(公众号ID:python-china) 授权转载,转载请联系出处 ♚ 盛光晓,粗通python,精通arcpy,某公司首 ...

  2. python里的rindex是什么意思_用Python操作字符串之rindex()方法的使用

    用Python操作字符串之rindex()方法的使用 rindex()方法返回所在的子str被找到的最后一个索引,可选择限制搜索的字符串string[beg:end] 如果没有这样的索引存在,抛出一个 ...

  3. python里面的pip是什么意思_“pip install”和“python -m pip install”有什么区别?

    我有一个本地版本的Python 3.4.1,我可以运行python -m pip install,但是我无法找到pip二进制文件来运行pip install.这两者有什么区别? 解决方法: 他们完全一 ...

  4. 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型

    原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...

  5. python海龟图 如何控制线的粗细_使用Python中的高级turtle(海龟)作图方法

    在Python里,海龟不仅可以画简单的黑线,还可以用它画更复杂的几何图形,用不同的颜色,甚至还可以给形状填色. 一.从基本的正方形开始 引入turtle模块并创建Pen对象: >>> ...

  6. python交互式编程入门先学什么_为什么 Python 对于编程入门学习来说,是一门很棒的语言...

    在这篇文章里,我会来阐述下为什么我觉得 Python 对于计算机编程入门教学来说是一门很棒的编程语言(对基础编程课程更多观点可以查看这篇文章).这也是从我针对初学者Python 编程教学过程中获得并总 ...

  7. python程序设计课后答案第三单元_最新Python程序设计课后习题答案-第一单元

    精品文档 精品文档习题1 一.选择题 1.Python语言属于().C A.机器语言 B.汇编语言 C.高级语言 D.科学计算语言2.下列选项中,不属于Python特点的是().B A.面向对象 B. ...

  8. 基于python的数据爬取与分析_基于Python的网站数据爬取与分析的技术实现策略

    欧阳元东 摘要:Python为网页数据爬取和数据分析提供了很多工具包.基于Python的BeautifulSoup可以快速高效地爬取网站数据,Pandas工具能方便灵活地清洗分析数据,调用Python ...

  9. python简单代码运用到桌面壁纸_五行Python代码自动换你的电脑桌面壁纸(内附源码和exe)...

    很多行友问行哥,Python能不能自动更换电脑壁纸呀,今天它来了 只需要一行代码,指定图片地址即可更换电脑桌面.加上壁纸文件夹路径,让你随机更换电脑桌面,带来不期而遇的新鲜.使用爬虫技术,自动下载壁纸 ...

最新文章

  1. Python模块-创建和执行程序(或者脚本)
  2. spring-cloud-eureka服务注册与发现
  3. php mpdf html 转pdf,使用 MPDF 将HTML转为PDF,然后将该PDF转为PNG图片的时候,中文报错... ...汗血宝马...
  4. 【Top】Plan (updating...)
  5. STM32单片机硬件I2C驱动程序(软件轮询方式)---摘自:FeoTech
  6. JDK的bug导致Java文件删除不了,必须fgc
  7. 微擎系统 微信支付 get_brand_wcpay_request:fail
  8. 误删除libc.so.6的解决方法
  9. 维修频谱分析仪多少钱?简单告诉你,频谱分析仪维修实例报价
  10. 使用Audition将PCM格式转Wav格式
  11. Oracle12c使用AFD(Oracle ASM Filter Driver)特性部署集群的配置方法
  12. 常见电子元器件的分类与识别
  13. 大司、小司、外包公司
  14. pdf合并、生成目录大纲
  15. cannot find -l****问题的解决办法
  16. java web没有APP流行_简单粗暴,详细得不要不要的 JavaWeb快速入门
  17. 微信吸粉秘籍之人气论坛吸粉方法
  18. 程序设计思维 A - 区间选点 II(差分约束)
  19. Alpine Linux添加Let's Encrypt CA证书或者自签CA证书
  20. manjaro安装搜狗输入法(最简单,轻松三步)

热门文章

  1. Python3 02 数字(Number)、字符串、列表、元组、字典
  2. 不霁何虹 —— 彩虹为什么发生?
  3. 毫米波雷达FMCW技术理解
  4. 批量提取文件名的方法
  5. 牛客网练习赛34-A题
  6. 【牛客讨论区】第六章:Elasticsearch
  7. 关系代数和SQL练习(二)
  8. V4l2框架-平台V4L2驱动共性
  9. TensorFlow 1.0.0rc1上玩量化神经网络 ——转自 慢慢学TensorFlow 微信公众号
  10. sys/type.h