Форум сайта python.su
wiserusk
Т.е из всего сказанного я понял, что функция исполнится без скобок только если она будет ключом при сортировке?
sorted([3, 1, 2], key=print)
3
1
2
Traceback (most recent call last):
File "/home/xam/PycharmProjects/pythonProject_3/forum_6.py", line 1, in <module>
sorted([3, 1, 2], key=print)
TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'
Офлайн
Rodegast
Прочитай про callback, может тебе понятней станет.
Создадим список из коллбэков: def callback_1(): print("Я первый коллбэк") def callback_2(): print("Я второй коллбэк") def callback_3(): print("Я третий коллбэк") callbacks = [callback_1, callback_2, callback_3] # Обратите внимание, что скобок нет. # Мне нужны не результаты вызова функций, а сами функции for callback in callbacks: callback() # а вот здесь я уже вызываю функции
xam1816
Для начала уясни одно, функция выполнится только со скобками.
wiserusk
вот это мне как раз было очевидно и понятно, это был просто пример. Для меня было загадкой не то, почему НЕ РАБОТАЕТ это вычитание, а то, почему РАБОТАЕТ та сортировка
xam1816
Если в аргументах какой-то функции видишь название другой функции без скобок, то очевидно, что эта функция будет выполнятся внутри этой какой-то функции.
#Попробовал.. Не вышло: def y(): return 5 def i(n): return n-4 print(i(y)) #Зато со скобками в аргументах всё работает: def y(): return 5 def i(n): return n-4 print(i(y()))
#Пробовал извращаться по-всякому, но удалось это осуществить только в ключе в функции сортировки, например так: lst=[2,6,33,7,9,99,6,3,1,6,8,45] def t(n): return n%3==0 r=sorted(lst, key=t, reverse=True) print(r) >>>[6, 33, 9, 99, 6, 3, 6, 45, 2, 7, 1, 8]
Отредактировано wiserusk (Июнь 17, 2023 11:08:12)
Офлайн
def i(n):# вот здесь ты что ждешь на входе, функцию или число???? return n-4
print(i(y)) # зачем подаешь название функции????
print(i(y()))
num = y() # функция возвращает число result = i(num) # функция принимает число, потому что внутри операция с числом, а не названием функции print(result)
def get_second_elem(i): print(f'взят элемент {i} и из него будет возвращаться второй элемент для сравнения {i[1]}') return i[1] l = [(4, 3), (3, 4), (1, 2), (2, 1)] result_1 = sorted(l) result_2 = sorted(l, key=get_second_elem) # здесь входе ожидается функция, а не что-то другое, чтобы она вытаскивала второй элемент для сравнения, внутри там будет вызываться item = key(i) print(l) # изначально print(result_1) # отсортировано по первому элементу print(result_2) # здесь по второму
взят элемент (4, 3) и из него будет возвращаться второй элемент для сравнения 3
взят элемент (3, 4) и из него будет возвращаться второй элемент для сравнения 4
взят элемент (1, 2) и из него будет возвращаться второй элемент для сравнения 2
взят элемент (2, 1) и из него будет возвращаться второй элемент для сравнения 1
[(4, 3), (3, 4), (1, 2), (2, 1)]
[(1, 2), (2, 1), (3, 4), (4, 3)]
[(2, 1), (1, 2), (4, 3), (3, 4)]
Process finished with exit code 0
Отредактировано xam1816 (Июнь 17, 2023 17:07:56)
Офлайн
xam1816но ведь..:
print(i(y)) # зачем подаешь название функции????
xam1816подал в аргумент функции название другой функции без скобок
Если в аргументах какой-то функции видишь название другой функции без скобок, то очевидно, что эта функция будет выполнятся внутри этой какой-то функции.
Офлайн
wiseruskтак тебе никто не говорил засовывать название функций в другие функции без разбора, а говорилось, что если видишь такое, как например в функции sorted, что там аргумент принимает название функции, то после вызова функции sorted, внутри будет выполнятся та функция, которую поместили в аргумент.
подал в аргумент функции название другой функции без скобок
wiseruskона не отрабатывает будучи незапущенной, она запускается после вызова основной функции, не до этого
почему функция отрабатывает будучи не запущенной
wiseruskто что ты видишь название key, то это просто дали такое название аргумента.
Методом научного тыка я на данный момент выяснил что в таком виде её запускает только лишь функция сортед и только через ключ
def is_paragraph(tag): return tag.name == 'p' paragraphs = soup.find_all(name=is_paragraph)
Офлайн