【问题标题】:2-Variable For Loop in PythonPython 中的 2 变量 For 循环
【发布时间】:2015-09-21 12:39:52
【问题描述】:

下面这个 C/C++ 代码 sn-p 的 Python 等效项是什么?

// The rest of the code.
for (i = 1, j = 0; i < 10, j < 19; ++i, j += 2)
{
    // The body of the loop.
}

【问题讨论】:

  • 尝试一下。顺便说一句:这也是糟糕的 C/C++
  • 条件i&lt;10,j&lt;19 不符合您的想法。
  • @sbhayana26 抱歉,我写的代码有误,不会运行。
  • @CoolGuy 但它只是跑了!
  • 它不会运行,解包的值太多

标签: python python-3.x for-loop


【解决方案1】:

你可以试试这个:

for i,j in zip(range(1,10),range(0,19,2)):

你有两件事要理解:

  • range() 的工作原理
  • zip() 的工作原理

范围需要 3 个参数。开始、结束和递增。

第一个是包容的,第二个是独占的,第三个就像c/c++中的增量。

range(1,10)

由于第一个是包含的,它将从 1 开始,而由于第二个是独占的,它将在 9 结束。默认增量为 1。

range(0,19,2)

如你所愿,循环将从 0 开始,到 18 结束,并以 2 递增。

【讨论】:

  • 请注意,这与作为最终循环迭代发布的 C 代码不同,在这种情况下具有 i=10, j=18 而您的将在 i=9, j=16 之后停止
  • @Duncan 这就是我不那么 Pythonic 的回答是关于 ;-)
【解决方案2】:

将“2-Variable For Loop”从C/C++逐步翻译成python(注意陷阱[1]):

# loop initialization 
i = 1
j = 0

# loop condition
while (j < 19):

    # The body of the loop.

    # loop increment
    i +=1
    j +=2

[1] C/C++ sn-p 有一个“陷阱”,参见live demo 说明:for 循环的所有部分(初始化、条件、增量)都是按顺序计算的, 但是 init 和 inc 是为了它的副作用而完成的,条件的目的是获得一个布尔值。条件的两个部分在每个循环中都会被评估,但只有第二个(因为最后一个)被视为实际的循环条件(第一个的结果被丢弃了)。

【讨论】:

  • 这将工作,但它不是远程Pythonic。 Python 最佳实践与 C/C++ 最佳实践一样,是将循环记帐的代码组合在一起,而不是跨越实际迭代业务逻辑的两侧。 OP 可能 意味着 的最佳 Python 与其他答案一样:for i, j in zip(range(1,10), range(0,19,2)):。 OP 编写的 Python 涉及 itertools:for i, j in zip(it.count(1), range(0,19,2)):
  • 另外,您对i&lt;10,j&lt;19 检查的解释不清楚-您的措辞方式听起来像是在程序的生命周期中对整个条件进行了两次检查。我想你的意思是 i&lt;10j&lt;19 部分在每次迭代时都进行了测试,但总体结果正是第二部分的结果,而 i&lt;10 的结果被忽略了。跨度>
  • 感谢@lvc 阅读,我试图澄清。你所说的关于 python 和 C/C++ 风格的一切都是真的。这是我作为对该问题的评论留下的第一印象。
【解决方案3】:

试试这样:

for i,j in zip(range(1, 10), range(0, 19, 2)):
    # the body

【讨论】:

  • 我认为这对于这种 C/C++ 程序员来说并不容易理解 ;-) 但我学到了一些新东西 :-)
  • 也许是问题中的 C/C++ 陷阱? (顺便说一句:我投了赞成票)
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 2021-01-02
  • 2010-11-13
  • 2014-01-21
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多