Как изменить переменную внутри области действия функции после определения функции в Python? - PullRequest
1 голос
/ 08 ноября 2019

Я ищу способ изменить переменные, определенные внутри функции после определения функции.

Например,

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 

Это, очевидно, не будет работать, есть ли способчтобы сделать это?

NB: я знаю, что мы можем достичь этого, установив 'n' в качестве аргумента функции, но я хочу сделать это таким образом по определенной причине. Я хочу, чтобы у моей функции был только один аргумент (для использования функции в multiprocessing.Pool.map()).

Ответы [ 3 ]

3 голосов
/ 08 ноября 2019

Вы можете определить статические переменные внутри функций, почти так же, как вы это сделали:

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)

Я думаю, вам все равно будет лучше написать функцию, которая принимает два аргумента, или использовать предопределенный ** оператор.

2 голосов
/ 08 ноября 2019

Кроме того, вы можете использовать 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)
2 голосов
/ 08 ноября 2019

Не используйте одну функцию;создайте функцию, которая делает вашей функцией, используя замыкание.

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