2012-05-06 15 views
0

私は関数として定義した数式をいくつか持っています。変数の名前付きループの効率的なコーディング

私は、特定のパラメータを使用してそれらの名前を付けました。これを次の式で出力する必要があります。

今年の月の出力を与えるために定義された関数をループする必要があります。関数の名前をwhileループに入れると、12回以上答えが出ます完全な関数をループに入れたら、それは機能します。

数式が進行するにつれて関数が複雑になり、コードが忙しく混乱しているので、関数名を使用して関数をループする方法はありますか。

def growPOP(p, T, r, K): 
    #formula to calculate the new population at the end of a month. 
    #p = initial population, T = total initial population 
    #r = growth rate per time, K = carrying capacity 
    GrPp = p + ((p * r)*((K - T)/K)) 
    return(GrPp) 

def rt(a, b, t): 
    #formula to calculate growth rate for brown fish 
    #a & b are constants given, t = the month number 
    rt = a + (b*sin(((2*pi)*t)/12)) 
    return rt 

ca = 0.052 
cb = 0.132 
brownPOP = 19000 
goldPOP = 4400 
totalPOP = brownPOP + goldPOP 
carryK = 104800 
redcarryK = 0.998 
newcarryK = (carryK*redcarryK) + (ep/10) #ep is an input figure - for now it's 0. 
month = 1 
brownGrowth = growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK) 

while month <= 2: 
    print "Month ", month 
    print "Grown brown fish: ", growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK) 
    brownPOP = endbrownPOP 
    goldPOP = endgoldPOP 
    totalPOP = endtotalPOP 
    carryK = newcarryK 
    month = month + 1 

は、したがって、上記のループの中で、それはまさに私が欲しいの出力を私に与えますが、私は本当にループは、「印刷 『栽培茶色の魚言いたい:』、brownGrowth」と、まだ動作します。

brownPOPをendbrownPOPにする他の数式がありますが、かなりの数があり、動作するので、複雑にするために入力する必要はないと思いました。私が正しくあなたを読んでいる場合

答えて

0

すべてのループの繰り返しでbrownGrowthを再計算するのを忘れたと思いますか?

brownGrowth = growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK) 
while month <= 2: 
    print "Month ", month 
    print "Grown brown fish: ", brownGrowth 
    brownPOP = endbrownPOP 
    goldPOP = endgoldPOP 
    totalPOP = endtotalPOP 
    carryK = newcarryK 
    month = month + 1 
whileループの内側に brownGrowth = formulaラインを移動

:ラムダを使用することに加えて

while month <= 2: 
    brownGrowth = growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK) 
    print "Month ", month 
    print "Grown brown fish: ", brownGrowth 
    brownPOP = endbrownPOP 
    goldPOP = endgoldPOP 
    totalPOP = endtotalPOP 
    carryK = newcarryK 
    month = month + 1 
+0

甘い!これはそれです:-) Thanks @nvuono! – newtopython

+0

'brownGrowth = brownGrowth'行は何もしません。 –

1

は、あなたがいないgrowPop()への関数呼び出しの結果にbrownGrowthをしたいが、その関数呼び出しになります。だからあなたがしたいことは、brownGrowthを関数として定義することです。

print "Grown brown fish: ", brownGrowth() 

しかし、あなたは今それを持っている方法と間違って何も本当にありません、と私はそれがどんな明確だとは思わない:あなたのループで次に

brownGrowth = lambda: growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK) 

コールは機能しますあなたがそれを変更したいと思う方法 - 実際には、引数なしの関数の後ろに何が入っているのかを隠しています。また、それ以上に効率的なものはありません。より小さいというレシピが追加されているので、効率的です。

+0

また、 'functools.partial'を紹介する素晴らしい時期です。私のお気に入りの機能のひとつ。 – jdi

+0

ええ、 'functools.partial'は非常によく似ていますが、私は、変数がクロージャのように"浮動 "させるのではなく、変数が作成された時点で変数の値を"修正 "すると信じています。 – kindall

+0

ありがとう@kindall - 私は 'brownGrowth'をそれ自身の機能にすることについて考えましたが、それをさらに複雑にするので、それを見落としました! – newtopython

0

brownGrowth = lambda: growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK) 

はあなたもfunctoolsからpartialを使用することができます。

from functools import partial 
brownGrowth = partial(growPOP, brownPOP, totalPOP, rt(ca, cb, month), carryK) 

次に好きそれを呼び出す:

print "Grown brown fish: ", brownGrowth() 

しかし、再び、それだけでループ内での関数呼び出しを入れて、それはより少ないコードだ、全く不要です。

関連する問題