Python def function: как вы определяете конец функции?

Я просто изучаю python и смущен, когда заканчивается "def" функции?

Я вижу примеры кода, например:

def myfunc(a=4,b=6):
    sum = a + b
    return sum

myfunc()

Я знаю, что это не конец из-за возврата (потому что я видел, если утверждения... если FOO, чем return BAR, else верните FOOBAR). Как Python знает, что это не рекурсивная функция, которая называет себя? Когда функция запускается, она просто продолжает просматривать программу до тех пор, пока не найдет ответ? Это привело бы к некоторым интересным ошибкам.

Спасибо

Ответ 1

В пробеле Python важно. Функция заканчивается, когда отступ становится меньше (меньше).

def f():
    pass # first line
    pass # second line
pass # <-- less indentation, not part of function f.

Обратите внимание, что однострочные функции могут быть записаны без отступов в одной строке:

def f(): pass

И тогда есть использование полуколоней, но это не рекомендуется:

def f(): pass; pass

Три формы выше показывают, как синтаксически определяется конец функции. Что касается семантики, в Python есть три способа выхода из функции:

  • Использование оператора return. Это работает так же, как и на любом другом императивном языке программирования, который вы, возможно, знаете.

  • Использование оператора yield. Это означает, что функция является генератором. Объяснение его семантики выходит за рамки этого ответа. Посмотрите Может ли кто-нибудь объяснить мне инструкцию yield python?

  • Просто выполнив последнее утверждение. Если операторов больше нет, а последний оператор не является выражением return, то функция существует так, как будто последнее утверждение было return None. То есть без явного выражения return функция возвращает None. Эта функция возвращает None:

    def f():
        pass
    

    И вот так:

    def f():
        42
    

Ответ 2

Python является чувствительным к пробелу в отношении отступов. Как только уровень отступа падает до уровня, на котором определена функция, функция заканчивается.

Ответ 3

Чтобы быть точным, блок заканчивается, когда он сталкивается с непустой строкой с отступом не более одного уровня с началом. Эта непустая строка не является частью этого блока Например, следующая печать заканчивается двумя блоками одновременно:

def foo():
    if bar:
        print "bar"

print "baz" # ends the if and foo at the same time

Уровень отступа меньше или равен как def, так и if, поэтому он заканчивает их оба.

Строки без инструкции, независимо от отступов, не имеют значения

def foo():
    print "The line below has no indentation"

    print "Still part of foo"

Но утверждение, которое отмечает конец блока, должно быть отступом на том же уровне, что и любой существующий отступ. Таким образом, следующая ошибка:

def foo():
    print "Still correct"
   print "Error because there is no block at this indentation"

В общем случае, если вы привыкли к фигурному языку фигур, просто вставьте код, подобный им, и все будет в порядке.

Кстати, "стандартный" способ отступов имеет только пробелы, но, конечно, вкладка возможна только, но, пожалуйста, не смешивайте их обоих.

Ответ 4

Интересно, что если вы просто набираете интерактивный интерпретатор python, вам нужно следовать функции с пустой строкой. Это не работает:

def foo(x):
  return x+1
print "last"

хотя это совершенно законный синтаксис python в файле. Существуют и другие синтаксические различия при наборе текста для интерпретатора, поэтому будьте осторожны.

Ответ 5

пробелы. когда блок закончен, что когда определение функции закончено.

когда функция запускается, она продолжается до тех пор, пока не закончится, или пока не будет встречен оператор return или yield. Если функция завершается без встречных return или yield операторов None возвращается неявно.

в учебник содержится больше информации.

Ответ 6

В нем используется отступ

 def func():
     funcbody
     if cond: 
         ifbody
     outofif

 outof_func 

Ответ 7

Таким образом, имеет значение отступы. Как указывают другие пользователи здесь, когда уровень отступа находится в той же точке, что и декларация функции def, ваша функция закончилась. Имейте в виду, что вы не можете смешивать вкладки и пробелы в Python. Большинство редакторов предоставляют поддержку для этого.