如何在Python的while测试中增加计数器

时间:2012-09-08 15:00:55

标签: python while-loop increment

您如何将以下Java习惯用法翻译成Python?

Comparable[] a, int lo, int hi;
int i = lo, j = hi+1;
Comparable v = a[lo];

while (a[++i] < v) if (i == hi) break;

我的问题是,在测试时我无法拥有++ii += 1

4 个答案:

答案 0 :(得分:8)

你在Python中不能这样做的问题是对Python语法的限制。让我们从文档中了解while的样子:

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]

正如您所看到的,您必须在“”之前添加表达式,而x += 1是一个声明(并且语句不会返回任何声明值因此不能用作条件)。

这是Python中代码的样子:

i += 1
while a[i] < v:
    if i == hi:
        break
    i += 1

虽然它有效,但它很可能不是解决问题的Python方法。如果您有一个集合并且想要使用索引,则必须使用for循环和enumerate内置函数来重新设计代码。

<强> P.S。

无论如何,在具有完全不同的哲学的语言之间直接移植代码并不是一个好方法。

答案 1 :(得分:4)

Java代码将i设置为第一个元素&gt; = a [lo]的索引,或者设置为hi,无论哪个先出现。所以:

v = a[lo]
for i in range(lo+1, hi+1):
    if a[i] >= v:
        break

答案 2 :(得分:1)

如果要迭代列表中的所有对象或任何可迭代的对象。事情,使用&#34;列表中的项目&#34;。如果您还需要一个计数器,请使用枚举。如果你想要一系列数字,请使用range或xrange。

但是有时候你真的想要一个带有计数器的循环,这个计数器刚刚上升,你可以通过中断或返回来突破,就像在原始海报的例子中一样。

对于这些场合,我定义了一个简单的发生器,以确保我不会忘记增加计数器。

def forever(start=0):
    count = start
    while True:
        yield count
        count += 1

然后你可以写下这样的东西:

for count in forever():
    if do_something() == some_value:
        break
return count

答案 3 :(得分:0)

list类有一个内置的方法可以进行这种搜索,但无论出于何种原因,它只比较相等。当然,我们可以破解:

class hax:
  def __init__(self, value): self.value = value
  def __eq__(self, other): return other >= self.value

a.index(hax(a[lo]), lo + 1, hi + 1)

...但请不要:)

无论如何,你不仅不应该试图直接移植代码,正如@Rostyslav建议的那样 - 你不应该直接尝试移植问题。有一些非常奇怪的Python程序使用列表的方式会出现这样的问题。