Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让Python函数根据参数的数量干净地返回标量或列表_Python_Python 2.6_Python 2.x_Iterable Unpacking - Fatal编程技术网

让Python函数根据参数的数量干净地返回标量或列表

让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

免责声明:我正在寻找Python2.6解决方案,如果有的话

我正在寻找一个函数,它在传递单个值时返回单个值,或者在传递多个值时返回序列:

>>> 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])