【问题标题】:Handle iterable and non-iterable seamlessly无缝处理可迭代和不可迭代
【发布时间】:2011-02-18 22:58:49
【问题描述】:

能否告诉我如何优化以下代码?

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)

【问题讨论】:

  • 不要忘记字符串也是可迭代的,所以f("xxx", "abz") 将返回“z”,这可能不是你想要的。
  • 再三考虑,您的函数不会返回任何内容 - 它将结果分配给函数本地的 y。无论你传递什么参数,它都不会做任何事情。

标签: python iterable


【解决方案1】:

最好的优化是避免将“列表或单个元素”作为参数这样的愚蠢行为。但是,如果您坚持,最好使用 try/except 尽快删除异常并确保可以迭代:

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

【讨论】:

【解决方案2】:

如果您愿意在您的代码中添加 flatten 功能(有一个很好的 here),它基本上可以获取...的列表列表并将其归结为单个列表,您可以这样做像

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

【讨论】:

  • ps:如果你这样做,添加使用该页面上指定的 iter_flatten 方法
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 2011-08-27
  • 1970-01-01
  • 2016-12-25
  • 2019-08-15
  • 2015-07-23
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多