所以我有一个减少一些数据集的函数,并返回删除的元素数。一旦在功能操作期间减少的项目数为零,我必须停止应用它。目前我有这个:
num_removed = reduction_pass(dataset)
while num_removed > 0:
num_removed = reduction_pass(dataset)
但是这两个变量赋值给我了。有没有更优雅的方式来写这个?
答案 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
的中间值用于循环体内的某些内容,那么这只是理所当然的。