Найти - Пользователи
Полная версия: Помогите пожалуйста понять одну операцию в коде
Начало » Python для новичков » Помогите пожалуйста понять одну операцию в коде
1
KamilKamil
Всем привет.
Помогите пожалуйста новичку. Не понимаю, как “add” стал “func” !?!?
Если есть возможность, укажите плиз, правильно ли я прописал комментарии?
Заранее спасибо!


def add(x, y): # создаем функцию
return x+y # указываем операцию между аргументами функции

def do_twice(func, x, y): # создаем ещё одну функцию. func, это и есть add. НЕ ПОНИМАЮ, КАК ЭТО ПОЛУЧИЛОСЬ?!?!?!?
return func(func(x, y), func(x, y)) # здесь функция add выполняется в скобках дважды. Получается так: func((5+10), (5+10)), которые переходят в func(15, 15).
a = 5
b = 10

print(do_twice(add, a, b)) # тут add, это a+b(5+10), a= 5, b=10. Итого получается, 30
Palrom
  
def add(x, y): # создаем функцию
    return x + y # возвращаем результат сложения x и y
 
def do_twice(func, x, y):  # func это формальный параметр, а add фактический, то есть он задаётся непосредственно при вызове функции.
    return func(func(x, y), func(x, y)) # То есть функция, получив add в качестве фактического параметра,
                                        # подставляет её на место func и по сути возвращает add(add(5, 10), add(5, 10)) то есть (5+10) + (5+10)
 
a = 5
b = 10
 
print(do_twice(add, a, b)) # тут add, это a+b(5+10), a= 5, b=10.   Нет, "add" тут это функция "add", "a" это "5", а "b" это "10". Все вычисления происходят уже в функции do_twice. 
                           # А здесь мы просто передаём ей все инструменты для работы, можно сказать.

На будущее: [code python]между этими тегами вставлять код на форуме[/code]
KamilKamil
Огромное спасибо, Palrom.
Особенно за комментарии)
Правда так и не понял логики, по которой add(x, y) превратился в func(x, y) . Или эта история нелогична?) А просто как правило, которое надо запомнить?)))
Если логика есть, подскажи пожалуйста, в Интернете где-нибудь есть подробный разбор таких подстановок?

Palrom
KamilKamil
Или эта история нелогична?) А просто как правило, которое надо запомнить?
Всё там как раз таки логично. Но запомнить нужно во всяком случае, понимание может прийти не сразу просто.
KamilKamil
так и не понял логики, по которой add(x, y) превратился в func(x, y)
Ни что ни во что не превратилось. У функции есть позиционный аргумент func(термины аргумент и параметр почти взаимозаменяемы). func в данном случае - это просто подсказка, идентификатор входных данных подпрограммы (функции). Так как параметр func позиционный и стоит первым, то, что передано в эту функцию первым аргументом при её вызове, и будет подставлено (связано) с формальным параметром и будет далее обрабатываться в теле функции, везде, где обозначен параметр func.
KamilKamil
Если логика есть, подскажи пожалуйста, в Интернете где-нибудь есть подробный разбор таких подстановок?
Лучше всего читать профильные книжки. Скачай и прочитай Лутц М. Изучаем Python 5-е издание. Там есть глава Функции и генераторы и в ней всё подробно расписано, и про сопоставление аргументов (параметров) и про ссылки, и про то как функции работают с изменяемыми и неизменяемыми данными и многое другое.

Можно глянуть вот эту статью
https://docs-python.ru/tutorial/opredelenie-funktsij-python/
и те что по ссылкам там приводятся тоже
https://docs-python.ru/tutorial/opredelenie-funktsij-python/proishodit-moment-vyzova-funktsii/
в частности
KamilKamil
Теперь понял)
Спасибо!!!
Благодаря этому предложению:
“Так как параметр func позиционный и стоит первым, то, что передано в эту функцию первым аргументом при её вызове, и будет подставлено (связано) с формальным параметром и будет далее обрабатываться в теле функции, везде, где обозначен параметр func.”
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB