我有一些公式被定义为函数。
然后,我使用特定参数"命名"它们,因为我需要在进一步的公式中使用输出,这使它更容易和更整洁。
我现在需要循环定义的函数以给出一年中每个月的输出,当我将函数的名称放入 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
所以在上面的循环中,它准确地给了我想要的输出,但我真的希望循环说"打印"种植的棕色鱼:",棕色增长"并且仍然有效。
还有其他公式可以让 brownPOP 变成 endbrownPOP,但有很多并且它们有效,所以我认为不需要输入它们来使事情复杂化。
如果我没看错的话,您希望brownGrowth
不要将函数调用的结果存储到 growPop()
,而是成为该函数调用。所以你要做的是将brownGrowth
定义为一个函数。
brownGrowth = lambda: growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK)
然后在循环中,调用该函数:
print "Grown brown fish: ", 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 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
除了使用 lambda 之外:
brownGrowth = lambda: growPOP(brownPOP, totalPOP, rt(ca, cb, month), carryK)
您也可以使用 Part from functools:
from functools import partial
brownGrowth = partial(growPOP, brownPOP, totalPOP, rt(ca, cb, month), carryK)
然后这样称呼它:
print "Grown brown fish: ", brownGrowth()
但是,同样,这是完全没有必要的,只需将函数调用放在循环中,它的代码更少。