====== Объявление функций ======
Как и в большинстве языков структурного программирования, блоки операторов можно оформлять в виде функций для дальнейшего использования.
Синтаксис:
def 〖имя функции〗(〖аргументы〗):
␣␣␣␣〖операторы〗
␣␣␣␣return 〖возвращаемое значение〗
Функция может возвращать одно или несколько значений (в виде кортежа) или ''None''.
Объявление функции следует рассматривать, как присвоение значения соответствующей переменной.
===== Функции и модификация аргументов =====
Базовые типы данных при вызове функций копируются, а составные нет.
def foo(x):
x = x + 1
return x
w = foo(5) # w == 6
w = 1
r = foo(w) # w == 1, r == 2
def foo(x):
x[0] = "42"
w = [1, 2, 3]
foo(w) # w == ['42', 2, 3]
Присвоение значений аргументам функции в ее теле равносильно созданию новых переменных.
===== Функции и область видимости =====
Функция видит переменные объявленные вне ее тела, но при попытке присвоения создает новые, локальные:
y = 1
def foo(x):
y = x + y
return x,y
a,b = foo(1) # y == 1
def foo(x):
global y # Явно используем y из глобальной области
x = x + y
y = y + 1
return x,y
a,b = foo(1) # a == 2, b == 2, y == 2
===== Аргументы по умолчанию (default arguments) =====
При вызове функций можно пропускать аргументы, если для них задано значение по умолчанию:
def foo(x = 42):
return x*2
w = foo(1) # w == 2
w = foo() # w == 84
Обязательные аргументы всегда должны идти перед аргументами со значениями по умолчанию при объявлении функции:
def foo(x, y, z = 42): #Верно
return x*y*2
def foo(x = 42, y, z): #Ошибка
return x*y*2
==== Порядок аргументов ====
Обязательные аргументы должны передаваться по порядку.
Аргументы со значениями по умолчанию можно передавать в произвольном порядке:
def foo(a, x = 1, y = 2, z = 3):
return (x*y*z)/a
w = foo(1, z = 7, y = 7) # Верно w == 49
==== Функция как аргумент ====
def foo(x):
return x**2
def bar(x):
return x**3 / 3
def calc(f, x, a):
return f(x) + a
w = calc(foo,1,2) # w == 3
w = calc(bar,3,2) # w == 11.0
===== Что еще нужно знать о функциях =====
* Функция — объект специального составного типа ''function''
* Объявление одной и той-же функции несколько раз не выдаст ошибки
* Функции можно складывать в списки, словари, проверять на тождество
* Функции можно объявлять внутри функций, кроме слова ''global'' есть слово ''nonlocal'', которое делает тоже самое, но для локальных переменных
* Функции с помощью специальных приемов могут обрабатывать произвольное число аргументов ([[https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3|подробнее]])
* Функции можно вызывать рекурсивно
* Есть особые функции: лямбда (безымянные) и генераторы (запоминающие свое состояние)
====== Исключения (exception) ======
===== Возникновение исключений =====
Когда происходит ошибка — возбуждается соответствующее исключение. Обработка исключения — основой способ обработки ошибок в Python.
4/0
...
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: division by zero
Когда происходит исключение Python начинает искать обработчик исключения для данного блока, при необходимости выходя из функций. Если обработчик не найден, то интерпретатор завершается (или выдает ошибку в интерактивном режиме).
===== Обработка исключений =====
try:
#блок кода в котором
#ожидается возникновение исключения
except ZeroDivisionError as e:
#блок кода который будет выполнен
#если возникнет исключение типа ZeroDivisionError
else:
#блок кода который будет выполнен
#если исключение в блоке try не возникнет
finally:
#блок кода, который будет выполнен в любом случае
Можно перехватывать все типы исключения написав ''except:'', но это маскирует ошибки.
===== Популярные типы исключений =====
^ Исключение ^ Описание ^
^ IndexError | Индекс за пределами массива |
^ KeyError | Ключ отсутствует в словаре |
^ NameError | Обращение к необъявленной переменной (методу, классу) |
^ UnboundLocalError | Обращение к недоступной переменной |
^ OSError | Ошибки системы (права на файл, нет места на диске, ...) |
^ TypeError | Операция не поддерживается данным типом данных (вычитание строк, ...) |
^ ValueError | Недопустимое значение переменной (''float('hello')'', ...) |
^ NotImplementedError | Метод не реализован |
Исключение также можно выбросить прямо в коде. Для этого используется ключевое слово ''raise'', например:
raise Exception("Произошла ошибка")
===== Примеры использования =====
value_str = "123.15"
value_float = 0.0
try:
value_float = float(value_str)
except ValueError:
print("Это не число!")
finally:
print(value_float)
print(value_float*10)
===== Примеры использования в функции =====
def fix(x, fix_type = None):
if fix_type == "round":
return round(x)
elif fix_type == "ceil":
return math.ceil(x)
elif fix_type == "trunc":
return math.trunc(x)
else:
raise ValueError("Недопустимое значение переменной fix_type")
ft = input("Введите тип округления:")
value = 73/13
try:
value = fix(value, ft)
except ValueError:
print("Неправильный тип округления")
value = fix(value, "round")
===== Что еще нужно знать об исключениях =====
* "Я не знаю, что дальше делать, я вызываю ''raise'' "
* Оператор ''try'' почти ничего не стоит, но обработка возникшего исключения дело более ресурсоемкое (хотя и не очень), поэтому не следует использовать исключения вместо ''if''
* Объект исключения можно преобразовать в ''str'', обычно это используется для вывод сообщений об ошибках
* Исключение можно возбудить повторно, вызвав ''raise'' без аргументов в обработчике
* Исключения можно содержательно анализировать с помощью методов модуля ''traceback''
====== Модули ======
import modulename
Поиск при импорте:
* Файлы в папке программы
* Файлы в переменной ''$PYTHONPATH''
* Сторонние пакеты
* Стандартная библиотека
===== Собственные модули =====
Файл ''mylib.py'':
def foo(x):
return x*x
class MyClass:
def __init__(self):
self.v = 0
Файл ''program.py'':
import mylib
print(mylib.foo(4))
form mylib import MyClass,foo
ob = MyClass()
print(foo(4))
===== Разница между импортом и запуском =====
Модуль может определить загружен ли он через ''import'' или запущен как программа:
if __name__ == "__main__":
main()
Функция ''main()'' будет вызвана только если скрипт запущен как программа и не будет запускаться если он импортирован в другой скрипт.
===== Важные модули стандартной библиотеки =====
^ Модули ^ Возможности ^
^ ''sys'' | Служебные функции интерпретатора, аргументы командной строки, выход |
^ ''os, shutils'' | Операции с файлами и папками, переменные окружения, запуск сторонних программ |
^ ''glob, Path'' | Операции с путями к файлам |
^ ''math, statistics'' | Базовые математические функции |
^ ''random'' | Генерация случайных чисел и последовательностей |
^ ''struct'' | Работа с бинарными структурами |
^ ''datetime'' | Работа с датой и временем |
^ ''copy'' | Копирование составных объектов |
^ ''pprint'' | Улучшенный ''print'' |
^ ''pickle'' | Сохранение объектов Python в файлы |
===== Важные сторонние модули доступные в pip =====
^ Модуль ^ Возможности ^
^ ''numpy'' | Эффективные методы для работы с числовыми данными |
^ ''scipy'' | Коллекция математических методов |
^ ''matplotlib'' | Рисование графиков |
^ ''sympy'' | Символьные вычисления |
^ ''pandas'' | Таблицы данных |
^ ''requests'' | Доступ к файлам через HTTP |