2011-10-24 82 views
3

所以我有一個函數可以減少某些數據集,並返回刪除的元素數量。一旦在功能操作期間減少的項目數量爲零,我必須停止應用它。目前我有這樣的:如何以更優雅的Pythonic方式組織這個循環

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

但這兩個變量賦值類型得到我。有沒有更優雅的寫法呢?

回答

4

我想你實際上並不需要最後的返回值,因爲我認爲它表明移除的元件的數量,這顯然會始終爲0最後一關。

簡單的就是更好超複雜的方式:

while reduction_pass(dataset) > 0: pass 

放映過,顯然,不嚴肅的方式:

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

這是較少的變量賦值和有效,但這有點模糊! –

+1

簡單的方法拋出你的主要原因是我們通常期望在該上下文中使用的表達式是「純」的,即沒有副作用。在這裏,我們明確地使用它的副作用。這有點像在C或C++中濫用'for'語句的第三部分。 –

+0

我發現簡單的方法是非常可讀的(如果不是對於「通過」稍微過分的需要),這在我眼中是編程目標的一部分。雖然也許這與我習慣於讀取/寫入相當多的C代碼有關,因爲這種構造一直在使用:p – Nico

0

是的,Python不允許條件控制結構中的語句。它有它的優點,並且有它的缺點。

如果你發現這兩個變種的任務很討厭,也許這是更好的:

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

雖然一般,我不認爲你應該擔心太多。

0

對我來說,最明顯的方法是:

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

你可以得到一個迭代器

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

其中每一步調用給定的函數,並在檢索到0時停止。

有了這個迭代器,你可以做

for num_removed in it: 
    do_whatever() 
+0

哇,我不知道「iter」的2參數形式。這絕對勝過我的'itertools'模塊hackery。:) –

+0

這是一個有趣的方法,但在我的情況有點矯枉過正 – Julik

0

一個while環帶斷裂它通常是最簡單,最好的,但是假設當你循環而num_removed > 0你可能實際上意味着num_removed != 0,說這裏的一個還算乾淨的選擇:

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

這不僅使課程的意義,如果你確實需要的num_removed中間值,循環體裏面的東西。

相關問題