Можно ли ничего не возвращать из функции в Python?
с простым фильтром, который тестирует ввод в диапазоне 0-100.
Это возвращает none, если foo_input is > 100 . Но может ли оно «не» вернуть что-нибудь? или функция всегда должна что-то вернуть?
5 ответов
Функции всегда возвращают что-то (по крайней мере, None , когда во время выполнения не было достигнуто выражение return), а конец функции достигнут).
Другой случай, когда они прерываются исключениями. В этом случае обработка исключений будет «доминировать над стеком», и вы вернетесь к соответствующему except или получите некоторую неприятную ошибку:)
Что касается вашей проблемы, я должен сказать, что есть две возможности: Либо у вас есть что-то вернуть, либо у вас его нет.
Функции в Python (def, return)

Статьи
Введение
В данной статье узнаем про ключевое слово def и как его использовать, а также об операторе return.
Определение функции в Python
Чтобы создать функцию в Python, необходимо использовать ключевое слово def. Синтаксис выглядит следующим образом:
- название_функции – уникальное имя функции;
- аргументы – параметры, которые функция принимает. Может быть пустым, если функция не принимает аргументов;
- блок кода – блок операторов, который выполняется при вызове функции;
- return – оператор, который возвращает результат выполнения функции. Необязательный, т.к. функция может ничего не возвращать.
Пример функции, которая принимает два аргумента и возвращает их сумму:
Вызов функции
Чтобы функция сработала, её нужно вызвать. Пример вызова функции:
Необязательные аргументы функции
Также в функцию можно добавлять необязательные аргументы. Для этого при её создании нужно указать значение по умолчанию для аргумента:
Таким образом аргумент b стал необязательным, и его можно не указывать при вызове функции:
Оператор return
Теперь поговорим про оператор return более подробно. И так, данный оператор возвращает результат выполнения функции. Т.е. после его срабатывания функция перестаёт работать, даже если после него идёт какой-то код.
В примере выше будет возвращён результат выполнения функции в виде суммы a + b, а функция print() будет проигнорирована.
Возвращение нескольких значений
Функция также может возвращать несколько значений в виде кортежа:
Заключение
В ходе статьи мы с Вами узнали про функции в Python, в частности о ключевом слове def и операторе return. Надеюсь Вам понравилась статья, желаю удачи и успехов!
Почему функция выводит none в Python?

Достаточно часто возникают вопросы: "почему моя функция ничего не возвращает?!", "почему из функции возвращается None?", "не могу понять откуда появляется None. ".
Для начала необходимо понимать и помнить, что любая функция в Python всегда что-то возвращает и если не используется оператор return для возврата значения (такие случаи бывают, но об этом позднее), то функция возвращает объект None . В случае если return используется, но после него ничего не указывается явно, то по умолчанию считается, что там стоит объект None .
Порой бывает, что по ошибке указывается возврат вместе с функцией print() . Для информации функция print() в Python выводит переданные аргументы на стандартное устройство вывода (экран), но при этом не возвращает значений, т.е. можно считать, что возвращает None .
Если дальше по коду проводятся манипуляции с переменной b, например сложение, то возникнет ошибка TypeError :
Возможен вариант, когда функция и не должна ничего возвращать, она производит какие-либо действия с объектами в глобальной зоне видимости и на этом ее функционал заканчивается. В таком случае return может и не использоваться, но необходимо помнить, что в этом случае функция возвращает None .
В примере выше использовался метод работы со списками extend() и необходимо понимать, что метод изменяет объект, к которому применен, а не возвращает результат изменения объекта.
Функции в Python

Использование def утверждения является наиболее распространенным способом определить функцию в Python. Это утверждение так называемое соединение заявление одного пункта со следующим синтаксисом:
function_name известна как идентификатор функции. Так как определение функции является исполняемым утверждение его исполнение связывает имя функции к функции объекта , который может быть назван позже с использованием идентификатора.
parameters необязательного список идентификаторов , которые получают привязанные к значениям в качестве аргументов при вызове функции. Функция может иметь произвольное количество аргументов, разделенных запятыми.
statement(s) — также известное как тело функции — это непустое последовательность операторов , выполняемых при каждом вызове функции. Это означает , что тело функции не может быть пустым, так же как и любой отступом блок .
Вот пример простого определения функции, целью которой является для печати Hello каждый раз , когда это называется:
Теперь давайте называть определенные greet() функции:
Это еще один пример определения функции, которая принимает один единственный аргумент и отображает переданное значение каждый раз, когда вызывается функция:
После того, что greet_two() функция должна быть вызвана с аргументом:
Также вы можете задать значение по умолчанию для этого аргумента функции:
Теперь вы можете вызывать функцию без указания значения:
Вы заметите, что в отличие от многих других языков, вам не нужно явно объявлять тип возвращаемого значения функции. Функции Python могут возвращать значения любого типа с помощью return ключевого слова. Одна функция может возвращать любое количество разных типов!
Пока это правильно обрабатывается вызывающей стороной, это совершенно правильный код Python.
Функция , которая достигает конца исполнения без оператора возврата всегда будет возвращать None :
Как упоминалось ранее, определение функции должно иметь тело функции, непустую последовательность операторов. Поэтому pass используется оператор в теле функции, которая является нулевой операции — когда он выполняется, ничего не происходит. Он делает то, что значит, он пропускает. Это полезно в качестве заполнителя, когда синтаксически требуется оператор, но не нужно выполнять код.
Возвращение значений из функций
Функции могут return значение , которое можно использовать непосредственно:
или сохраните значение для последующего использования:
или используйте значение для любых операций:
Если return встречается в функции функция будет немедленно вышла и последующие операции не будут оцениваться:
Вы также можете return несколько значений (в виде кортежа):
Функция, без return заявления неявно возвращает None .Точно так же функция с return утверждением, но не возвращает значение или переменная возвращает None .
Определение функции с аргументами
Аргументы определены в скобках после имени функции:
Имя функции и список ее аргументов называются сигнатура функции. Каждый именованный аргумент фактически является локальной переменной функции.
При вызове функции укажите значения аргументов, перечислив их в порядке
или укажите их в любом порядке, используя имена из определения функции:
Определение функции с необязательными аргументами
Дополнительные аргументы могут быть определены путем назначения ( с использованием = ) значение по умолчанию имя-аргумента:
Вызов этой функции возможен тремя различными способами:
Предупреждение
Изменяемые типы ( list , dict , set и т.д.) , следует относиться с осторожностью , когда дается как атрибут по умолчанию. Любая мутация аргумента по умолчанию изменит его навсегда. См Определение функции с дополнительными изменяемыми аргументами .
Определение функции с несколькими аргументами
Можно дать функции столько аргументов, сколько нужно, единственные фиксированные правила — это то, что каждое имя аргумента должно быть уникальным и что необязательные аргументы должны быть после не необязательных:
При вызове функции вы можете указать каждое ключевое слово без имени, но тогда порядок имеет значение:
Или совмещать указание аргументов с именем и без. Тогда те, у кого есть имя, должны следовать за теми, у кого нет, но порядок тех, у кого есть имя, не имеет значения:
Произвольное количество позиционных аргументов:
Определение функции , способную принимать произвольное количество аргументов может быть сделано с помощью префиксов один из аргументов с *
Вы не можете предоставить по умолчанию для args , например func(*args=[1, 2, 3]) поднимет синтаксическую ошибку (даже не компилировать).
Вы не можете обеспечить их по имени при вызове функции, например func(*args=[1, 2, 3]) поднимет TypeError .
Но если у вас уже есть свои аргументы в массиве (или любой другой Iterable ), вы можете вызвать вашу функцию следующим образом: func(*my_stuff) .
Эти аргументы ( *args ) можно обращаться по индексу, например , args[0] возвращает первый аргумент
Произвольное количество аргументов ключевого слова
Вы можете принимать произвольное число аргументов с именем, определяя аргумент в определении с двумя * перед ним:
Вы не можете предоставить это без имен, например func(1, 2, 3) поднимет TypeError .
kwargs это простой родной словарь питона. Например, args[‘value1’] даст значение аргумента value1 .Обязательно проверьте заранее , что есть такой аргумент или KeyError будет поднят.
Предупреждение
Вы можете смешивать их с другими необязательными и обязательными аргументами, но порядок внутри определения имеет значение.
- Позиционные / ключевые аргументы приходят в первую очередь. (Обязательные аргументы).
- Потом приходит произвольные *arg аргументы. (Необязательный).
- Потом приходят аргументы ключевых слов только. (Необходимые).
- Последнее приветиходит произвольные ключевое слово **kwargs (Необязательный).
- arg1 должен быть задан, в противном случае TypeError поднимается. Это может быть задано как позиционный ( func(10) ) или ключевым словом аргумента ( func(arg1=10) ).
- kwarg1 также должен быть предоставлен, но она может быть обеспечена только в качестве ключевого слова-аргумента: func(kwarg1=10) .
- arg2 и kwarg2 не являются обязательными. Если значение должно быть изменено тем же правилам , как и для arg1 (либо позиционной или ключевое слово) и kwarg1 (только ключевое слово) применяются.
- *args уловы дополнительные позиционные параметры. Но обратите внимание, что arg1 и arg2 должны быть предоставлены в качестве позиционных аргументов передать аргументы *args : func(1, 1, 1, 1) .
- **kwargs перехватывает все дополнительные параметры ключевых слов. В этом случае любой параметр , который не arg1 , arg2 , kwarg1 или kwarg2 .Например: func(kwarg3=10) .
- В Python 3, вы можете использовать * в покое , чтобы указать , что все последующие аргументы должны быть указаны в качестве ключевых слов. Для экземпляра math.isclose функции в Python 3.5 и выше , определяется с использованием def math.isclose (a, b, *, rel_tol=1e-09, abs_tol=0.0) , что означает , что первые два аргумента могут быть поставлены позиционно , но по желанию третий и четвертый параметры могут быть предоставлены только как ключевые аргументы.
Python 2.x не поддерживает параметры только для ключевых слов. Такое поведение можно эмулировать с kwargs :
Примечание по именованию
Условность наименования необязательных позиционных аргументов args и необязательных аргументы ключевых слов kwargs просто условность вы можете использовать любые имена вам нравится , но это полезно следовать соглашению , чтобы другие знали , что вы делаете, или даже сам потом так пожалуйста.
Обратите внимание на уникальность
Любая функция может быть определена ни с одной или *args и ни один или один **kwargs , но не более чем с одним из каждых. Также *args должен быть последним аргументом позиционного и **kwargs должен быть последним параметром. Попытка использовать более одного либо приведет к исключению ошибок синтаксиса.
Замечание о функциях вложения с необязательными аргументами
Можно гнездовые такие функции и обычная условность, чтобы удалить элементы , что код уже обрабатываемые , но если вы передаете вниз параметры , которые нужно передать дополнительные позиционные аргументы с * префиксом и необязательной ключевыми словами арг с ** приставкой , иначе аргументы будут передаваться как список или кортеж, а kwargs — как один словарь. например:
Определение функции с необязательными изменяемыми аргументами
Существует проблема при использовании дополнительных аргументов с изменяемым типом умолчанию ( как описано в Определение функции с необязательными аргументами ), что потенциально может привести к непредсказуемому поведению.
Объяснение
Эта проблема возникает из — за аргументов функции по умолчанию инициализируются один раз, в тот момент , когда функция определена, а не (как и многие другие языки) , когда функция вызывается. Значения по умолчанию сохраняется в функции объект __defaults__ переменного члена.
Для неизменяемых типов (см передачи аргументов и переменчивости ) это не проблема , потому что нет никакого способа , чтобы мутировать переменные; это может только быть переназначено, оставляя оригинальное значение неизменным. Следовательно, последующие гарантированно будут иметь одинаковое значение по умолчанию. Однако, для изменяемого типа, исходное значение может мутировать, делая звонки на его различные функции — членов. Следовательно, последовательные вызовы функции не гарантируют начальное значение по умолчанию.
Решение
Если вы хотите , чтобы убедиться , что аргумент по умолчанию всегда один указывается в определении функции, то решение всегда использовать неизменный тип как ваш аргумент по умолчанию.
Общая идиома , чтобы достичь этого , когда изменяемый типа необходим по умолчанию, является не использовать None (неизменный) в качестве аргумента по умолчанию , а затем присвоить фактическое значение по умолчанию для переменного аргумента , если оно равно None .
Лямбда функции
lambda ключевое слово создает функцию инлайн, содержащую одно выражение. Значение этого выражения — это то, что функция возвращает при вызове.
который, когда называется как:
Это можно записать в виде лямбда-функции следующим образом:
Это создает встраиваемую функцию с именем greet_me , который возвращает Hello .Обратите внимание , что вы не пишете return при создании функции с лямбда. Значение после : автоматически возвращается.
После присвоения переменной она может использоваться как обычная функция:
lambda — s может принимать аргументы, тоже:
Они также могут принимать произвольное количество аргументов / ключевых слов, как обычные функции.
lambda — ы обычно используются для коротких функций, которые удобно определить в точке , где они называются ( как правило , с sorted , filter и map ).
Например, эта строка сортирует список строк, игнорируя их регистр и игнорируя пробелы в начале и в конце:
Список сортировки просто игнорируя пробелы:
Примеры с числовыми списками:
Другие функции (с / без аргументов) можно вызывать внутри лямбда-функции.
Это полезно , потому что lambda может содержать только одно выражение и с помощью дочерней функции можно запустить несколько операторов.
Передача аргумента и изменчивость
Сначала немного терминологии:
- аргумент (фактический параметр): фактическая переменная передается в функцию;
- параметр (формальный параметр): принимающая переменная, которая используется в функции.
В Python, аргументы передаются по заданию (в отличие от других языков, где аргументы могут передаваться по значению / задания / указателя).
Мутирование параметра приведет к изменению аргумента (если тип аргумента является изменяемым).
Переназначение параметра не переназначит аргумент.
В Python, мы на самом деле не присваивать значения переменным, вместо того, чтобы мы связываем (то есть переуступать, присоединять) переменные (рассматриваемые как имена) к объектам.
- Неизменные: Целые, строки, кортежи, и так далее. Все операции делают копии.
- Mutable: списки, словари, наборы, и так далее. Операции могут или не могут мутировать.
Return
Замыкания в Python создаются вызовами функций. Здесь вызов makeInc создает привязку для x , ссылка внутри функции inc .Каждый вызов makeInc создает новый экземпляр этой функции, но каждый экземпляр имеет ссылку на другую связыванию x .
Обратите внимание, что в то время как при обычном замыкании вложенная функция полностью наследует все переменные из окружающей ее среды, в этой конструкции вложенная функция имеет доступ только на чтение к унаследованным переменным, но не может назначать их
Python 3 предлагает nonlocal заявление для реализации полного закрытия с вложенными функциями.
Рекурсивные функции
Рекурсивная функция — это функция, которая вызывает себя в своем определении. Например, математическая функция, факториала, определяется factorial(n) = n*(n-1)*(n-2)*. *3*2*1 .может быть запрограммирован как
как и ожидалось. Обратите внимание , что эта функция является рекурсивной , потому что второй return factorial(n-1) , где функция называет себя в своем определении.
Некоторые рекурсивные функции могут быть реализованы с помощью лямбда , факториала с помощью лямбда — бы что — то вроде этого:
Функция выводит то же, что и выше.
Предел рекурсии
Существует предел глубины возможной рекурсии, который зависит от реализации Python. Когда предел достигнут, возникает исключение RuntimeError:
Можно изменить рекурсии предел глубины, используя sys.setrecursionlimit(limit) и проверить этот предел sys.getrecursionlimit() .
Из Python 3.5, исключение составляет RecursionError , который является производным от RuntimeError .
Вложенные функции
Функции в Python являются первоклассными объектами. Они могут быть определены в любой области
Функции захвата их охватывающей области видимости могут передаваться как любой другой вид объекта
Итерация и распаковка словаря
Функции позволяют указывать следующие типы параметров: позиционные, именованные, переменные позиционные, аргументы ключевых слов (kwargs). Вот четкое и краткое использование каждого типа.
Принудительное использование именованных параметров
Все параметры, указанные после первой звездочки в сигнатуре функции, предназначены только для ключевых слов.
В Python 3 можно поставить одну звездочку в сигнатуре функции, чтобы гарантировать, что оставшиеся аргументы могут быть переданы только с помощью аргументов ключевого слова.