您如何将以下 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;
我的问题是在 while 测试中我不能有++i
or i += 1
。
您如何将以下 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;
我的问题是在 while 测试中我不能有++i
or i += 1
。
在 Python 中你不能这样做的问题是 Python 语法的限制。让我们while
从文档中了解一下:
while_stmt ::= "while" expression ":" suite
["else" ":" suite]
如您所见,您必须将表达式放在“ : ”之前,whilex += 1
是一个语句(并且语句不返回任何值,因此不能用作条件)。
这是这段代码在 Python 中的样子:
i += 1
while a[i] < v:
if i == hi:
break
i += 1
尽管它有效,但它很可能不是解决您问题的 Python 方法。当你有一个集合并且你想使用索引时,你必须期待使用for
循环和enumerate
内置函数重新设计你的代码。
附言
无论如何,在具有完全不同哲学的语言之间直接移植代码并不是一个好方法。
Java 代码将 i 设置为第一个元素的索引 >= a[lo],或者设置为 hi,以先出现的为准。所以:
v = a[lo]
for i in range(lo+1, hi+1):
if a[i] >= v:
break
如果要遍历列表中的所有对象或任何“可迭代”事物,请使用“for item in list”。如果您还需要计数器,请使用枚举。如果您想要一个数字范围,请使用 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
该类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 程序有一些非常奇怪的地方,它使用列表的方式会允许出现这样的问题。