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

如何在Python的while测试中增加计数器,python,while-loop,increment,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; 可比[]a,int-lo,int-hi; int i=低,j=高+1; 可比v=a[lo]; 如果(i==hi)中断,则(a[++i]

如何将下面的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;
可比[]a,int-lo,int-hi;
int i=低,j=高+1;
可比v=a[lo];
如果(i==hi)中断,则(a[++i]

我的问题是,在while测试中,我不能使用
++I
I+=1

在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
i+=1
而a[i]
虽然它可以工作,但它很可能不是解决问题的Python方法。当您有一个集合并且想要使用索引时,您必须期待使用
for
循环和内置函数重新设计代码

p.S.


无论如何,在具有完全不同原理的语言之间直接进行代码移植不是一个好办法。

Java代码将i设置为第一个元素>=a[lo]的索引,或者设置为hi,以先出现的为准。因此:

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

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程序使用列表的方式可能会出现这样的问题,这一点非常奇怪。

如果您想迭代列表中的所有对象或任何“iterable”对象,请使用“for item in list”。如果您还需要计数器,请使用enumerate。如果您想要一个数字范围,请使用range或xrange

但是有时候你真的想要一个带计数器的循环,它会上升,你会用break或return来打破它,就像原始海报的例子一样

对于这些情况,我定义了一个简单的生成器,以确保不会忘记递增计数器

def forever(start=0):
    count = start
    while True:
        yield count
        count += 1
然后你可以写一些东西,比如:

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

预期结果如何
i
lo
hi
之间的最高索引,低于
i[lo]
?顺便说一句,我不认为这是语法限制。这是语言强加的一个哲学上的限制。我的代码需要检查“a[++i]i,然后进行测试。这在功能上是一样的。@user1656850:您对示例的分析是错误的。这里的Python while循环将产生与Java代码相同的结果。