让Python函数根据参数的数量干净地返回标量或列表
免责声明:我正在寻找Python2.6解决方案,如果有的话 我正在寻找一个函数,它在传递单个值时返回单个值,或者在传递多个值时返回序列:让Python函数根据参数的数量干净地返回标量或列表,python,python-2.6,python-2.x,iterable-unpacking,Python,Python 2.6,Python 2.x,Iterable Unpacking,免责声明:我正在寻找Python2.6解决方案,如果有的话 我正在寻找一个函数,它在传递单个值时返回单个值,或者在传递多个值时返回序列: >>> a = foo(1) 2 >>> b, c = foo(2, 5) >>> b 3 >>> c 6 明确地说,这是为了使某些函数调用看起来比: a, = foo(1) 或 目前,不雅观的解决方案大致如下: def foo(*args): results = [a + 1
>>> a = foo(1)
2
>>> b, c = foo(2, 5)
>>> b
3
>>> c
6
明确地说,这是为了使某些函数调用看起来比:
a, = foo(1)
或
目前,不雅观的解决方案大致如下:
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]
你总是可以写一个装饰师来elide,如果这样对你更好的话:
import functools
def unpacked(method):
@functools.wraps(method)
def _decorator(*args):
result = method(*args)
return results if len(results) != 1 else results[0]
return _decorator
用法:
@unpacked
def foo(*args):
return [arg + 1 for arg in args]
你的意思是你想要一个具有相同数量参数的元组吗?这不是解决办法吗
返回元组([a+1表示args中的a])
def foo(*args):
返回(无,参数[0]+1如果参数为其他无,则映射(lambda:a+1,参数))[len(参数)如果len(参数)<3否则2]
:-)这是地狱这将处理0个或更多参数,我想这就是您要寻找的
def foo(*args):
return map(lambda x: x + 1, args) or [None]
编辑:我修改为添加一个None列表,以防解包0 args您可以轻松编写一个函数
scalify
,如果列表只有一个元素,即它试图使其成为标量(因此得名),该函数将从列表中返回元素
然后您可以在函数中使用它,如下所示:
def foo(*args):
return scalify([a + 1 for a in args])
这会起作用,但我支持那些建议你不要这样做的人。出于一个原因,它排除了对结果进行迭代,除非您知道至少传入了两项。此外,如果您有一个列表,那么在调用函数时必须解压该列表,从而失去其“列表性”,并且您知道可能无法获得列表。在我看来,这些缺点似乎掩盖了这种技术的任何好处。您的设计似乎有问题,因为您希望函数根据参数计数pff返回列表或int!!为什么不让你的函数总是返回一个列表,并在你的第一个例子中使用这个符号:a,=foo(1)在我看来,它主要是一种语法上的糖分和可读性。a=foo(1)更清楚(特别是当输入和输出有更复杂的参数和变量名时),我完全同意奇点。此所需函数的返回类型语义很容易导致问题。@knitti,
(2)
不是元组(2)
是用括号括起来的2
(2,)
是一个元组。试着这样做,然后看着它失败。不过,原来的问题是一样的,所以期望的行为是未定义的。但是如果在我给出的scalify
主体之前插入if l:
,如果没有结果,您将得到None
。
def foo(*args):
return map(lambda x: x + 1, args) or [None]
def scalify(l):
return l if len(l) > 1 else l[0]
def foo(*args):
return scalify([a + 1 for a in args])