1

好的,所以我正在定义一个函数,它接受可变数量的输入并钳位它们中的每一个

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]

我的问题是,有没有更惯用的方法来做到这一点?

4

5 回答 5

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
于 2013-07-25T22:29:14.353 回答
2

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

A, = clamp(a)
于 2013-07-25T22:36:32.670 回答
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
于 2013-07-25T22:34:14.517 回答
0

I think when you call it with one element, you can add a , after the name. a, = clamp(1). In this case, you don't have to modify your function and the automatic unpacking still happens.

>>> a, b, c = [1,2,3]
>>> a
1
>>> b
2
>>> c
3
>>> a, = [1]
>>> a
1
>>> 
于 2013-07-25T22:34:17.580 回答
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
于 2013-07-25T22:32:48.367 回答