2016-11-26 1 views
0

ラムダ形式の関数を関数で明示的に記述するのではなく、入力によるマッピング規則を受け入れる方法を教えてください。ラムダ関数は入力(Python)によるマッピング規則を受け付けません

ここに私のコードです、私はnummerical統合のためのプログラムを作成しようとしています。

while True: 

fx=input("Enter a function: ") 
a=int(input("Choose lower integration limit: ")) 
b=int(input("Choose upper integration limit: ")) 
delta=float(input("Choose delta x: ")) 

step=int(1/delta) 

interval=list(range((a*step),(b*step))) 
f= lambda x: (x**2)*delta 

Now I want to substitute this part (x**2) for an arbitray polynomial via the input fx

result=map(f,interval) 
print(sum(list(result))*(delta**2)) 


continue 

私はfxため(x**2)を代入しようとした場合には、このエラーを生成します:

Traceback (most recent call last): 
    File "C:\Users\Christian\Desktop\Python-Programme\Nummerische   Integration.py", line 13, in <module> 
    print(sum(list(result))*(delta**2)) 
    File "C:\Users\Christian\Desktop\Python-Programme\Nummerische Integration.py", line 11, in <lambda> 
    f= lambda x: fx*delta 
TypeError: can't multiply sequence by non-int of type 'float' 

*私はこれはおそらくnummerical統合のための最適なプログラムではないことを十分に承知しています、私が理論的に使うことができるプログラムを作っている間、これを構築するのは私のプログラミングスキルを発揮することにすぎないのです。

答えて

0

無視、これは理にかなっている場合、エラーが型の不一致から来ている:あなたはfx=input("Enter a function: ")からの入力を取得すると

変数FXはタイプstrのものであろう。試してくださいprint(type(fx))

fx*deltaを実行するときには、基本的に文字列に数値を掛けようとすると意味がありません。したがって、あなたのエラーTypeError: can't multiply sequence by non-int of type 'float'

迅速な解決策は、高度なソリューションが、私はそれは容易ではないと思いラムダ関数、にあなたの文字列の入力を解析する方法が必要になり

while True: 
    n=int(input("Enter degree of polynomial: ")) 
    print(type(fx)) 
    a=int(input("Choose lower integration limit: ")) 
    b=int(input("Choose upper integration limit: ")) 
    delta=float(input("Choose delta x: ")) 
    step=int(1/delta) 
    interval=list(range((a*step),(b*step))) 
    f= lambda x: (x**n)*delta 
    result=map(f,interval) 
    print(sum(list(result))*(delta**2)) 
    continue 

だろう。

0

は何をしたい

f = lambda x: fx(x) * delta 

ですか?

次に、fxにlambda x: x**2と入力する必要があります。

しかし、関数型プログラミングのような先進的な概念のために少し早すぎるかもしれません。なぜなら、Pythonはそれらにあまり重点を置かないようにしようとしているからです。たとえば、このコードをもっとうまく扱い、機能を修正するなどして、始めることができます。質問の

step=int(1/delta) 
interval=list(range((a*step),(b*step))) 
result=map(f,interval) 
print(sum(list(result))*(delta**2)) 
関連する問題