我必须对一些现有的(非常旧的(C库进行几乎1:1的Python翻译,并发现了一个问题。
原始代码是:
int i, n;
//...
for (i = 0; i < n; i++)
if (someCondition(i))
doSomething();
break;
if (i == n)
doSomeOtherStuff();
它被翻译成
for i in range(n):
if someCondition(i):
doSomething()
break
if i == n:
doSomeOtherStuff()
问题是,如果someCondtion(i)
为真,则i
等于循环后的n - 1
。
我的解决方案是
found = False
for i in range(n):
if someCondition(i):
doSomething()
found = True
break
if not found:
doSomeOtherStuff()
有没有更好的解决方案?我更喜欢代码更改最少的解决方案,以便仍然能够比较 C 和 Python 实现。Python 代码仅用于测试,C 实现是生产代码。因此,没有性能要求,只有可读性。
Python for
语句有一个可选的else
套件,如果项目用尽,则执行该套件,但如果您提前break
或以其他方式退出循环,则不会执行。因此,您可以将该代码编写为:
for i in range(n):
if someCondition(i):
doSomething()
break
else:
doSomeOtherStuff()
使用更多的pythonic习语,如for..else
:
for i in range(n):
if some_condition(i):
do_something()
break
else:
do_something_else()
如果循环未中断,则执行else
。
或者,甚至更好:
if any(map(some_condition, range(n))):
do_something()
else:
do_something_else()
请参阅: any
, map