繁体   English   中英

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

[英]How to organize this loop in a more elegant Pythonic way

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

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的中间值用于循环体内的某些东西,那当然才有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM