解包从函数返回的变量长度列表

时间:2013-07-25 22:21:05

标签: python

好的,我正在定义一个函数,它接受可变数量的输入并钳制每个输入

def clamp(*args):
    return [ max(min(arg, 0.8), 0.2) for arg in args]

我喜欢这个功能的可读性:

a = 0.12
b = 0.45
c = 0.992

A,B,C = clamp(a,b,c)

print A,B,C

>> 0.2, 0.45, 0.8

这利用了python自动将列表解压缩到元组。我遇到的麻烦是,如果我只提供一个参数,python不会从列表中解压缩,我得到一个列表而不是浮点数,这很烦人。

print clamp(a)

>> [0.2]

到目前为止,我的解决方案是检查列表的长度,如果只有一个元素,则将其编入索引:

def clamp(*args):
    result = [ max(0.2, min(0.8,arg)) for arg in args]
    return result if len(result) > 1 else result[0]

a = 0.12
print clamp(a)

>> [0.2]

我的问题是,有没有更惯用的方法呢?

5 个答案:

答案 0 :(得分:3)

我不是很有信心,但这是另一种解决方案

>>> clam = lambda a: max(min(a, 0.8), 0.2)

>>> def clamp(a, *args):
...     if args:
...        return [ clam(arg) for arg in (a,)+args]
...     else:
...        return clam(a)
... 
>>> clamp(123, 123)
[0.8, 0.8]
>>> clamp(123)
0.8

答案 1 :(得分:2)

您可以通过在名称后面添加逗号来强制它解压缩单个元素。不太理想但是你去了:

A, = clamp(a)

答案 2 :(得分:0)

def clamp(*args):
    rt = [max(min(arg, 0.8), 0.2) for arg in args]
    return rt if len(rt) > 1 else rt[0]

或者,记住你是如何制作一个元素的元组的。在A之后加上逗号以强制解压缩单个变量。

A, = clamp(0.12) # with your old function which always returns list

答案 3 :(得分:0)

def clamp(*args):
    lst = [max(min(arg, 0.8), 0.2) for arg in args]
    if len(lst)==1:
        return lst[0]
    return lst

答案 4 :(得分:0)

我认为当您使用一个元素调用它时,您可以在名称后添加,a, = clamp(1)。在这种情况下,您不必修改您的功能,自动解包仍然会发生。

>>> a, b, c = [1,2,3]
>>> a
1
>>> b
2
>>> c
3
>>> a, = [1]
>>> a
1
>>>