Как связать параметры с функциональным объектом? - PullRequest
1 голос
/ 18 марта 2011

Я новичок в python, и я считаю, что "четные функции - это объекты" очень круто, поэтому я просто играл с функциями в PyShell. Следующий код работал нормально.

def add_num(a,b):
  c = a + b
  return c

x = add_num
x(5,2)

Мне было интересно, можем ли мы сохранить параметры при назначении x = add_num. Так что всякий раз, когда мы вызываем x (), он добавляет a и b (здесь 5 и 2) и возвращает результат. x = add_num (5,2) не будет работать, так как add_num (5,2) фактически вызывает функцию и возвращает 7.

Ответы [ 4 ]

5 голосов
/ 18 марта 2011

Функция partial в модуле functools ( документация ) может создавать новый объект функции, ведущий себя так, как вы хотите.

import functools

def add_num(a, b):
    c = a + b
    return c

x = functools.partial(add_num, 5, 2)
print(x()) # prints 7

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

y = functools.partial(add_num, 5)
print(y(6)) # prints 11

Это работает и для аргументов ключевых слов:

z = functools.partial(add_num, b=5)
print(z(10)) # prints 15

Как предлагается в комментариях, другой вариант - использовать выражение lambda ( документация ), которое является просто сокращением для создания новой функции.

f = lambda: add_num(25, 30)
print(f()) # prints 55

# the lambda definition is equivilent to
def f():
    return add_num(25, 30)

В можно также можно изменить исходную функцию, как показано в вопросе, но в большинстве случаев это будет считаться плохим стилем. Если вы действительно этого хотите, вы можете сделать это, добавив параметры в качестве атрибута .func_defaults объекта функции (в старых версиях Python .__defaults__; документация ).

add_num.func_defaults = (1, 2)
print(add_num()) # prints 3
1 голос
/ 18 марта 2011
def gen_add(x, y):
  def add():
    return x + y
  return add

fn =gen_add(2,4)
print fn
print fn()

fn1 = gen_add(5,4)
print fn1()

печать:

<function add at 0x1004d4398>
6
9
1 голос
/ 18 марта 2011
import functools
x = functools.partial(add_num, 5, 2)
print x()
0 голосов
/ 18 марта 2011
import functools
addnum = lambda x,y:x+y
print addnum(5,2) #print 7
z = functools.partial(addnum,5,2)
print z() #print 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...