2010-05-13 115 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