Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практическое программирование на Python. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Функция также может принимать переменное количество пози­ционных аргументов, тогда перед именем ставится «*»:
def my_super_sum(*args): return sum(args)
print(my_func(1, 2)) print(my_func(1, 2, 7))
2.12.2. Возвращаемые значения
Функции в Python могут как возвращать результат работы (как в предыдущем примере), так и обходиться без такового:
def my_super_sum(*args): print(sum(args))
my_func(1, 2)
Особенность является то, что из функций можно возвращать различное значение результатов:
def my_add(x, y): if x > y: return x else: return x, y print(my_add(6, 2))
Другими
словами, в зависимости от выполнения функции воз-
вращаемый параметр может иметь различный тип.
2.12.3. Анонимные функции, инструкция lambda
Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda.
func = lambda x, y: x + y func(1, 2)
Кроме этого, их не обязательно присваивать переменной, что часто используется в генераторах и
других случаях, когда функция нужна лишь один раз и более использоваться не будет. Например, рассмотрим преобразование списка чисел. Когда необходимо
31
каждое число возвести в квадрат. Это можно сделать известным ранее способом:
data = [1, 5, 45, 34] new_data = [i*i for i in data] print(new_data)
С использованием безымянной функции соответствующий код
будет выглядеть следующим образом:
data = [1, 5, 45, 34] new_data = list(map(lambda x:x*x, data))
print(new_data)
2.12.4. Лямбда-функция и сортировка списков
Сортировка списка – базовая операция в Python. Если речь идет
о списке чисел или строк, то обычно хватает встроенных функций:
data = [3423, 35, 45, 34] data.sort() print(data)
Функция sorted может применяться не только для списков, но
и для любых итерируемых объектов
print(sorted([5, 2, 3, 1, 4], reverse = True))
В случае необходимости, можно использовать параметр key для
указания функции, которая будет использоваться для сравнения:
data = input().split() print(sorted(data)) print(sorted(data, key=str.lower))
Если же
необходимо использовать специфическую функцию
сравнения, то это можно сделать, используя лямбда-функцию:
data = input().split() print(sorted(data, key=lambda x: len(x)))
2.13. Исключения
Исключения (exceptions) – ещё один тип данных в Python. Исключения необходимы для того, чтобы сообщать программи­сту об ошибках.
32
Например, при выполнении недопустимой операции «деление на ноль», программист получает сообщение об ошибке в среде исполнения:
print(100 / 0)
---------------------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last) <ipython-input-1-170becd530e1> in <module>
----> 1 print(100 / 0) ZeroDivisionError: division by zero
Разберём это сообщение подробнее:
• интерпретатор нам сообщает о том, что он поймал исключение и напечатал информацию (Traceback (most recent call last));
• далее имя файла (File ""). Имя пустое, потому что мы находим-
ся в интерактивном режиме,
строка в файле (line 1);
• выражение, в котором произошла ошибка (100 / 0);
• название исключения (ZeroDivisionError) и краткое описание
исключения (division by zero).
Разумеется, возможны и другие исключения:
print(2 + '1')
--------------------------------------------------------------------------------------­TypeError Traceback (most recent call last) <ipython-input-2-ec91ee6d378c> in <module>
----> 1 2 + '1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Или
print(int('qwerty'))
--------------------------------------------------------------------------------------­ValueError Traceback (most recent call last) <ipython-input-4-6675d56883e8> in <module>
----> 1 print(int('qwerty'))
ValueError: invalid literal for int() with base 10: 'qwerty'
В этих двух примерах генерируются исключения TypeError и
ValueError соответственно. Подсказки дают нам полную информацию
о том, где порождено исключение, и с чем оно связано.
33
Рассмотрим иерархию встроенных в Python исключений, хотя иногда вам могут встретиться и другие, так как программисты могут создавать собственные исключения. Данный список актуален для Python 3.3, в более ранних версиях есть незначительные изменения.
Иерархия встроенных в Python исключений
Теперь, зная, когда и при каких обстоятельствах могут возник­нуть исключения, мы можем их обрабатывать. Для обработки исключений используется конструкция try – except.
Покажем на примере, как поймать ошибку деления на ноль в случае, когда делитель вводит пользователь с экрана, и корректно ее отработать:
a = int(input()) try: result = 6 / a except ZeroDivisionError: result = 0 print(result)
34
2.14. Регулярные выражения
Регулярные выражения, также называемые regex, используются практически во всех языках программирования. В Python они реализо­ваны в стандартном модуле re.
Он широко используется в естественной обработке языка, веб­приложениях, требующих проверки ввода текста (например, адреса электронной почты) и почти во всех проектах в области анализа данных, которые включают в
себя интеллектуальную обработку
текста.
Для начала работы нам нужно импортировать модуль. Модуль
«re» устанавливать не нужно, он устанавливается вместе с самим Python.
import re
Основные регулярные выражения: re.search() – ищет указанный паттерн в строке и при первом же
совпадении возвращает сам паттерн, в ином же случае возвращает None.
import re pattern = '34' testString = '12 546 43 34 de' result = re.search(pattern, testString) print(result)
re.findall() – возвращает все
строки, где было обнаружено совпадение.
import re pattern = '43' testString = '12 546 43 34 de 434' result = re.findall(pattern, testString) print(result)
re.split() – разбивает строки по заданному паттерну и возвращает
разбитые строки.
import re pattern = '#' testString = 'Hi#It is Max#How are you' result = re.split(pattern, testString) print(result)
35
re.sub() – заменяет символы по заданному паттерну на заданные
символы и возвращает исправленную строку.
import re pattern = '#' replace = '. ' testString = 'Hi#It is Max#How are you?' result = re.sub(pattern, replace, testString) print(result)
Метасимволы позволяют упростить запись в случае нескольких паттернов. Например, если необходимо найти в тексте слова car, cat и cab, то вместо трех строк поиска можно использовать одну (по­скольку в искомых словах отличаются лишь последние символы).
pattern = 'ca[rtb]'
Также допустимо указывать диапазоны значений:
pattern = 'a[a-e]' # (заменяет [abcde])
pattern = 'ca[1-5]' # (заменяет [12345])
При необходимости можно использовать исключающие условия:
pattern = '[0-9]' # ищет все числа
pattern = '[^0-9]' # ищет все кроме чисел
Существует возможность обозначить, с какой стороны искать совпадения:
pattern = '^timeweb' # ищет в начале
pattern = 'timeweb$' # ищет в конце
2.15. Map, Filter и Reduce
Map, Filter и Reduce являются парадигмами функционального программирования. Они позволяют программисту (
вам) писать более простой и короткий код без необходимости беспокоиться о таких сложностях, как циклы и ветвления.
По сути эти три функции позволяют вам применять какую-либо функцию ко многим итерациям за один полный цикл. Map и Filter встроены в Python и не требуют импорта, а Reduce может потребо­вать импортировать модуль
functools.
36
2.15.1. Map
Функция map() в Python имеет следующий синтаксис:
map(func, iterables)
где func – это функция, к которой будет применен каждый элемент из iterables (столько, сколько их есть). Функция возвращает map object, который является объектом-генератором. Чтобы получить результат в виде списка, встроенная функция list() может быть вызвана для объекта карты, то есть
list(map(func, iterables))
Наиболее
наглядно представить пример программы, которая при­меняет какую-либо функцию (в данном случае возведение в квадрат) для каждого элемента списка:
def my_func(x): return x*x my_src = [2, 3, 7, 9] res = [] for i in my_src: temp = my_func(i) res.append(temp) print(res)
С использованием map() эта программа может быть написана
следующим образом:
def my_func(x): return x*x my_src = [2, 3, 7, 9] res = list(map(my_func, my_src)) print(res)
Также в данном случае можно воспользоваться безымянной
функцией, что позволит написать так:
my_src = [2, 3, 7, 9] res = list(map(lambda x:x*x, my_src)) print(res)
2.15.2. Filter
В то время как map() пропускает каждый элемент итерируемого через функцию и возвращает результат всех элементов, прошедших через функцию, filter(), прежде всего требует, чтобы функция
37
возвращала логические значения (true или false), а затем передает каждый элемент итерируемого через функцию, «отфильтровывая» те, которые являются ложными.
В качестве примера рассмотрим программу, которая отфильтрует элементы списка, оставив те, значение которых более 10.
def my_func_10(x): return (x > 10)
my_src = [12, 3, 17, 9, 55] res = list(filter(my_func_10, my_src)) print(res)
Также для наглядности приведем способ написания этой про­граммы с использованием безымянной функции:
my_src = [12, 3, 17, 9, 55] res = list(filter(lambda x:x>10, my_src)) print(res)
2.15.3.
Reduce
Reduce() применяет функцию двух аргументов кумулятивно к элементам итерируемого.
В качестве наглядного примера рассмотрим возможную реализа­цию функции суммирования элементов списка.
from functools import reduce def custom_sum(first, second): return first + second numbers = [3, 4, 6, 9, 34, 12] result = reduce(custom_sum, numbers) print(result)
Суть происходящего:
● reduce берет первый и второй элементы в numbers и передает
их соответственно в custom_sum;
● custom_sum вычисляет их сумму и возвращает ее в reduce;
● затем reduce принимает этот результат и применяет его в
качестве первого элемента к custom_sum и принимает следующий элемент (третий) в numbers в качестве второго элемента для custom_sum;
● он делает это непрерывно (накопительно), пока numbers
не будет исчерпан.
38
3. ИСПОЛЬЗОВАНИЕ ВНЕШНИХ БИБЛИОТЕК
В зависимости от используемой среды разработки, в ее состав может входить различное количество библиотек.
3.1. Установка библиотек
Если вы знаете корректное название модуля, которое вы хотите использовать (и который отсутствует у вас в системе), то необходимо:
1. Загрузить модель из хранилища (необходим доступ в Интернет):
sudo apt-get install __[имя модуля]__
2. Установить модуль
pip install__[имя
модуля]__
В PyCharm библиотеки можно установить, используя следующее меню:
● file → settings → Project → Python Interpreter
● далее, нажав на кнопку «+», добавить нужную библиотеку
в проект
3.2. Версия библиотек
Чтобы узнать версию установленной библиотеки в системе, можно выполнить следующую команду (на примере библиотеки
NumPy)
import numpy as np print (np.__version__)
3.3. Использование функций из библиотек
Существует несколько способов импорта библиотечных функ­ций в свой код. Разберем подробнее несколько распространенных способов.
Импортирование библиотеки
Возможно импортирование всех функций, описанных в биб­лиотеке. В таком случае в коде программист может использовать библиотечные функции, указав к какой библиотеке они принад-
39
лежат. Рассмотрим пример импорта математической библиотеки
math:
import math b = 5 c = math.sqrt(b) print(c)
Импортирование всей библиотеки
Такой способ хорош тем, что нет необходимости указывать имя библиотеки, к которой принадлежит функция, поскольку все импортированные функции становятся глобальными.
from math import * b = 5 c = sqrt(b) print(c)
Недостатком такого подхода является то, что в случае под­ключения нескольких библиотек в код, возможно возникновение пересечений имен
, что повлечет проблемы компиляции кода.
Импортирование всей библиотеки с переименованием
Такой способ позволяет максимально избежать пересечений имен, поскольку вызов библиотечной функции возможен только через префикс назначенного имени библиотеки.
import math as mth b = 5 c = mth.sqrt(b) print(c)
Импортирование конкретной функции из библиотеки
Данный способ удобен в том случае, если вам нужна конкретная библиотечная функция, доступ к которой будет
организован как
к глобальной.
from math import sqrt b = 5 c = sqrt(b) print(c)
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]