Форум сайта python.su
Приветствую! Изучаю пайтон по разным источникам, в данный момент по каналу Молчанова. Там судя по всему в комментах заглохло всё, поэтому прошу помощи здесь. Короче, вот код Олега:
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)
Офлайн
> что Пайтон игнорирует тело функции до момента вызова этой функции
Питон ничего не игнорирует. Функции является объектом первого класса т.е. обычными данными такими как список или строка. По этому их можно передавать в другие функции как значения аргументов.
Отредактировано Rodegast (Июнь 13, 2023 19:29:28)
Офлайн
Спасибо за ответ!
Т.е, если я правильно понял, с колокольни питона это выглядит следующим образом: кей обращается к функции, в неё передаётся каждый элемент поочередно из списка чилдрен, функция возвращает последний индекс после проведения сплита и сортед пишет в с_чилдрен данные по возрастанию числа, вернутого функцией?
Такая логика?
просто почему тогда не работает, например, такое:
def q(): return 1 x=4-q print(x)
Отредактировано wiserusk (Июнь 13, 2023 23:55:15)
Офлайн
> кей обращается к функции
key это просто название атрибута, функцию sort вызывает sorted. Он её вызывает для каждого значения из списка children и получает из неё значения сравнение которых определяет порядок в возвращаемом списке.
> q - это несуществующая переменная, которую питон не может найти, но почему в первом случае оно работает?
q это существующая переменная. В ней находится объект функции. Но его тип function, а не int по этому при выполнении такого кода ты получишь ошибку TypeError
Отредактировано Rodegast (Июнь 14, 2023 00:33:26)
Офлайн
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)
Офлайн
wiseruskkey не обращается к функции, а хранит в себе имя этой функции. Это равносильно
кей обращается к функции
key = print key('как так, эта переменная превратилась в функцию print, и может выводить в консоль')
func
func()
wiserusk
x=4-q
Отредактировано xam1816 (Июнь 14, 2023 00:48:37)
Офлайн
Ребята, спасибо за ответы! Долго пытался осмыслить…))
xam1816вот это мне как раз было очевидно и понятно, это был просто пример. Для меня было загадкой не то, почему НЕ РАБОТАЕТ это вычитание, а то, почему РАБОТАЕТ та сортировка, теперь, кажется, начинаю въезжать
вот здесь ты из 4 вычитаешь название функции, ведь ты же не просишь сделать то,что внутри функции с помощью скобок, типа 4 - q() -> вот так сработает
Офлайн
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 >>>
Офлайн
py.user.next, ну а как назвать процесс, происходящий в процессе сортировки с использованием имени функции в качестве ключа?
Офлайн
Прочитай про callback, может тебе понятней станет.
Офлайн