2010-05-13 142 views
2

你能告訴我如何優化下面的代碼嗎?無縫處理迭代和非迭代

def f(y, list_or_elem): 
    if getattr(list_or_elem, '__iter__'): 
    y = max(y, *list_or_elem) 
    else: 
    y = max(y, list_or_elem) 
+0

不要忘了字符串是可迭代的太多,所以' f(「xxx」,「abz」)'會返回「z」,這可能不是你想要的。 – 2010-05-13 06:07:59

+0

再次想到你的函數不會返回任何東西 - 它將結果賦給y,這對函數來說是本地的。它不會做任何事情,無論你通過它的論點。 – 2010-05-13 06:09:42

回答

1

所有的最佳優化將避免像「無論是列表還是單個元素」作爲參數這樣的愚蠢。但是,如果你堅持,這是更好地使用try /除了儘快移除異常和做什麼肯定是一個迭代:

try: iter(list_or_elem) 
except TypeError: iterable = [list_or_elem] 
else: iterable = list_or_elem 
y = max(y, *iterable) 
+1

在這裏類似的回答: http://stackoverflow.com/questions/1952464/in-python-how-do-i-determine-if-a-variable-is-iterable – 2010-05-13 05:46:25

0

如果你願意在你的代碼添加扁平化功能(那裏有一好一個here),它可以基本上採取的名單列表的列表...並把它歸結爲一個單獨的列表,你可以這樣做

y = max(flatten([y, list_or_elem])) 
+0

ps:如果你這樣做,添加使用該頁面上指定的iter_flatten方法 – 2010-05-13 05:54:47