所以我有一个函数可以减少一些数据集,并返回删除的元素数量。一旦函数操作期间减少的项目数为零,我必须停止应用它。目前我有这个:
num_removed = reduction_pass(dataset)
while num_removed > 0:
num_removed = reduction_pass(dataset)
但是这两个变量赋值有点让我觉得。有没有更优雅的方式来写这个?
我假设您实际上并不需要最终的返回值,因为我假设它表示已删除元素的数量,在最后一次传递中显然始终为 0。
简单胜于复杂的方法:
while reduction_pass(dataset) > 0: pass
炫耀,显然不严肃的方式:
from itertools import *
list(takewhile(lambda x: x > 0, starmap(reduction_pass, repeat((dataset,)))))
你可以得到一个迭代器
it = iter(lambda: reduction_pass(dataset), 0)
它在每一步都调用给定的函数并在检索到 0 时停止。
有了这个迭代器,你可以做
for num_removed in it:
do_whatever()
是的,Python 不允许在条件控制结构中使用语句。它有它的优点,也有它的缺点。
如果你觉得这两个 var 赋值很烦人,也许这样会更好:
while True:
num_removed = reduction_pass(dataset)
if num_removed <= 0:
break
尽管通常我认为您不必担心太多。
对我来说最明显的方法是:
num_removed = None
while num_removed is None or num_removed > 0:
num_removed = reduction_pass(dataset)
带有中断的while
循环通常是最简单和最好的,但是假设当您说要循环时,num_removed > 0
您实际上可能意味着num_removed != 0
,这是一个相当干净的替代方案:
for num_removed in iter(lambda: reduction_pass(dataset), 0):
pass
num_removed
当然,这只有在您确实需要循环体内的某些东西的中间值时才有意义。