与其他几个答案一样,以下是我实际翻译该代码的方式:
boolean_flag = True
i = 1 # actually I wouldn't use i as a variable name, but whatever.
while i < 20 and boolean_flag:
# code goes here
i *= 2
我也会考虑使用for 循环,它可能看起来像这样:
from itertools import takewhile, count
boolean_flag = True
for i in takewhile(lambda i: i < 20, map(lambda x: 2**x, count())):
# code goes here
if not boolean_flag:
break
但考虑到两者之后,我更喜欢 while 循环。在实践中,我非常 很少需要在这样的循环中定义一个标志。通常,您可以立即从循环中break 检测到会导致您设置标志的条件,或者使用如下逻辑:
boolean_flag = something()
something_that_has_to_happen_after_regardless_of_flag_value()
if not boolean_flag:
break
对布尔“break”标志的需求主要是(不完全是)尝试编写所有没有break 的循环的结果,但这样做并没有什么特别的好处。
也许可以挽救for 循环,或者至少学习一些有关Python 的东西,通过尝试其他方法来编写for 之后的内容。就像lambda i: i < 20 可能是(20).__gt__,但这以它自己的方式令人叹为观止。或者map(lambda 始终是一个警告标志,在这种情况下map(lambda x: 2**x, count()) 可以替换为(2**x for x in count())。或者您可以使用functools.reduce 将幂运算改回乘法,但这不太值得。或者你可以编写一个生成器函数,但这是一个更多样板。
假设我知道 20 的以 2 为底的对数只能这么大,但我不想让自己成为愚蠢的错误的人质,我可以这样写:
for i in (2**x for x in range(10)):
if not i < 20:
break
或者摆脱所有“聪明”的东西:
for x in range(10):
i = 2 ** x
if not (i < 20 and boolean_flag):
break
但同样,这并不能真正解决 for 循环的基本问题,当您有一个包含正确值的可迭代对象时,在 Python 中您需要将几件事放在一起以提出正确的可迭代对象对于这种情况(特别是如果你想写 20 而不是 20 的对数)。这甚至在你处理旗帜之前。所以,一般来说,当你有一些东西要迭代时,你会使用for 循环,或者很容易 产生一些东西来迭代,然后使用while 循环来进行基于变异本地的更一般的循环变量。
坦率地说,对于那些具体的数字,你不妨写for i in (1, 2, 4, 8, 16) 并完成它!