64 KiB
Лабораторная работа 1: Введение в Python¶
Данная лабораторная предназначена для рассмотрения основного синтаксиса языка Python в рамках анализа данных и не является всеобъемлющей.
Всегда пользуйтесь гуглом если вам что-то непонятно. Если непонятно как загуглить, значит вы не можете сформулировать вопрос, а значит не понимаете что хотите узнать. Поэтому СНАЧАЛА формулируйте емко и четко вопрос, и только потом отправляйтесь за поиском ответа.
Для более подробного рассмотрения синтаксиса обращайтесь к книге М.Лутца "Изучаем Python" в двух томах (Qui quaerit, repent), ютуб каналам и, конечно же, к официальной документации Python
В данной лабораторной будут рассмотрены:
- Типы данных
- Условные конструкции
- Циклы
- Функции
- Классы
- Импорт модулей
Задания будут после каждого раздела на закрепление ранее пройденного материала
Типы данных¶
Типы данных в Python можно разделить следующим образом:
- Числа
- Целочисленный int
- Вещественный float
- Последовательности
- Строка str
- Список list
- Кортеж tuple
- Множества set
- Словари dict
- Логические bool
Стоит выделить что все эти типы разделяются на две группы:
- Изменяемые (list, dict, set)
- Неизменяемые (int, float, str, tuple, bool)
Комментарии в Python бывают двух видов:
# Однострочный """ -Многострочный комментарий. Филин, подтверди. -Подтверждаю. """
'\n-Многострочный комментарий. Филин, подтверди.\n-Подтверждаю.\n'
Язык Python является динамически типизированным поэтому при создании переменных и при их перезаписи не требуется явное указание типа данных
# Пример динамической типизации variable = 'some string' variable = 3
# Неявная типизация integer_variable = 3 # Для удобства написания и дальнейшей работы с кодом можно использовать аннотирование integer_variable: int = 4
1 Целочисленный тип данных¶
Целочисленный тип данных позволяет работать с целыми числами, поддерживая длинную арифметику и неявное приведение к вещественному типу данных при операциях деления или извлечения корня
1 Операции над целыми числами¶
1.1 Сложение и вычитание
Используются операторы + и - соответственно
var_1 = 10 var_2 = 15 sum_var = var_1 + var_2 subtr_var = var_1 - var_2 print(sum_var) print(subtr_var)
25 -5
1.2 Умножение
Используется оператор *
# Обычное умножение print(var_1 * var_2) # Поддерживается длинная арифметика print(var_2 * 999999999999999999999999999999999999999999)
150 14999999999999999999999999999999999999999985
1.3 Возведение в степень
Используется оператор **
print(var_2 ** 3)
3375
1.4 Деление
Используются операторы:
- / деление
- // деление до целой части
- % остаток от деления
# Деление, в результате получаем вещественное число (число с плавающей точкой) print(var_1 / var_2) # Деление до целой части print(var_1 // 3) # Остаток от деления print(var_2 % 2)
0.6666666666666666 3 1
Задание:¶
Создайте переменную и присвойте ей значение 42317. Посчитайте остаток от деления на 7 и целочисленное деление на 7.
Разницу между результатами возведите в квадрат.
2 Вещественный тип данных¶
Вещественный тип данных так же позволяет использовать все вышеперечисленные операции
float_var_1 = 10.0 float_var_2 = 3.33 # равнозначно записи 0.03 float_var_3 = .03
Задание:¶
Создайте переменные со значениями 15.17 и 21.11. Выведите кубический корень их отношения.
3 Последовательности¶
3.1 Строки¶
Строковый тип данных (str) в Python может представляться как последовательность отдельных символов (строк одинарной длины). Использование двойных или одинарных кавычек равнозначно. В строках могут применяться все символы из ASCII.
# пустая строка s = '' s = 'There is some text and 100500 reasons for scroll it down'
С последовательностями можно работать поиндексно, для этого после имени последовательности ставятся квадратные скобки и указываются следующие значения:
# Выбор элемента по индексу 10 (начинается отсчет с 0) print(s[10]) print(s[0])
o T
Так как str является неизменяемым типом данных, то мы не можем поменять его элементы - будет ошибка:
s[0] = 't'
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_11148/2869417731.py in <module> ----> 1 s[0] = 't' TypeError: 'str' object does not support item assignment
Возможно использование срезов при помощи выражения left_bound:right_bound. Левая граница включается, правая не включается:
print(s[:8]) print(s[8:]) print(s[15:20])
There is some text and 100500 reasons for scroll it down ext a
Можно использовать итерацию с шагом при помощи выражения ::step :
print(s[::1]) print(s[::2])
There is some text and 100500 reasons for scroll it down Teei oetx n 050raosfrsrl tdw
Строки можно складывать (конкатенация) и умножать (репликация)
# Как будет видно по выводу пробел между двумя частями в "склейке" отсутствует print('First part of string' + 'Second part') print('he' * 8)
First part of stringSecond part hehehehehehehehe
Так как питон имеет строгую типизацию, то результат следующей операции будет ошибкой:
print('Variable is:' + 5)
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_11148/1637851998.py in <module> ----> 1 print('Variable is:' + 5) TypeError: can only concatenate str (not "int") to str
Для исправления этого нужно применить ЯВНОЕ приведение типа, которое получается следующим образом:
print('Variable is: ' + str(5))
Variable is: 5
Справедливо и обратное преобразование:
print(int('5') + 5)
10
Для любой последовательности применима встроенная функция len() которая вернет длину переданной последовательности:
print(len(s))
56
Для строк применимы встроенные методы, которые можно вызвать у объекта строки:
- Приведение к верхнему/нижнему регистру
- Поиск подстроки
- Замена символов
- и т.д.
Весь список можно посмотреть здесь: https://pythonworld.ru/tipy-dannyx-v-python/stroki-funkcii-i-metody-strok.html
Задание¶
Создайте переменную со следующим значением:
Habitasse est. Sodales ultricies. Imperdiet sit nunc odio. Non ultricies. Dapibus risus mattis dui tempus arcu elit. Imperdiet in e.
Приведите ее к нижнему регистру и удалите все знаки препинания. Найдите позицию первого знака в слове ultricies.
3.2 Списки¶
Списки list создаются при помощи квадратных скобок [] и перечисления элементов внутри них.
l = [1, 2, 3, 4] print(l) l = ['sad', 'story'] print(l) # можно засунуть разные типы данных l = ['abc', 1, 2.0, [1]] print(l)
[1, 2, 3, 4] ['sad', 'story'] ['abc', 1, 2.0, [1]]
Со списками так же можно работать при помощи индексов и срезов:
l = ['a', 'b', 'c', 'd', 'e'] print(l[3]) print(l[1:4])
d ['b', 'c', 'd']
Так как списки являются изменяемым типом данных, то его элементы можно менять, добавлять и удалять
print(l) l[3] = 'new' print(l)
['a', 'b', 'c', 'd', 'e'] ['a', 'b', 'c', 'new', 'e']
Возможно добавление вложенных списков любой глубины:
l = [1, [1],[[1],[1]]] print(l)
[1, [1], [[1], [1]]]
Списки можно объединять через оператор сложения
l_1 = [1, 2, 3] l_2 = [4, 5, 6] print(l_1 + l_2)
[1, 2, 3, 4, 5, 6]
Вызывая у списка методы .append() или .extend() можно добавлять элемент или дополнять исходный список (в результате он изменяется!):
print(l_1) l_1.append(l_2) print(l_1)
[1, 2, 3] [1, 2, 3, [4, 5, 6]]
l_1 = [1, 2, 3] print(l_1) l_1.extend(l_2) print(l_1)
[1, 2, 3] [1, 2, 3, 4, 5, 6]
Другие встроенные методы можно посмотреть здесь https://pythonworld.ru/tipy-dannyx-v-python/spiski-list-funkcii-i-metody-spiskov.html
Задание¶
Создайте несколько два списка с элементами 1,2,4,8,16 и 1,2,3,5,7. Объедините эти списки. Отсортируйте по возрастанию. Выведите первые четыре элемента.
3.3 Кортежи¶
Кортежи tuple похожи на списки, но являются неизменяемыми, т.е. в них нельзя изменить значение элемента, добавить или удалить элементы. Создаются при помощи () в которых прописываются значения.
tup = (1,2,3) print(tup)
(1, 2, 3)
Кортеж можно распаковать в несколько переменных:
var_1, var_2, var_3 = tup print(var_1, var_2, var_3)
1 2 3
В кортеже можно применять индексирование и срезы
print(tup[1]) print(tup[:2])
2 (1, 2)
4 Множества¶
Множество set это набор уникальных элементов. Создается при помощи {} и перечисления в нем элементов.
s = {'a', 'b', 'c'} print(s)
{'b', 'c', 'a'}
Применяя set к последовательностям можно получить набор уникальных неупорядоченных значений:
l = [0,1,0,0,2,2,3] s = 'Hello, dude! This is unique string!' print(set(l)) print(set(s))
{0, 1, 2, 3} {' ', 'd', 'o', 'T', 'h', 'n', 'r', '!', 'e', 'H', 'q', 's', 'i', 'g', 't', 'l', ',', 'u'}
У множества нельзя вызывать элементы по индексу и нельзя работать со срезами. Для этого его нужно приводить к типу список list!
# выведет ошибку print(set(l)[0])
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_11148/2180189257.py in <module> 1 # выведет ошибку ----> 2 print(set(l)[0]) TypeError: 'set' object is not subscriptable
print(list(set(l))[0])
0
Задание¶
Даны два списка [1,5,1,1,2,3,7,12,3,6,14,11,11] и [11,6,4,3,3,5,7,18]. Найдите симметрическую разницу этих двух списков. Отсортируйте по возрастанию и выведете первые два элемента.
5 Словари¶
Словарь dict представляет собой набор ключей keys и соответствующих им значений values. Ключи являются уникальными и должны задаваться неизменяемым типом данных, значения могут быть любыми. Создается при помощи {} и требуемых пар key:value. Применим для быстрого доступа к значениям ключей. Для этого вызывается объект словаря с [] где указывается наименование ключа.
d = {'key_1': 'value_1', 'key_2': 'value_2'} print(d['key_1']) print(d['key_2'])
value_1 value_2
Задание¶
Даны два списка [1,2,3,4,5,6] и ['a','b','c','d','e','f']. Создайте словарь, где ключи будут представлены первым списком, а значения вторым, в том же порядке в каком они представлены.
6 Логический тип¶
Логический (булев) тип задается двумя ключевыми словами True и False. Данный тип нужен для работы с условными конструкциями (будут рассмотрены далее). True и False могут быть заменены int значениями 1 и 0 соответственно (при явном приведении к целочисленному типу). При приведении любого числа кроме 0 к bool будет получено True, для 0 соответственно False.
b = True print(b) print(int(b))
True 1
b = False print(b) print(int(b))
False 0
b = 3123123 print(b) print(bool(b))
3123123 True
b = 0 print(b) print(bool(b))
0 False
Условные конструкции¶
В Python представлены следующие условные операторы:
- операции сравнения
- > больше
- < меньше
- == равно
- >= больше или равно
- <= меньше или равно
- != не равно
- логические операторы
- and логическое И
- or логическое ИЛИ
- not логическое отрицание
- оператор вхождение in
- оператор сравнения объектов is
Условная конструкция в Python задается ключевыми словами if, elif и else. Имеет следующий вид:
var = 10 if var > 0: print('var is greater than zero') elif var == 0: print('var is equal zero') else: print('var is less than zero')
var is greater than zero
elif и else не являются обязательными
оператор if поддерживает вложенность:
if var > 0: if var > 5: if var > 7: print('var is greater than 7') print('var is greater than 5') print('var is greater than 0')
var is greater than 7 var is greater than 5 var is greater than 0
Логические операторы являются представлением булевой алгебры
print(True and True) print(True and False) print(False and False)
True False False
print(True or True) print(True or False) print(False or False)
True True False
print(not(False)) print(not(True))
True False
При помощи оператора in можно определять наличие элемента в какой-либо последовательности
print('s' in 'super') print('s' in 'puper')
True False
При помощи оператора is определяется являются ли объекты слева и справа одним и тем же объектом
a = ['a','b'] b = a print(a is b) b = a.copy() print(a is b) # но они будут равны по значениям print(a == b)
True False True
Задание¶
Создайте список цифр любой длины. Определите длину списка. Для случаев больше, равно и меньше 5 выведите соответствующие сообщения. Если список длиннее 5 и в нем есть цифра 3, выведите сообщение "bingo!"
Циклы¶
Циклы в Python представлены операторами while и for.
Оператор while принимает условное выражение, если оно true - оператор будет выполнять операции вложенные в его тело.
stepper = 0 while(stepper < 5): print(stepper) stepper += 1 # увеличиваем значение stepper на 1 каждый шаг
0 1 2 3 4
оператор for используется для итерирования по последовательностям, пока не достигнет их конца.
Имеет конструкцию: for имя_переменной in имя_последовательности
в переменную будет записываться каждый шаг следующий элемент из последовательности начиная с нулевого
seq = [1, 2, 3, 4, 5] for elem in seq: print(elem)
1 2 3 4 5
s = 'some string' for sym in s: print(sym)
s o m e s t r i n g
Задание¶
Дана строка:
Habitasse est. Sodales ultricies. Imperdiet sit nunc odio. Non ultricies. Dapibus risus mattis dui tempus arcu elit. Imperdiet in e.
Посчитайте количество упоминаний каждого символа (любой регистр) в этой строке и выведите результат.
Подсказка: Используйте для решения set и dict
Функции¶
Функции представляют собой обособленную совокупность кода, выполняющего какую-то специфическую задачу, с возможностью бесконечного вызова этого кода без надобности его перезаписи. В Python представляется в виде конструкции:
def name_function(arg1, arg2): """ Тут какой-то код """ return 0 # функция при любом корректном вызове вернет 0
Имя функции лучше указывать максимально емким, чтобы при его прочтении было понятно что делает эта функция в контексте
Функция может не принимать никаких значений, т.е. arg1, arg2, arg... могут отсутствовать
Функция может ничего не возвращать, т.е. отсутствует оператор return
Напишем функцию которая считает время, через которое упадет тело на поверхность земли с нулевой начальной скоростью с заданной высоты:
def fall_time(height): time = (2 * height / 9.81) ** 0.5 return time
Вызовем нашу функцию:
print(fall_time(10))
1.4278431229270645
Можно в аргументах задать ускорение свободного падения с значением по умолчанию, если его не задает пользователь:
def fall_time_2(height, g=9.81): time = (2 * height / g) ** 0.5 return time
print(fall_time_2(10)) print(fall_time_2(10, 4))
1.4278431229270645 2.23606797749979
Можно явно указывать каким аргументам мы присваиваем передаваемые значения (тогда их последовательность можно менять)
print(fall_time_2(g=4, height=10))
2.23606797749979
Задание¶
Реализуйте функцию, которая считает квадрат разницы между двумя величинами и возвращает полученное значение
Дан список чисел:
[12,32,1,67,2,15,12,68,90]
Реализуйте функцию, которая найдет максимальное значение в этом списке и вернет его.
Классы¶
Класс представляет собой некоторую абстрактную сущность, которая имеет свое поведение (методы) и атрибуты.
Для создания требуется следующая конструкция:
class class_name: def __init__(self, atr_1, atr_2): self.atr_1 = atr_1 self.atr_2 = atr_2
В классе требуется описать метод init() который ОБЯЗАТЕЛЬНО принимает self. Атрибуты в нем необязательны (но зачем вам тогда такой класс?).
Для примера создадим класс автомобиль, который принимает в качестве атрибутов количество колес и количество дверей, и у которого по этим атрибутам упрощенно будет определяться что это за тип машины, а так же метод drive сообщающий нам что данный автомобиль едет по дороге:
class car: def __init__(self, wheels_count, doors_count): self.wheels_count = wheels_count self.doors_count = doors_count self.car_type = self.__car_type() def __car_type(self): if self.wheels_count < 2: return 'wtf?' elif self.wheels_count == 3: return 'tricycle' elif self.wheels_count == 4: if self.doors_count == 4: return 'sedan' elif self.doors_count == 3: return 'hatchback' elif self.doors_count == 2: return 'coupe' elif self.wheels_count > 4 and self.wheels_count % 2: return 'truck' else: return 'wtf?' def drive(self): print(f'{self.car_type} drives on the road')
# создадим объект класса car с именем coupe и проверим что находится в поле car_type coupe = car(wheels_count=4, doors_count=2) print(coupe.car_type) # проделаем то же самое для sedan sedan = car(wheels_count=4, doors_count=4) print(sedan.car_type)
coupe sedan
# вызовем метод drive у обоих классов coupe.drive() sedan.drive()
coupe drives on the road sedan drives on the road
Задание¶
Создайте класс Plane который будет иметь атрибуты length, wingspan, engines_count. Эти атрибуты должны быть проинициализированы в конструкторе. Так же создайте метод класса, который будет выводить характеристики вашего самолета (нафантазируйте в каком виде).
Создайте объект этого класса с разными значениями атрибутов и вызовите у объекта метод показа характеристик.
Чтение и запись в файл¶
Для чтения или записи в файл используется следующая конструкция:
f = open('путь_к_файлу', 'флаг_открытия')
через методы f появится возможность считывать или записывать в открытый файл то, что нам требуется
Откроем файл с флагом на запись для того, чтобы он создался, если его нет
f = open('test.txt', 'w')
запишем в него пару строк:
f.write('First line') f.write('\n') f.write('Second line')
11
закроем поток работы с файлом, чтобы увидеть в нем изменения
f.close()
Для чтения из файла воспользуемся флагом r
f = open('test.txt', 'r')
Считаем из файла все что в нем есть в список
l_file = f.readlines()
print(l_file)
['First line\n', 'Second line']
f.close()
Чтобы не закрывать вручную поток чтения/записи лучше использовать следующую конструкцию, которая делает это за вас:
with open('test.txt', 'r') as f: """ делаем что угодно с данными из файла """ pass
Задание¶
Создайте поток записи в файл (чтобы файл создался при исполнении кода), назовите как хотите. Запишите в него следующую строку:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Закройте поток записи.
Откройте поток чтения и считайте из этого файла содержимое. Приведите текст к нижнему регистру, удалите запятые и сохраните его в переменной. Закройте поток чтения.
Откройте поток записи и ДОПИШИТЕ с новой строки результат прошлого шага в файл. Закройте поток записи. Проверьте корректность данных в файле.
Должно быть быть по итогу в файле:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Импорт модулей¶
Для многих узких задач существуют готовые оптимальные с точки зрения скорости и времени решения, собранные в отдельные логические объединения (например математические преобразования, работа с матрицами, работа с изображениями и т.д.), называемые модулями.
Их подключение выглядит следующим образом:
import название_модуля
Если он поставляется в пакете, то требуется оказать что он извлекается из определенного пакета
from название_пакета import название_модуля
Если название слишком длинное, то можно добавить сокращенное название модуля
import названия_модуля as нзвн_мдл
# модуль для работы с матрицами, векторами и математическими операциями # np общепринятое сокращение для удобства использования в коде модуля numpy import numpy as np # из пакета matplotlib нам потребуется модуль pyplot, к которому мы будем # обращаться по сокращенному общепринятому имени plt from matplotlib import pyplot as plt
Теперь возможно обращение к методам данных модулей, например найдем косинус угла 90,
для этого вызовем метод cos() из модуля np, в который передадим значение угла домноженного на константу Пи, которую так же можно взять из данного модуля:
np.cos(90 * np.pi)
1.0
!pip install opencv-python
Requirement already satisfied: opencv-python in c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages (4.6.0.66) Requirement already satisfied: numpy>=1.19.3 in c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages (from opencv-python) (1.21.1)
WARNING: Ignoring invalid distribution -illow (c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages) WARNING: Ignoring invalid distribution -illow (c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages) WARNING: Ignoring invalid distribution -illow (c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages) WARNING: Ignoring invalid distribution -illow (c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages) WARNING: Ignoring invalid distribution -illow (c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages) WARNING: Ignoring invalid distribution -illow (c:\users\firsov\appdata\local\programs\python\python39\lib\site-packages) WARNING: You are using pip version 21.1.3; however, version 22.2.2 is available. You should consider upgrading via the 'c:\users\firsov\appdata\local\programs\python\python39\python.exe -m pip install --upgrade pip' command.