Продолжение функций, кортежи
Кортеж — это неизменяемый и более быстрый аналог списка. Он защищает хранимые данные от непреднамеренных изменений. Называть его можно по-разному: кортеж, тапл, тюпл. Смысл от этого не меняется.
Что означает неизменяемый? То, что после его создания вы не сможете изменить его содержимое.
Посмотрим на примере
Повторим тот же самый код, но с кортежем
Ничего не получится.
Синтаксис определения кортежей
При инициализации кортежа лучше завести привычку писать запятую после последнего элемента, иначе есть шанс ошибиться в случае кортежа, состоящего из одного элемента
Когда использовать кортежи? Когда нужно что-то неизменяемое. Рассмотрим пример
У меня большие сомнения, что состав месяцев года когда-то изменится. Так что выбор тут очевиден — tuple!
Возврат нескольих значений из функции
Tuple очень полезен, если из функции нужно вернуть несколько объектов. До этого мы всегда возвращали из функции только один объект. Например:
А что делать, если нужно вернуть несколько аргументов? В контрольной работе был частотный список слов русского словаря. Он имел вот такой вид:
Можно сильно упростить себе жизнь, если написать функцию, которая будет обрабатывать каждую строчку и сразу возвращать слово, его морфемы и частотность.
И потом пользоваться этой функцией при обработки каждой строки вообще не заботясь о том, какие она операции выполняет.
Обратите внимание, что можно не ставить скобки в последней строке, питон и так знает, что если перечислено несколько значений через запятую после return , то нужно вернуть кортеж.
Именованные аргументы функции
Мы уже несколько раз сталкивались с именованными аргументами, но не знали, что они так называются.
Все пользовались методом строк split() :
В данном случае maxsplit — это именованный аргумент метода split()
Всеми любимая функция print() имеет сразу несколько именованных аргументов:
- sep=’ ‘
- end=’\n’
- и другие
Причем мы видим, что этим аргументам что-то присвоено — используется знак = . На самом деле разработчики языка Python много думали и присвоили этим аргументам именно такие значения чтобы всем было удобно, но их можно задать явно. Например, если в конце строки мы хотим распечатать что-то экзотическое, то можно это сделать:
Если мы хотим при печати нескольих аргументов разделить их не пробелом, а чем-то еще, то можно написать вот так:
Как задавать именованные аргументы для своих функций?
Важно! Именованные аргументы всегда должны опеределяться после позиционных (обычных) аргументов:
Нельзя определить именованный аргумент без назначения ему начального значения. Можно только задать специальное значение:
Именованные аргументы можно вызывать как позиционные в порядке их определения.
Большинство функций стандартной библиотеки python определены с использованием именованных аргументов, однако часто при вызове той или иной функции име не используется.
Этим нужно пользоваться с осторожностью. Если в функцию передается много параметров (больше 3), то лучше писать имя каждого параметра.
Домашнее задание
Ваша задача сделать универсальную функцию для фильтрации слов в тексте. Функция должна работать для любого нормального текста (текста без пробелов подаваться не будет). Текст возьмите любой, какой хотите. Ваш текст не нужно передавать в виде решения. Решение — это просто функция.
- startswith — строка, с которой должно начинаться слово
- endswith — строка, на которую должно заканчиваться слово
- min_length — минимальная длина слова
- contains — строка, которую обязательно должна быть в слове
Задача будет разбита на несколько вариантов. Каждый вариант реализует только часть фильтров функции. Значения для фильтров будут передаваться в функцию в виде именованных аргументов.
Если функция одного варианта вызывается с аргументами другого варианта, то функция должна выдавать ошибку (про формат ошибки ниже).
Формат возвращаемого значения: неизменяемый список из 3 элементов:
- Код успешности. Нужно вернуть 0, если пользователь ввел аргумент, который делает другая команда и 1, если все прошло успешно
- Сообщение пользователю. Если произошла ошибка, то помимо кода неуспешности 0 нужно вернуть сообщение об ошибке.
- Список отфильтрованных слов. Если ошибка, то просто пустой список.
Скелет программы для работы вот такой:
Как видите, здесь нет функции main и пользовательского ввода через input() . Следует написать просто функцию. Где она будет использоваться — не важно. Ввод может прийти из функции input() , может из файла, может из ввода пользователя на сайте. Ваша задача — это написать функцию. Конечно, при отладке вы должны будете как-то подавать данные на вход функции (например, через input() ), но в конечном решении должна быть просто функция.
Распределение фильтров функции по вариантам:
- 1, 7 — endswith , min_length
- 2, 3, 4 — contains , startswith
- 5, 6 — min_length , contains
Как видите у некоторых команд повторяются функции. Как говорится, “Доверяй, но распределяй одни и те же задачи по разным командам, чтобы работа точно была сделана”.
Пример работы с программой для варианта 3 (в данном случае ввод вообще сделан руками в idle):
Как вернуть сразу несколько значений из функции в Python 3
Сегодня мы делимся с вами переводом статьи, которую нашли на сайте medium.com. Автор, Vivek Coder, рассказывает о способах возврата значений из функции в Python и объясняет, как можно отличить друг от друга разные структуры данных.
Фото с сайта Unsplash. Автор: Vipul Jha
Python удобен в том числе тем, что позволяет одновременно возвращать из функции сразу несколько значений. Для этого нужно воспользоваться оператором return и вернуть структуру данных с несколькими значениями — например, список общего количества рабочих часов за каждую неделю.
Структуры данных в Python используются для хранения коллекций данных, которые могут быть возвращены посредством оператора return . В этой статье мы рассмотрим способы возврата нескольких значений с помощью подобных структур (словарей, списков и кортежей), а также с помощью классов и классов данных (Python 3.7+).
Способ 1: возврат значений с помощью словарей
Словари содержат комбинации элементов, которые представляют собой пары «ключ — значение» ( key:value ), заключенные в фигурные скобки ( <> ).
Словари, на мой взгляд, это оптимальный вариант для работы, если вы знаете ключ для доступа к значениям. Далее представлен словарь, где ключом является имя человека, а соответствующим значением — возраст.
А теперь перейдем к функции, которая возвращает словарь с парами «ключ — значение».
Способ 2: возврат значений с помощью списков
Списки похожи на массивы, сформированные с использованием квадратных скобок, однако они могут содержать элементы разных типов. Списки также отличаются от кортежей, поскольку являются изменяемым типом данных. То есть любой список может меняться.
Списки — одна из наиболее универсальных структур данных в Python, потому что им не обязательно сохранять однородность (в них можно включать строки, числа и элементы). Иногда списки даже используют вместе со стеками или очередями.
Вот пример, где возвращается список с натуральными числами.
Способ 3: возврат значений с помощью кортежей
Кортежи — это упорядоченные неизменяемые объекты в Python, которые обычно используются для хранения коллекций неоднородных данных.
Кортежи напоминают списки, однако их нельзя изменить после того, как они были объявлены. А еще, как правило, кортежи быстрее в работе, чем списки. Кортеж можно создать, отделив элементы запятыми: x, y, z или (x, y, z) .
На этом примере кортеж используется для хранения данных о сотруднике (имя, опыт работы в годах и название компании).
А вот пример написания функции для возврата кортежа.
Обратите внимание: мы опустили круглые скобки в операторе return , поскольку для возврата кортежа достаточно просто отделить каждый элемент запятой (как показано выше).
Не забывайте, что кортеж можно создать с помощью запятой вместо круглых скобок. Круглые скобки требуются только в тех случаях, когда используются пустые кортежи или вам нужно избежать синтаксической неточности.
Чтобы лучше разобраться в кортежах, обратитесь к официальной документации Python 3 (документация приведена на английском языке. — Прим. ред.).
Ниже показан пример функции, которая использует для возврата кортежа круглые скобки.
Повторюсь, кортежи легко перепутать со списками (в конце концов, и те, и другие представляют собой контейнер, состоящий из элементов). Однако нужно помнить о фундаментальном различии: кортежи изменить нельзя, а списки — можно.
Способ 4: возврат значений с помощью объектов
Тут все так же, как в C/C++ или в Java. Можно просто сформировать класс (в C он называется структурой) для сохранения нескольких признаков и возврата объекта класса.
Способ 5: возврат значений с помощью классов данных (Python 3.7+)
Классы данных в Python 3.7+ как раз помогают вернуть класс с автоматически добавленными уникальными методами, модулем typing и другими полезными инструментами.
Чтобы лучше разобраться в классах данных, обратитесь к официальной документации Python 3 (документация приведена на английском языке. — Прим. ред.).
Вывод
Цель этой статьи — ознакомить вас со способами возврата нескольких значений из функции в Python. И, как вы видите, этих способов действительно много.
Учите матчасть и постоянно развивайте свои навыки программирования. Спасибо за внимание!
Возврат нескольких значений из функции в Python
В этом посте мы обсудим, как вернуть несколько значений из функции в Python.
1. Использование кортежей
Наиболее распространенный подход к возврату нескольких значений из функции в Python — использование кортежа. Идея состоит в том, чтобы упаковать возвращаемые значения в кортеж, вернуть кортеж из функции и распаковать его внутри вызывающей функции.
Это предпочтительный подход, когда вам нужно вернуть только два или три поля из функции. В следующем примере показано, как можно использовать кортежи для возврата двух полей разных типов из функции.
Главное преимущество кортежей в том, что их очень легко создавать и распаковывать. Кортежи отлично работают, когда общее количество возвращаемых значений меньше. Однако это легко становится проблематичным, когда общее количество возвращаемых значений увеличивается. Чем больше значений, тем сложнее ими управлять и правильно распаковывать.
2. Использование именованных кортежей
Чтобы справиться с проблемами, связанными с кортежем, вы можете использовать именованные кортежи, которые представляют собой объекты, подобные кортежу, но имеющие поля, доступные при поиске по атрибуту. В следующем примере кода показано, как реализовать именованные кортежи:
Функции в Python
Функции — важный компонент любого языка, и Python не является исключением. При написании любого крупного проекта невозможно обойтись без функций, поэтому каждый программист должен знать, как работать с ними.
Что такое функция
Функция — это блок кода, который можно многократно вызывать на выполнение. Она является фундаментальной частью любого языка программирования.
Функция может использоваться для обработки данных, она получает на вход значения, обрабатывает его и возвращает результат в программу. Также она может не возвращать значение, а выводить его на экран или записывать в файл.
Программист может написать собственную функцию или использовать готовые решения языка, если они есть, конечно. Например, лучше самому не написать функцию для определения максимального числа, а воспользоваться стандартной max() .
Объявление
Объявляя функцию, нужно следовать определенным правилам:
- Объявление происходит с помощью ключевого слова def , за ним идёт имя функции и круглые скобки ().
- Аргументы, передаваемые в функцию, должны находится в круглых скобках. Там же можно определить их значения по умолчанию, указав их после знака равно.
- Перед основным содержимым желательно включить строку документации (docstring), которая обычно описывает назначение и основные принципы работы функции.
- Тело функции начинается после знака двоеточия. Важно не забыть об отступах.
- Чтобы выйти из функции в Python, используют оператор return [значение] . Если оператор опущен, будет возвращено значение None .
Функцию можно объявить где угодно: внутри модуля, класса или другой функции. Если она объявляет внутри класса, то называется методом класса и вызывается так: class_name.function() .
Синтаксис объявления
Параметры (аргументы) нужно передавать в том порядке, в котором они определены в круглых скобках.
Пример кода
Функция складывает два числа, переданные в качестве аргументов. Если один или оба аргумента не были переданы, используются значения по умолчанию.
Вызов
После определения функции её можно вызвать в любой точке скрипта, как в теле самого скрипта, так и в теле другой функции:
Значение функции можно сразу передать в переменную или в другую функцию:
Необязательные параметры
При описании функции в Python 3 аргументы, которым задаются начальные значения, являются необязательными. Вначале должны описываться обязательные параметры и только после них необязательные.
При вызове функции нам не обязательно указывать значения необязательных параметров. Если мы хотим изменить значение аргумента, не меняя начальные значения других аргументов, можно обращаться к нему по ключу.
Вывод будет следующим:
Функция с переменным числом аргументов
Часто возникает необходимость создать такую функцию, которая может принимать разное количество аргументов. Это можно реализовать с помощью передачи списка или массива, однако Python позволяет использоваться более удобный подход (также с использованием списка).
Для того чтобы функция могла принять переменное количество аргументов, перед именем аргумента ставится символ » * «. Когда программист передаёт аргументы, они записываются в кортеж, имя которого соответствует имени аргумента:
Вместо одного символа звёздочки можно использовать два, тогда аргументы будут помещаться не в список, а в словарь:
Анонимные функции
Это особый вид функций, которые объявляются с помощью ключевого слова lambda вместо def :
Лямбда функции принимают любое количество аргументов, но не могут содержать несколько выражений и всегда возвращают только одно значение.
В программировании на Python можно обойтись без анонимных функций, которые по сути являются обычными, но без имени и с ограничением в одно выражение. Однако их использование в нужных местах упрощает написание и восприятие кода. Например, в программе калькулятор мы с её помощью сделали обработчики нажатия кнопок.
Синтаксис
Синтаксис лямбда функции в Python 3 предусматривает использование только одного выражения: lambda arg1, arg2, … argn: выражение .
На практике они работают так:
Возврат значений
С помощью оператора return из функции можно вернуть одно или несколько значений. Возвращаемым объектом может быть: число, строка, None.
Чтобы вернуть несколько значений, нужно написать их через запятую. Python позволяет вернуть из функции список или другой контейнер: достаточно указать после ключевого слова return имя контейнера.
Вот пример когда возвращается список:
А это пример того, как функция в Python 3 возвращает несколько значений. Так как переменные перечислены через запятую, то они образуют список. Эти значения можно присвоить сразу нескольким переменным, как это показано в следующем примере:
Рекурсия
Рекурсией называется процесс, когда функция вызывает саму себя. Её можно использовать вместо циклов, например, для задачи по нахождению факториала.
Рекурсию рекомендуется использовать только там, где это действительно необходимо. Интерпретатор Python автоматически выделяет память для выполняющейся функции, если вызовов самой себя будет слишком много, это приведёт к переполнению стека и аварийному завершению программы. Следующий код вызовет исключение «RecursionError», которая показывает, что превышен максимальный лимит рекурсии.
Узнать максимальный лимит и его изменить можно с помощью getrecursionlimit() и setrecursionlimit(предел) из библиотеки sys.
Один из примеров применения рекурсии — это расчёт чисел Фибоначчи.
Пустая функция
Чтобы создать пустую функцию, нужно в её теле использовать оператор заглушки pass . Тогда она будет существовать и не выполнять никаких действий.
Такие функции могут использоваться для различных специфичных задач, например, при работе с классами, асинхронной отправкой форм.
Области видимости
Область видимости — важная составляющая любого языка программирования. С её помощью в одном модуле можно использовать одно и то же имя переменной несколько раз.
Области видимости также делают программу более безопасной, не позволяя получить доступ к важным переменным.
В Python существует две области видимости:
- Глобальная. Переменные объявляются непосредственно внутри модуля и доступны из любой точки программы.
- Локальная. Переменные объявляются в теле функции и доступны только внутри неё.
Важно понимать, из локальной области видимости можно обратить к переменным, находящимся в глобальной, но не наоборот.
Подробнее про области видимости можно прочитать в отдельной статье на сайте.
Основные встроенные функции в Python
Python предоставляет программисту все необходимые основные функции для работы, кроме того, используя дополнительные модули (подключая разные библиотеки), можно найти уже реализованные методы для практически любой задачи.