Урок 4

Иморт модулей

Общие понятия

Модуль — функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом, предназначенный для использования в других программах.

По сути, это отдельный файл, с описанием каких то функций, который мы можем подключать где угодно.

Чаще всего большой программный продукт умышлено разбивают на несколько мелких модулей и соединяют их в “главном” файле, так как один огромный файл тяжелее поддерживать и труднее переваривать.

При этом никто не мешает написать универсальные модули и использовать их не только в данной программе.

Для подключения модуля необходимо выполнить команду import <имя модуля>.

Имя модуля — это имя файла без расширения .py

В модуле реализуются разные функции (в точности как и в том же файле), а из файла, в котором модуль был подключен, функции вызываются как методы модуля.

Пример:
Создадим 2 файла: test.py (основной файл) и test_module.py (файл модуля)
Создадим простую функцию в модуле, которая только выводит текст

Содержимое файла test_module.py

def print_hello():
    print ("Hello world")
    print ("This is from module")

Теперь подключим наш модуль и вызовим эту функцию, затем исполним test.py

Содержимое файла test.py

import test_module

test_module.print_hello()

python test.py
Результат:

Hello world
This is from module

Дополнительные функции

Иногда названия модулей достаточно громоздкие, в этом случае можно применять служебное слово as <имя>, указывая любое имя для сокращения. В этом случае для обращения к модулю можно использовать не полное его название, а указанное, более удобное, имя

Пример:

import test_module as tm

tm.print_hello()

Результат:

Hello world
This is from module

Так же не всегда нужно импортировать весь модуль целиком, а только его часть. В этом случае конструкция будет следующей: from <module> import <что именно надо импортировать> и точно так же можно применить as, в этом случае можно будет исполнить конкретный метод (функцию), без обращения к модулю

Пример:

from test_module import print_hello

print_hello()

Результат:

Hello world
This is from module

Ну и со словом as

Пример:

from test_module import print_hello as tm

tm()

Результат:

Hello world
This is from module

Импорт стандартных библоиотек

Кроме самописных модулей, можно импортировать модули других разработчиков. Корректнее их называть библиотеками, так как в них входит множество методов, функций и тд В комплекте python идет огромное множество библиотек

Библиотека — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО).

Полный список библиотек, входящих в python можно узнать из документации

Рассмотрим использование библиотек на примере пары основных

Модуль os

Данный модуль помогает выполнять различные действия с операционной системой: определение директории, манипуляции с файлами, выполнения команд в консоле, определения типа ОС и тд

Полный список возможностей так же можно найти в документации

Пример:
Попробуем реализовать очистку консоли. Так как в разных ос используется разная команда для очистки, необходимо определить тип ОС. Вся информация берется из документации. Исполнение команд — os.system(command). Для определения ОС используем os.name. Судя по документации, есть 3 варианта выполнения этой комманды: ‘posix’, ‘nt’, ‘java’. Рассмотрим только posix (mac, linux и тд) и nt (windows) (если posix — выполняем команду для *nix систем, иначе для винды)

#Импортируем модуль
import os
# Определяем, какую команду надо исполнять
if os.name == "posix":
    clear_com = "clear"
else:
    clear_com = "clr"
#Исполняем команду
os.system(clear_com)

Результат:
Очищенная консоль

Пример:
Попробуем получить список файлов в директории. Допустим, в директории со скриптом есть директория “pics” с изображениями. Необходимо вывести полный список всех файлов и папок в этой директории. Для этого применим os.listdir()
os.listdir(path='.') — Возвращает список (list) всех объектов в директории, указаной в path (если ничего не указано, будет использоваться текущаяю)

import os
for filename in os.listdir("pics"):
    print (filename)

python test3.py
Результат:

akemy-mory-595755-unsplash.jpg
freddie-marriage-40645-unsplash.jpg
catbread-03-600×400.jpg
angel-silva-539096-unsplash.jpg
mona-magnussen-66660-unsplash.jpg
georgy-rudakov-622723-unsplash.jpg
borna-bevanda-396491-unsplash.jpg
alvaro-reyes-490837-unsplash.jpg

Больше информации о возможностях модуля можно получить в документации

Модуль random

Модуль, как это видно из названия, нужен для вычисления псевдо случайного значения. Почему псевдо? Потому что любой генератор случайных чисел работает по определенному алгоритму, и, по сути, результат не является случайным, и, при желании, может быть просчитан.

Основные методы:

  • random() — возвращает случайный float от 0.0 до 1.0. Вызывается без параметров
  • randrange(start, stop, step) — возвращает случайный int в диапазоне от start до stop (не включительно), с шагом step. Start и Step — не обязательны
  • randint(start,stop) — возвращает случайный int от Start до Stop (включительно)
  • choice(siq) — Выбор и возврат случайного значения из последовательности siq (может быть любая последовательность: строка, список, картеж, но не множество или словарь, так как выборка происходит по индексу (от 0 до длины последовательности))
  • shuffle(list) — перемешивает элементы последовательности. Ничего не возвращает, а просто модифицирует список list
  • sample(seq,num) — возвращает случайные num элементов из seq последовательности. seq — может быть строка, список, картеж, множество и словарь (возвращает ключи, не значения)

Пример:

import random
t=[1,2,3,4,5]
random.shuffle(t)
print (t)
print (random.choice("asfdghgfsdsfsdfdsdfs zvsdfsd"))
print (random.randrange(0,3,2))

Результат:

[3, 2, 1, 5, 4]
s
3

Опять же, больше инфо в доках

Модуль math

Как понятно из названия, модуль добавляет множество математических функций. Вот пара из них:

  • exp(x) — экпанента
  • pow(x,y) — степень
  • sqrt(x) — квадратный корень
  • sin(x), cos(x), tan(x), asin(x), acos(x), atan(x) — синус, косинус, тангенс. Как обычные, так и в радианах
  • pi — возвращает число пи
  • e — возвращает число e
  • sum(list), fsum(list) — возвращает сумму всех элементов (второй — возвращает точное значение float)

Примеры приводить не буду, так как тут все достаточно просто и аналогично тому, что ранее рассматривалось

Как обычно — больше инфы в документации

Установка сторонних библиотек (pip install)

Основная мощь языка python — это его комьюнети. Именно благодаря комьюнети язык развивается, обрастает новыми библиотеками. На текущий момент, при желании, можно найти библиотеку почти для чего угодно. Если Вам приходит какая-то идея, то вероятнее всего кто-то уже реализовал библиотеку для этого.

Основной способ распространения сторонних библиотек — это pip. Он устанавливается по-умолчанию вместе с Python 3. Для того что бы убедиться в этом, в консоле достаточно выполнить pip. Если после этого на экран выведится инструкция, как им пользоватсья, то все в порядке, и можно продолжать дальше. В противном же случае, необходимо самостоятельно разобраться, в чем может быть проблема.

Для установки сторонней библиотеки, необходимо, зная имя этой библиотеки, выполнить pip install <имя библиотеки>. Так же можно выполнять обновления установленных библиотек, выполнив указанную комманду с ключем --upgrade, деинсталировать библиотек pip uninstall <имя библиотеки> и тд (подробнее — в инструкции, как пользоваться pip, что ранее была выведена в консоль)

Рассмотрим же работу со сторонними библиотеками

Прогноз погоды

Существуют разные библиотеки для получения прогноза. Попробуем использовать Yahoo погоду и библиотеку weather-api.

Перейдя на сайт, видим инструкцию для установки. Выполняем ее в консоле:

pip install weather-api
Collecting weather-api

Installing collected packages: certifi, idna, urllib3, requests, weather-api
Successfully installed certifi-2018.4.16 idna-2.6 requests-2.18.4 urllib3-1.22 weather-api-1.0.2

Библиотека установлена, теперь читаем инструкцию, как ее использовать (иногда надо переходить на сайт проекта или на GitHub — там представлено больше примеров и более актуальная документация)

Используя пример, попытаемся создать программу, которая будет запрашивать город и выводить прогноз погоды

Пример:

from weather import Weather, Unit
weather = Weather(unit=Unit.CELSIUS)

city = input ("Enter City name: ")

location = weather.lookup_by_location(city)
condition = location.forecast
print("At " + condition[0].date)
print("In " + city)
print("Weather is - " + str(condition[0].text))
print("Max temp - " + str(condition[0].high))
print("Min temp - " + str(condition[0].low))

python test4.py
Результат:

Enter City name: barnaul
At 04 May 2018
In barnaul
Weather is — Showers
Max temp — 11
Min temp — 0

Модуль numpy

Достаточно популярный и полезный модуль, расширяющий математические возможности языка. Подробно про него можно узнать на сайте модуля

Numpy позволяет работать с матрицами (многомерными массивами) — ndarray
Полезные методы:

  • array(seq) — приобразовывает последовательность в массив
  • zeros(size) — создант массив из нулей размерностью size (может быть как и плоский массив — 3, так и многомерный — (2,2)) a = np.zeros((2,2))
  • a=np.eye(4)(size) — создает единичную матрицу (двемерный массив, size — просто число)
  • arange(start,stop,step) — аналогичный методу range, только создает массив типа ndarray, при этом шаг может быть не целым числом. Фи
  • linspace(start, stop, number_of_elements) — создает равномерное распределение от start до stop. Кол-во элементов равно number_of_elements

Пример:

import numpy as np
a = np.zeros((2,2))

Результат:

array([[0., 0.],
[0., 0.]])

Пример:

import numpy as np
a=np.eye(4)

Результат:

array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])

Пример:

import numpy as np
a = np.linspace(0,10,5)

Результат:

array([ 0. , 2.5, 5. , 7.5, 10. ])

Библиотека Pillow (PIL)

Библиотека предназначен для работы с изображениями. Так же имеет богатую документацию

Библиотека содержит кучу модулей:

  • Image — основной модуль для работы с изображениями, по сути — это объект изображения
  • ImageChops — модуль содержащий набор математических операций над изображениями (объединение и извлечение среднего, смешивание с применением прозрачности, поиск различий и тд)
  • ImageFilter — накладывает пачку фильтров (работает через метод Image.filter(ImageFilter.)). Фильтры — BLUR, CONTOUR, DETAIL, EDGE_ENHANCE, EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SHARPEN, SMOOTH, SMOOTH_MORE. Так же есть фильтры-функции, к примеру GaussianBlur(radius=2)
  • ImageFile — позволяет работать с изображениям, открытыми через стандартный метод работы с файлами (лучше открыть изображения через метод модуля Image)
  • ImageEnhance — Изменение изображения, повышение яркости, контраста и тд
  • ImageDraw — модуль для рисования изображений. Можно рисовать линии, базовые фигуры, текст

Каждый из модулей содержит массу методов, но основной является Image — именно с этим типом данных и идет работа. Рассмотрим пару основных методов этого модуля:

  • open(filename) — основной метод, открытие изображения, возвращает тип данных Image, содержащих изображение
  • show() — позволяет открыть то, что находится в памяти без сохранения на диск
  • filter(filter) — Возвращает изображение с наложенным фильтром, см. выше
  • resize(size) — возвращает изображение с измененным размером первоначального изображения, size — размер картеж (ширина,высота)
  • rotate(angle[,resample=0, expand=0, center=None, translate=None]) — поворачивает изображение на angle градусов по часовой. resample — не обязательный параметр, накладывает фильтр (см. выше), expand — не обязательный параметр, в значении True увеличивает размер, что бы повернутое нормально влезло, иначе оставляет размер как прежде, center — опциональный параметр, центр вращения (значение должно быть типа картеж)
  • save(filename) — сохранение изображения
  • split() — разделяет изображения на разные части. К примеру, разделяет RGB изображение на 3, по каналам
  • getchannel() — достать канал из изображения (R — красный, A — альфа, и тд)
  • thumbnail(size) — создание привьюшки изображения
  • transpose(method) — переворот или поворот изображения, методы: FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, ROTATE_270, TRANSPOSE, TRANSVERSE

Ну и атрибуты полезные:

  • filename — Имя файла исходное
  • format — формат изображения
  • mode — Моды изображений, типа RGB и тд. Список всех возможных тут
  • size — размер изображения (возвращает картеж)
  • width — ширина
  • height — высота

Теперь что бы хоть что то из вышеперечисленного осознать, попробуем сделать ресайз изображения:
Для начала подключаем модуль Image, открываем любое изображение (в качестве примера возьму первое изображение из примера выше), выведем его, затем узнаем его размер, наложу на него фильтр GaussianBlur с большим радиусом (для этого надо импортировать соответсвующий модуль), затем уменьшим его в 2 раза
Пример:

from PIL import Image
from PIL import ImageFilter

img = Image.open("pics/akemy-mory-595755-unsplash.jpg")
img.show()
print (img.size)
img = img.filter(ImageFilter.GaussianBlur(radius=20))
img.show()
img = img.resize((int(img.width/2),int(img.height/2)))
print (img.size)
img.show()

Результат:
Сперва выведется изначальное изображение
Затем выведется размер

(3264, 4928)

Затем наложется фильтр и откроется новое изображение
Затем произойдет ресайз
Затем выведутся новые размеры

(1632, 2464)

И в конце откроется новое изображение