Найти - Пользователи
Полная версия: Почему функция работает без вызова
Начало » Python для новичков » Почему функция работает без вызова
1 2
wiserusk
Приветствую! Изучаю пайтон по разным источникам, в данный момент по каналу Молчанова. Там судя по всему в комментах заглохло всё, поэтому прошу помощи здесь. Короче, вот код Олега:

 children= ['arbuzov_2000', 'dinkin_2004', 'Pomidorkina_2001', 'yablochkina_2002']
def sort(name):
    return name.split('_')[-1]
s_children = sorted(children, key=sort)
print(s_children)

Понятно всё, кроме момента с функцией. Из всего что я изучал ранее, я сделал вывод что Пайтон игнорирует тело функции до момента вызова этой функции, т.е по моей еще не окрепшей логике оно работать не должно. Но работает. При этом Олег в видео еще и акцент на этом поставил, что в “кей” пишем имя функции, но без скобок (если дословно, то: “я не ставлю здесь скобки, я передаю объект функции, скобки означают вызов функции”)
Объяснения этого момента нигде найти не могу, помогите разобраться с логикой происходящего процесса
Rodegast
> что Пайтон игнорирует тело функции до момента вызова этой функции

Питон ничего не игнорирует. Функции является объектом первого класса т.е. обычными данными такими как список или строка. По этому их можно передавать в другие функции как значения аргументов.
wiserusk
Спасибо за ответ!
Т.е, если я правильно понял, с колокольни питона это выглядит следующим образом: кей обращается к функции, в неё передаётся каждый элемент поочередно из списка чилдрен, функция возвращает последний индекс после проведения сплита и сортед пишет в с_чилдрен данные по возрастанию числа, вернутого функцией?
Такая логика?


просто почему тогда не работает, например, такое:
 def q():
    return 1
x=4-q
print(x)
оно-то понятно что в этом случае q - это несуществующая переменная, которую питон не может найти, но почему в первом случае оно работает?
Rodegast
> кей обращается к функции

key это просто название атрибута, функцию sort вызывает sorted. Он её вызывает для каждого значения из списка children и получает из неё значения сравнение которых определяет порядок в возвращаемом списке.

> q - это несуществующая переменная, которую питон не может найти, но почему в первом случае оно работает?

q это существующая переменная. В ней находится объект функции. Но его тип function, а не int по этому при выполнении такого кода ты получишь ошибку TypeError
py.user.next
wiserusk
Объяснения этого момента нигде найти не могу
Внутри функции sort() происходит такое. Вот она берёт два элемента из списка a и b, и ей нужно их сравнить. Она делает так key(a) <= key(b), если да, то оставляет элементы и не трогает их, а если key(a) > key(b), то она a и b переставляет в списке и ставит их в порядке b и a. И так для всех элементов она делает, пока они все не распределятся в списке по этому отношению. В итоге в получаемом списке будет так: элементы будут стоят в порядке c b a d f e g, потому что key(c) <= key(b) <= key(a) <= key(d) <= key(f) <= key(e) <= key(g).

wiserusk
Короче, вот код Олега
Эту функцию надо сделать так
  
def sort(name):
    return int(name.split('_')[-1])
Иначе будет так
  
>>> '20' > '101'
True
>>>
xam1816
wiserusk
кей обращается к функции
key не обращается к функции, а хранит в себе имя этой функции. Это равносильно
  
key = print
key('как так, эта переменная превратилась в функцию print, и может выводить в консоль')
т.е название функции можно хранить в переменной, также как и число или строку.

когда пишем
 func
то это просто название функции, а когда
 func()
то здесь просим выполнить инструкции, что что внутри функции, сответственно если в функции есть return “что-то”, то она это “что-то” вернет в итоге, если нет, то вернет None

wiserusk
x=4-q

вот здесь ты из 4 вычитаешь название функции, ведь ты же не просишь сделать то,что внутри функции с помощью скобок, типа 4 - q() -> вот так сработает
wiserusk
Ребята, спасибо за ответы! Долго пытался осмыслить…))

xam1816
вот здесь ты из 4 вычитаешь название функции, ведь ты же не просишь сделать то,что внутри функции с помощью скобок, типа 4 - q() -> вот так сработает
вот это мне как раз было очевидно и понятно, это был просто пример. Для меня было загадкой не то, почему НЕ РАБОТАЕТ это вычитание, а то, почему РАБОТАЕТ та сортировка, теперь, кажется, начинаю въезжать


Т.е из всего сказанного я понял, что функция исполнится без скобок только если она будет ключом при сортировке?
py.user.next
wiserusk
Т.е из всего сказанного я понял, что функция исполнится без скобок только если она будет ключом при сортировке?
Функция не выполняется без скобок. Функция выполняется только со скобками у её имени
  
>>> def sort(lst, key):
...     for i in lst:
...         print('sort пишет:', key(i))
... 
>>> def power(x):
...     return x * x
... 
>>> sort([1, 2, 3, 4, 5], key=power)
sort пишет: 1
sort пишет: 4
sort пишет: 9
sort пишет: 16
sort пишет: 25
>>>
wiserusk
py.user.next, ну а как назвать процесс, происходящий в процессе сортировки с использованием имени функции в качестве ключа?
Rodegast
Прочитай про callback, может тебе понятней станет.
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