0

私は Python に非常に慣れていないので、演習として、コードを使用して基本的な金融演習を解いてみました。私の目的は、スポット レートのディクショナリと、それらから計算された割引率のディクショナリを取得することです。私は次のようなことを考えていました:

discountrates={}

def discountrates(n):
    spotrates={}
    for x in range(1,n+1):
        spotrates['s'+str(x)]=float(input('What is s'+str(x)+'? (not in percentage)'))
    for y in range(1,n+1):
         discountrates['d(0,'+str(y)+')']= 1/((1+float(spotrates['s'+str(y)]))**y)
    for key, value in discountrates.items():
        print (key, value) 

問題は、関数内で辞書項目にアクセスできないことです。フォーラムを調べたところ、辞書をアンパックするための解決策が見つかりましたが、名前を完全に指定できない辞書の特定の要素にアクセスする必要があるため、私の場合はうまくいきません (Python マニュアルで見たように)。これはループの一部であるため、他のものを手動で挿入しなくても式を機能させることができます。最初は辞書を使って自動生成された名前を作成していましたが、今では情報を取得できないようです。

最善の解決策は何ですか?

助けてくれてありがとう。それは私を夢中にさせてきました。

4

2 に答える 2

2

これは、グローバル変数discountratesdictを not discountrates(関数の名前) と呼んだためです。

于 2013-03-06T23:34:21.020 に答える
0

後者は前者を上書きするので、関数のように辞書に名前を付けないことをお勧めします。1行目discountratesでは空dictであり、2行目では関数オブジェクトであると言いますdiscountrates。Pythonで異なる名前を付ける必要があります。同じスコープにあります。

さらに、なぜあなたはする必要discountratesがありますglobalか?n以前よりも小さい場合、古いレートを維持しますnか?パフォーマンスのために、2つのループを組み合わせることをお勧めします。for x ...それ以外に、zouはxを使用しなくなったため、2番目のループも読み取れない理由はありません。さらなるヒントとして、結論に達した場合、グローバルが追加に役立つ唯一の方法であるためglobal discountratesdict、特定のケースでは必要ない場合でも、ここでグローバルが意図されていることを簡単に見つけることができます。[]-演算子にはオブジェクトが必要であるため、すでにグローバルを参照しています。

これらすべてをまとめると、次のようになります。

discountratedict={}

def discountrates(n):
    global discountratedict
    spotrates={}

    for x in range(1,n+1):
        spotrates['s'+str(x)]=float(input('What is s'+str(x)+'? (not in percentage)'))
        discountratedict['d(0,'+str(x)+')']= 1/((1+float(spotrates['s'+str(x)]))**x)

    for key, value in discountratedict.items():
        print (key, value) 
于 2013-03-07T08:53:32.890 に答える