2012-09-23 64 views
0

我有幾個函數根據輸入字典計算不同的統計數據,最大值,最小值,總和,平均值,中值。通過接受集合和返回集合將幾個函數重構爲一個函數

我想所有這些功能合併成一個,而不是在不同的方法有他們的。所以調用者可以執行類似如下:

(minValue, averageValue, maxValue) = myFunction(min, avg, max, data, key, ...) 

(minValue, maxValue) = myFunction(min, max) 

我是新來的蟒蛇,我想了解這可以使用集來實現! 請不要建議解決此問題的其他方法,因爲我正在嘗試學習python和python語法。一個小例子會很棒。

回答

1
def myFunction(data,*args): 
    return tuple(f(data) for f in args)) 

因此,例如:

myFunction(data, min, avg, max) 
# returns (min(data), avg(data), max(data)), and you can get them by 
minValue, averageValue, maxValue = myFunction(data, min, avg, max) 

如果你想包括key

def myFunction2(data, *args, **kwargs): 
    if 'key' not in kwargs: 
     kwargs['key'] = lambda x: x # identity map (pass without a key) 
    return tuple(f(data, key=kwargs['key']) for f in args) 

因此,例如:

myFunction2(['a','bc','f'], min, max)   # ('a', 'f') 
myFunction2(['a','bc','f'], min, max, key=len) # ('a', 'bc') 
0

不能使用集來做到這一點,因爲一組沒有排序;因此Python不會知道哪個值例如是minValue和哪個maxValue

可以雖然返回一個元組:

return value1, value2, value3 

演示:

>>> def foo(): 
...  return 1, 2, 3 
... 
>>> retval1, retval2, retval3 = foo() 
>>> retval3 
3 
+0

我如何能實現輸入任意號碼? – theAlse

+0

請參閱[* args和** kwargs?](http://stackoverflow.com/q/3394835) –