好的,我正在定义一个函数,它接受可变数量的输入并钳制每个输入
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]
我的问题是,有没有更惯用的方法呢?
答案 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
>>>