Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 13, 2023 17:52:37

wiserusk
Зарегистрирован: 2023-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

Приветствую! Изучаю пайтон по разным источникам, в данный момент по каналу Молчанова. Там судя по всему в комментах заглохло всё, поэтому прошу помощи здесь. Короче, вот код Олега:

 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)

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

Отредактировано wiserusk (Июнь 13, 2023 17:53:16)

Офлайн

#2 Июнь 13, 2023 19:12:57

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2741
Репутация: +  183  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

> что Пайтон игнорирует тело функции до момента вызова этой функции

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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июнь 13, 2023 19:29:28)

Офлайн

#3 Июнь 13, 2023 20:04:58

wiserusk
Зарегистрирован: 2023-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

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


просто почему тогда не работает, например, такое:

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

Отредактировано wiserusk (Июнь 13, 2023 23:55:15)

Офлайн

#4 Июнь 14, 2023 00:18:23

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2741
Репутация: +  183  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

> кей обращается к функции

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

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

q это существующая переменная. В ней находится объект функции. Но его тип function, а не int по этому при выполнении такого кода ты получишь ошибку TypeError



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июнь 14, 2023 00:33:26)

Офлайн

#5 Июнь 14, 2023 00:19:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

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



Отредактировано py.user.next (Июнь 14, 2023 00:26:59)

Офлайн

#6 Июнь 14, 2023 00:44:09

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

wiserusk
кей обращается к функции
key не обращается к функции, а хранит в себе имя этой функции. Это равносильно
  
key = print
key('как так, эта переменная превратилась в функцию print, и может выводить в консоль')
т.е название функции можно хранить в переменной, также как и число или строку.

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

wiserusk
x=4-q

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

Отредактировано xam1816 (Июнь 14, 2023 00:48:37)

Офлайн

#7 Июнь 16, 2023 15:28:21

wiserusk
Зарегистрирован: 2023-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

Ребята, спасибо за ответы! Долго пытался осмыслить…))

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


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

Офлайн

#8 Июнь 16, 2023 16:11:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9846
Репутация: +  853  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

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



Офлайн

#9 Июнь 16, 2023 21:57:09

wiserusk
Зарегистрирован: 2023-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

py.user.next, ну а как назвать процесс, происходящий в процессе сортировки с использованием имени функции в качестве ключа?

Офлайн

#10 Июнь 16, 2023 22:58:37

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2741
Репутация: +  183  -
Профиль   Отправить e-mail  

Почему функция работает без вызова

Прочитай про callback, может тебе понятней станет.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version