【问题标题】:Loop with conditions in python在python中循环条件
【发布时间】:2011-05-18 11:02:12
【问题描述】:

考虑下面的 C 代码:

for(int i=0; i<10 && some_condition; ++i){
    do_something();
}

我想用 Python 写一些类似的东西。我能想到的最好的版本是:

i = 0
while some_condition and i<10:
    do_something()
    i+=1

坦率地说,我不喜欢模仿 for 循环的 while 循环。这是由于忘记增加计数器变量的风险。解决此风险的另一种选择是:

for i in range(10):
    if not some_condition: break
    do_something()

重要说明

  1. some_condition并不是要在循环过程中计算,而是首先指定是否开始循环

  2. 我指的是Python2.6

首选哪种风格?有更好的习惯用法吗?

【问题讨论】:

  • 我认为这是个人喜好问题。
  • 哪个版本的 Python?
  • 我认为 Python 应该有一个类似 do &lt;expr&gt; times: 的结构,以允许您明确表明您实际上不会使用循环计数器。
  • Karl:for _ in range(10) 似乎是一种常用的表示方式,但如果您碰巧使用 gettext,这当然是一个可怕的想法。

标签: coding-style python idioms


【解决方案1】:

这可能不相关,但这是我习惯做的事情......如果some_condition 足够简单,请将其放入一个函数和filter 您迭代的项目中:

def some_condition(element):
    return True#False

for i in filter(some_condition, xrange(10)):
    pass

您也可以在迭代某些元素列表时使用这种方法。

selected = filter(some_condition, to_process)
for i, item in enumerate(selected):
    pass

同样,这可能不是你的情况,你应该根据你的问题选择过滤项目的方法。

【讨论】:

  • 或者,让它更短,可读性更差:for i in filter(lambda x: True, range(10)): do_something()
【解决方案2】:

一般来说,“range + break”样式是首选 - 但在 Python 2.x 中,使用 xrange 而不是 range 进行迭代(这会按需创建值而不是实际生成一个数字列表)。

但这总是取决于。在这种情况下,数字 10 有什么特别之处? some_condition 到底是什么?等等。

对更新的回应:

听起来some_condition 是一个“循环不变量”,即在循环期间不会改变。在这种情况下,我们应该先对其进行测试:

if some_condition:
  for i in xrange(10):
    do_something()

【讨论】:

  • 10 和 range 只是示例,这可能是 for i in my_array。正如问题中所阐明的,some_condition 控制程序是需要执行循环还是完全跳过它
  • 您的版本简单明了且有效。我只是想节省额外的缩进。谢谢
【解决方案3】:

for 具有恒定上限的循环在 Python 中有点少见。如果您正在迭代 somearray,您可能会这样做:

for i in xrange(len(somearray)):
    if not some_condition:
        break
    do_sth_with(i, somearray[i])

或者,更好:

for i, item in enumerate(somearray):
    if not some_condition:
        break
    do_sth_with(i, item)

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    相关资源
    最近更新 更多