1

我正在寻找一种在定义函数后更改函数内部定义的变量的方法。

例如

def GetNthPower(x) :
    n = None
    return x**n

my_numbers_list = [11,23,45,56,78,98]

# now if I feel like I need the 4th power of some numbers in the list 

GetNthPower.n = 4

for x in my_numbers_list :
    print GetNthPower(x)

#  If I want 7th power then
GetNthPower.n = 7 

这显然行不通,有没有办法做到这一点?

注意:我知道我们可以通过将“n”设置为函数的参数来实现这一点,但出于特定原因我想这样做。我希望我的函数只有一个参数(用于在 中使用函数multiprocessing.Pool.map())。

4

3 回答 3

3

您可以在函数内部定义静态变量,就像您所做的一样:

def GetNthPower(x) :
    return x ** GetNthPower.n

GetNthPower.n = 3

print(GetNthPower(2)) #8

GetNthPower.n确保在第一次使用前正确初始化。

如果您担心初始化,可以选择使用默认值的这个版本1

def GetNthPower(x) :
    return x ** (GetNthPower.n if hasattr(GetNthPower, "n") else 1)

我认为编写一个带有两个参数的函数或使用预定义的**运算符仍然会更好。

于 2019-11-08T15:14:28.330 回答
2

不要使用一种功能;使用闭包创建一个创建函数的函数。

def nth_power_maker(n):
    def _(x):
        return x ** n
    return _

my_numbers_list = [11,23,45,56,78,98]

# now if I feel like I need the 4th power of some numbers in the list 

get_4th_power = nth_power_maker(4)

for x in my_numbers_list:
    print(get_4th_power(x))

get_7th_power = nth_power_maker(7)
于 2019-11-08T15:20:56.440 回答
2

或者,您可以使用functools.partial将关键字参数绑定到函数

from functools import partial

def get_nth_power(x, n):
    return x ** n

get_third = partial(get_nth_power, n=3)

get_third(4)
64

x = 4

# in a loop
for pow in [2, 4, 6, 8]:
    f = partial(get_nth_power, n=pow)
    f(x)
于 2019-11-08T15:22:46.420 回答