Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практическое программирование на Python. Учебное пособие
.pdf
Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится «*»:
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
