2016-10-31 5 views
1

割り当てのためには、数値を持つリストを参照する関数を作成し、この基数の各数値を特定の基数として使用する必要があります。これらの数字は加算する必要があります。たとえば、10の10進数のリスト[1,2,3]は1110(10^1 + 10^2 + 10^3)になります。私は非常に簡単に、このためのコードを作成することができます。2組の角かっこを使用してPython関数を呼び出す

def f(base,list1): 
    answer=0 
    for i in list1: 
     answer+=base**i 
    return answer 

テスト環境は、しかし異なるtestlistsとtestbasesのために、(リスト1)(ベース)コードFを呼び出すことで、この機能をテストします。このメソッドを使用すると、自分のコードでは機能しません。では、f(list1)(base)を呼び出してコードを編集する方法を教えてください。

+0

なぜ必要なのですか? 'f(list1、base)'の何が問題なの? ( 'currying'という概念があり、g = f(list1); g(base) 'を得ることができますが、なぜ必要なのかわかりませんか? – smci

+0

' f'は 'list1' ** ** 'base'をとる関数**を返します。 –

+0

Pythonでコードする方法を学ぶ代入のためのものです。割り当てコードは、ランダムリストを使って関数をテストするコンピュータによってテストされています。 – Nico

答えて

1

あなたはあなたのコードでそれを行うことができますが、別の関数で、それをパッケージ化して、それを返す必要があります:

def f(list1): 
    def f2(base): 
     answer=0 
     for i in list1: 
      answer+=base**i 
     return answer 
    return f2 

res = f([1,2,3])(10) 
print (res) 
+0

これは[functools.partial](https: – smci

+0

これは価値があるのですが、これは 'sum()'とラムダ式を使ってより簡潔に書くことができます: 'def f(list1):戻り値ラムダベース:sum(list1のiのベース** i) ' –

-1

はい、functools.partialによって実装「カリー化」と呼ばれる概念が、あります。これにより、あなたのargsまたはkwargsのいくつかが値に関連付けられている新しい関数を作成することができます。

import functools 
f2 = functools.partial(f, base=10) 
f2(list1=[1,2,3]) # Note you have to call f2 with a keyword arg... 
1110 # Right answer 

f2([1,2,3]) #...it errors if you use the normal (positional) arg 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: f() got multiple values for keyword argument 'base' 
+0

Currying複数の引数を持つ関数は、1つの引数を取る関数のシーケンスに変換することを意味します。 'functools.partial()'は引数を一つずつ設定することができますが、関数をカレーすることはできません。元の関数が関数を返さない場合、関数を返す関数を返すことはありません。これは質問にも答えません。 –

関連する問題