0

関数として定義した数式がいくつかあります。

次に、特定のパラメーターを使用してそれらに「名前を付け」ました。これは、出力をさらに数式で使用する必要があるためです。これにより、より簡単できれいになります。

ここで、定義された関数をループして、1 年間の各月の出力を得る必要があります。関数の名前を while ループに入れると、1 つの答えが 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

したがって、上記のループでは、必要な出力が正確に得られますが、実際には、ループで「print "Grown brown fish: ", brownGrowth" と言って、まだ機能することを望んでいます。

BrownPOP を endbrownPOP にする数式は他にもありますが、かなりの数の数式があり、機能するので、複雑にするためにそれらを入力する必要はないと思いました。

4

3 に答える 3

1

私が正しく読んでいれば、関数呼び出しの結果を に保存brownGrowthするのではなく、その関数呼び出しになりたいと考えいます。したがって、あなたがしたいことは、a を関数として定義することです。growPop()brownGrowth

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

次に、ループでその関数を呼び出します。

print "Grown brown fish: ", brownGrowth()

しかし、あなたが今持っている方法には何も問題はなく、変更したい方法が明確になっているとは思いません. また、これほど効率的なものはありません。レシピに関数呼び出しの余分なレイヤーがあるため、効率が低下します

于 2012-05-06T03:11:14.023 に答える
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  

brownGrowth = formula行を while ループの内側に移動します。

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 
于 2012-05-06T03:13:49.063 に答える
0

ラムダの使用に加えて:

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

functools から部分的に使用することもできます。

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

次に、次のように呼び出します。

print "Grown brown fish: ", brownGrowth()

しかし、繰り返しになりますが、それはまったく不要です。関数呼び出しをループに入れるだけで、コードが少なくなります。

于 2012-05-06T03:15:43.447 に答える