问题描述
scalify
如果列表只有一个元素,则可以轻松编写一个从列表返回该元素的函数,即,它试图使其成为标量(因此命名)。
def scalify(l):
return l if len(l) > 1 else l[0]
然后可以在函数中使用它,如下所示:
def foo(*args):
return scalify([a + 1 for a in args])
这可以解决问题,但是我和那些建议您不要这样做的人在一起。由于一个原因,除非您知道至少传入了两个项目,否则它排除了对结果进行迭代的可能性。另外,如果有列表,则在调用该函数时必须将列表解压缩,从而失去其“列表性”,并且您知道可能无法获得列表。在我看来,这些缺点掩盖了您可能会从该技术中看到的任何好处。
解决方法
免责声明:如果有的话,我正在寻找Python 2.6解决方案。
我正在寻找一个传递单个值时返回单个值或传递多个值时返回序列的函数:
>>> a = foo(1)
2
>>> b,c = foo(2,5)
>>> b
3
>>> c
6
需要明确的是,这是为了使某些函数调用看起来好于:
a,= foo(1)
要么
a = foo(1)[0]
现在,不雅的解决方案遵循以下原则:
def foo(*args):
results = [a + 1 for a in args]
return results if len(results) > 1 else results[0]
是否有任何语法糖(或功能)会使它感觉更干净?像下面的东西吗?
def foo(*args):
return *[a + 1 for a in args]