3

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

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

但是这两个变量赋值有点让我觉得。有没有更优雅的方式来写这个?

4

5 回答 5

4

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

简单胜于复杂的方法:

while reduction_pass(dataset) > 0: pass

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

from itertools import *
list(takewhile(lambda x: x > 0, starmap(reduction_pass, repeat((dataset,)))))
于 2011-10-24T09:04:25.487 回答
1

你可以得到一个迭代器

it = iter(lambda: reduction_pass(dataset), 0)

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

有了这个迭代器,你可以做

for num_removed in it:
    do_whatever()
于 2011-10-24T09:08:32.697 回答
0

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

如果你觉得这两个 var 赋值很烦人,也许这样会更好:

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

尽管通常我认为您不必担心太多。

于 2011-10-24T08:57:28.240 回答
0

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

num_removed = None
while num_removed is None or num_removed > 0:
    num_removed = reduction_pass(dataset)
于 2011-10-24T08:58:15.150 回答
0

带有中断的while循环通常是最简单和最好的,但是假设当您说要循环时,num_removed > 0您实际上可能意味着num_removed != 0,这是一个相当干净的替代方案:

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

num_removed当然,这只有在您确实需要循环体内的某些东西的中间值时才有意义。

于 2011-10-24T09:12:13.617 回答