2016-05-26 16 views
2

Pythonでは関数に変数を代入できます。例えば、math.sine関数:複数の関数を1つの変数に割り当てる?

sin = math.sin 
rad = math.radians 
print sin(rad(my_number_in_degrees)) 

複数の関数(関数の関数)を変数に割り当てる簡単な方法はありますか?

sin = math.sin(math.radians) # I cannot use this with brackets 
print sin (my_number_in_degrees) 
+0

'sinrad = lambda n:math.sin(math.radians(n))'? – TessellatingHeckler

+1

明確にするために、記述しているのは変数に複数の関数を割り当てることではありません。これは、他の2つの関数の構成である単一の関数を割り当てています。 – BrenBarn

答えて

1

私は著者が望むものは、機能的な連鎖の何らかの形だと思います。一般に、これは困難であるが、リスト内の前の機能は同じであるため、

  1. は、単一の引数を取る関数、
  2. 戻り単一値に対して
  3. 戻り値ことも可能です次の関数の入力型と同じ型のリストはリストです

ここで、1つの引数を取り、1つの引数を返す必要がある関数のリストがあります。また、タイプは一貫しています。このような何か...

functions = [np.sin, np.cos, np.abs] 

チェーン一緒にこれらのすべての一般関数を記述することは可能でしょうか?まあグイドは特にmapreduce実装好きではない、けれども、我々はreduceを使用することができますし、...このような

何かにそれらを取るとしていた...

>>> reduce(lambda m, n: n(m), functions, 3) 
0.99005908575986534 

今、私たちはどのように行いますこれを行う関数を作成しますか?さて、値をとり関数を返す関数を作成してください:

import numpy as np 

def chainFunctions(functions): 
    def innerFunction(y): 
     return reduce(lambda m, n: n(m), functions, y) 
    return innerFunction 

if __name__ == '__main__': 
    functions = [np.sin, np.cos, np.abs] 
    ch = chainFunctions(functions) 
    print ch(3) 
4

だけでラッパー関数を作成します:たとえば

def sin_rad(degrees): 
    return math.sin(math.radians(degrees)) 

通常どおりラッパー関数を呼び出します。

print sin_rad(my_number_in_degrees) 
0

あなたは、あなたとの使用のためにfunction compositionを行うヘルパー関数を書くことができあなたが望む種類の変数を作成することができます。いくつかの素晴らしい機能は、可変数の関数を組み合わせて、それぞれが可変数の引数を受け入れることができることです。

import math 
try: 
    reduce 
except NameError: # Python 3 
    from functools import reduce 

def compose(*funcs): 
    """ Compose a group of functions (f(g(h(...)))) into a single composite func. """ 
    return reduce(lambda f, g: lambda *args, **kwargs: f(g(*args, **kwargs)), funcs) 

sindeg = compose(math.sin, math.radians) 

print(sindeg(90)) # -> 1.0 
関連する問題