【问题标题】:Efficient coding for loops with names for variables使用变量名称对循环进行有效编码
【发布时间】:2012-05-06 03:04:14
【问题描述】:

我有一些公式已定义为函数。

然后我使用特定参数为它们“命名”,因为我需要在进一步的公式中使用输出,这使它更容易和更整洁。

我现在需要循环定义的函数以提供一年中每个月的输出,当我将函数的名称放入 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

所以在上面的循环中,它给出了我想要的输出,但我真的希望循环说“打印”Grown brown fish:“,brownGrowth”并且仍然可以工作。

还有其他公式可以将 brownPOP 转换为 endbrownPOP,但有很多公式,它们都有效,所以我认为不需要输入它们会使事情复杂化。

【问题讨论】:

    标签: python performance loops


    【解决方案1】:

    如果我没看错,您希望brownGrowth存储函数调用growPop() 的结果,而是成为该函数调用.所以你想要做的是定义一个brownGrowth作为一个函数。

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

    然后在你的循环中,调用那个函数:

    print "Grown brown fish: ", brownGrowth()
    

    但是,您现在拥有它的方式确实没有任何问题,而且我认为您想要更改它的方式并没有更清楚 - 事实上,它在一个无参数函数后面隐藏了该数字的内容.此外,没有什么比它更有效的了:它的效率较低,因为配方中有一层额外的函数调用。

    【讨论】:

    • 也是介绍functools.partial的好时机。我最喜欢的功能之一。
    • 是的,functools.partial 非常相似,但是我相信它会在创建部分变量时“修复”变量的值,而不是像闭包那样让它们“浮动”。
    • 谢谢@kindall - 我确实考虑过让“brownGrowth”本身成为一个功能,但没有考虑它,因为它会使它更加复杂!
    【解决方案2】:

    我想你只是忘了在每次循环迭代中重新计算 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 
    

    【讨论】:

    • 甜蜜!这样做:-) 谢谢@nvuono!
    • brownGrowth = brownGrowth什么都不做。
    【解决方案3】:

    除了使用 lambda:

    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()
    

    但是,再一次,这完全没有必要,只需将函数调用放在循环中,代码就更少了。

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2016-01-06
      • 1970-01-01
      相关资源
      最近更新 更多