在python函数中定义常量的最佳方法

时间:2016-05-25 08:10:17

标签: python functional-programming

这可能是一个比实际问题更具理论性的问题,因为它不会对程序的运行时间产生重大影响。至少不是我的情况。

我收到了一些导入不同(“自制”)函数的python代码。一个函数(称为 func )从主脚本调用5次(称为 main )。

func 中,在函数的开头定义了很多常量。例如:

    import numpy as np
    def func(x,y,z):
        c0 = np.array([1,2,3])
        c1 = np.array([1,2,3])
        c2 = np.array([1,2,3])
        c3 = np.array([1,2,3])

        #do stuff with variables x,y,z
        #return stuff

我想知道:调用这个函数时,每次调用函数时都会定义常量c0,...,c3,或者在运行 main <编译为字节码时它是“固定的”吗? / strong>脚本,以便它们只定义一次?

2 个答案:

答案 0 :(得分:4)

c0c1等的范围仅限于func方法。所以,每次调用函数时,这些变量都将被初始化

如果您希望仅将其初始化一次,然后在每次调用时在func中使用它,则可以在func方法之外进行定义:

import numpy as np

c0 = np.array([1,2,3])
c1 = np.array([1,2,3])
c2 = np.array([1,2,3])
c3 = np.array([1,2,3])

def func(x,y,z):

    #do stuff with variables x,y,z
    #return stuff

答案 1 :(得分:1)

是的,每次调用函数时都会定义它们。

Python的动态特性意味着np.array的值可能在函数定义及其调用(以及调用之间)之间的时间内发生了变化,因此编译器没有机会对它们进行评估&#34;提前&#34;。

如果将它们保存在闭包中,则只能对它们进行一次计算,而不将它们作为全局变量引入。

示例:

def _func():
    c0 = np.array([1,2,3])
    c1 = np.array([1,2,3])
    c2 = np.array([1,2,3])
    c3 = np.array([1,2,3])
    def actual_func(x, y, z):
        # do stuff
        # return stuff
    return actual_func

_func_closure = _func()

def func(x, y, z):
    return _func_closure(x, y, z)

最后一个定义只是为了避免在函数外部创建一个全局变量 - func = _func()如果你不介意的话也同样有效。

这可能写得更优雅,但它说明了这个想法,基本上是&#34;增加一个间接水平&#34;。

免责声明:我完全不知道这是否有更好的表现。

(如果你对&#34;技巧和#34感兴趣;就像这样,在Lisp的任何体面的书中都有很多。)