использование партиций functools в Python - логический вопрос - PullRequest
0 голосов
/ 18 апреля 2020

Я сейчас изучаю Python GUI библиотеку tkinter. Я создавал простой калькулятор, теперь я использовал это частичное из класса functools, теперь со многих сайтов я узнал, что для того, чтобы использовать частичную функцию, вам нужно, чтобы сначала вам нужно было создать функцию с каким-то ограниченным переменные, например, такие как 3 переменные

def sum(x , y , z):
    return x+y+z

сейчас, чтобы использовать частичное, вам нужно сделать следующее

sum_new = partial(sum , 2 , 3)
print(sum_new(5))

В основном выполнение приведенного выше оператора автоматически присвоит значение 2 переменной x в сумме функций и аналогично от 3 до y и от 5 до z. Проблема: Я создаю этот калькулятор. Теперь в операторе вызова я вызываю частичную функцию без использования круглых скобок. Почему это так?

calculate = partial(calculation, empty_label , x1 , x2 , x3)

calculate_button = Button(Win , text = "Calculate" , activeforeground = 'red' , command = calculate)
calculate_button.grid(row = 4 , column = 0)

, см. Выше command = рассчитать

Вторая точка

def sum(Label , x1 , x2):
    n1 = (x1.get())
    n2 = (x2.get())
    result = int(n1) + int(n2)
    Label.config(text = "Sum is %d" %result)
    return

def calculation(empty_label , x1 , x2 ,x3):
    n3 = (x3.get())
    if n3 == '+':
        sum1 = partial(sum , empty_label , x1 ,x2)
        sum1()

Почему здесь мне нужно использовать sum1 () в скобках, а в point 1 я не сделал не нужно никаких скобок. Хотя мы знаем, что sum1 не является функцией, пожалуйста, объясните эти моменты, пожалуйста. Спасибо

1 Ответ

0 голосов
/ 18 апреля 2020

Я создаю этот калькулятор. Теперь в операторе вызова я вызываю частичную функцию без использования скобок. Почему это так?

Поскольку аргумент command требует ссылка на функцию. Если вы используете круглые скобки, вы фактически вызываете функцию и присваиваете команде возвращаемое значение. Единственный раз, когда это работает, если сама функция возвращает другую функцию, как partial.

Другими словами, это:

Button(..., command=x())

... идентично этому:

result = x()
Button(..., command=result)

Когда вы используете опцию command, вы находитесь в эффект дает кнопке имя функции, вызываемой при нажатии кнопки.

Почему здесь мне нужно использовать sum1 () в скобках, а в точке 1 скобки не нужны.

Потому что при создании метки вы хотите немедленно выполнить расчет. Использование круглых скобок - это разница между ссылкой на функцию и ее фактическим вызовом.

В программировании бывают моменты, когда вам нужна ссылка, и времена, когда вам нужен результат функции. Опция command - это один из случаев, когда вам нужна ссылка.

Другой способ думать об этом так: представьте, если вы спросите своего друга "какую функцию я использую, чтобы добавить 5 и 3" и они отвечают «8». В этом сценарии вы не хотите, чтобы они выполняли сложение за вас, вы хотите, чтобы они сообщали вам имя функции (например, sum), чтобы вы могли выполнить вычисление позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...