如何以更优雅的Pythonic方式组织这个循环

时间:2011-10-24 08:54:03

标签: python loops iterator do-while

所以我有一个减少一些数据集的函数,并返回删除的元素数。一旦在功能操作期间减少的项目数为零,我必须停止应用它。目前我有这个:

num_removed = reduction_pass(dataset)
while num_removed > 0:
    num_removed = reduction_pass(dataset)

但是这两个变量赋值给我了。有没有更优雅的方式来写这个?

5 个答案:

答案 0 :(得分:4)

我假设你实际上并不需要最终的返回值,因为我认为它表示已删除元素的数量,在最后一次传递中显然总是为0。

简单易于复杂的方式:

while reduction_pass(dataset) > 0: pass

炫耀,显然不严肃的方式:

from itertools import *
list(takewhile(lambda x: x > 0, starmap(reduction_pass, repeat((dataset,)))))

答案 1 :(得分:1)

您可以使用

获取迭代器
it = iter(lambda: reduction_pass(dataset), 0)

,在每一步中,调用给定的函数,并在检索到0时停止。

使用这个迭代器,你可以做到

for num_removed in it:
    do_whatever()

答案 2 :(得分:0)

是的,Python不允许条件控制结构中的语句。它有它的优点,它有它的缺点。

如果您发现两个var分配如此烦人,可能这样更好:

while True:
  num_removed = reduction_pass(dataset)
  if num_removed <= 0:
    break

虽然我一般认为你不应该担心它太多。

答案 3 :(得分:0)

对我来说最明显的方式是:

num_removed = None
while num_removed is None or num_removed > 0:
    num_removed = reduction_pass(dataset)

答案 4 :(得分:0)

带有中断的while循环通常是最简单和最好的,但是假设当你说num_removed > 0时你可能实际意味着num_removed != 0,那么这里是相当干净的替代方法:

for num_removed in iter(lambda: reduction_pass(dataset), 0):
    pass

如果您确实需要num_removed的中间值用于循环体内的某些内容,那么这只是理所当然的。