Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 17, 2023 00:08:44

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

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

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

Для начала уясни одно, функция выполнится только со скобками. Если в аргументах какой-то функции видишь название другой функции без скобок, то очевидно, что эта функция будет выполнятся внутри этой какой-то функции.

в следующем коде будет ошибка, потому что print возвращает None, но зато будет видно, что внутри sorted функция выполнялась
  
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'

Офлайн

#2 Июнь 17, 2023 11:06:05

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

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

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)

Офлайн

#3 Июнь 17, 2023 17:01:32

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

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

  
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)

Офлайн

#4 Июнь 18, 2023 11:22:31

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

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

xam1816
print(i(y)) # зачем подаешь название функции????
но ведь..:
xam1816
Если в аргументах какой-то функции видишь название другой функции без скобок, то очевидно, что эта функция будет выполнятся внутри этой какой-то функции.
подал в аргумент функции название другой функции без скобок

Суть-то вопроса изначально была в том почему функция отрабатывает будучи не запущенной. Методом научного тыка я на данный момент выяснил что в таком виде её запускает только лишь функция сортед и только через ключ. По крайней мере больше никак добиться её запуска в таком виде мне не удалось…
Полагаю, эта фишка не особо часто используется в реальных задачах и поэтому, судя по всему, многие особо не в курсе за неё… Ну или не загоняются по этому поводу, типа работает и ладно

Офлайн

#5 Июнь 18, 2023 12:37:04

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

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

wiserusk
подал в аргумент функции название другой функции без скобок
так тебе никто не говорил засовывать название функций в другие функции без разбора, а говорилось, что если видишь такое, как например в функции sorted, что там аргумент принимает название функции, то после вызова функции sorted, внутри будет выполнятся та функция, которую поместили в аргумент.
wiserusk
почему функция отрабатывает будучи не запущенной
она не отрабатывает будучи незапущенной, она запускается после вызова основной функции, не до этого
wiserusk
Методом научного тыка я на данный момент выяснил что в таком виде её запускает только лишь функция сортед и только через ключ
то что ты видишь название key, то это просто дали такое название аргумента.
в Beautifulsoup метод тоже может принимать название функции

  
def is_paragraph(tag):
    return tag.name == 'p'
paragraphs = soup.find_all(name=is_paragraph)

это не значит что функция отработала раньше всех, без скобок, а значит, что она будет использоваться внутри метода find_all

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version