You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

64 KiB

Лабораторная работа 1: Введение в Python

Данная лабораторная предназначена для рассмотрения основного синтаксиса языка Python в рамках анализа данных и не является всеобъемлющей.

Всегда пользуйтесь гуглом если вам что-то непонятно. Если непонятно как загуглить, значит вы не можете сформулировать вопрос, а значит не понимаете что хотите узнать. Поэтому СНАЧАЛА формулируйте емко и четко вопрос, и только потом отправляйтесь за поиском ответа.

Для более подробного рассмотрения синтаксиса обращайтесь к книге М.Лутца "Изучаем Python" в двух томах (Qui quaerit, repent), ютуб каналам и, конечно же, к официальной документации Python

В данной лабораторной будут рассмотрены:

  • Типы данных
  • Условные конструкции
  • Циклы
  • Функции
  • Классы
  • Импорт модулей

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

- Для выполнения ячейки можно нажать нажать комбинацию клавиш shift+enter

ВНИМАНИЕ!

Результат выполнения ячеек будет сохраняться все время пока активно ядро jupyter! Для избежания багов и прочих неприятных коллизий перезапускайте ядро!

- Для удобства вывода лучше использовать функцию print()

Типы данных

Типы данных в Python можно разделить следующим образом:

  • Числа
  • Целочисленный int
  • Вещественный float
  • Последовательности
  • Строка str
  • Список list
  • Кортеж tuple
  • Множества set
  • Словари dict
  • Логические bool

Стоит выделить что все эти типы разделяются на две группы:

  • Изменяемые (list, dict, set)
  • Неизменяемые (int, float, str, tuple, bool)

Комментарии в Python бывают двух видов:

In [9]:
# Однострочный

"""
-Многострочный комментарий. Филин, подтверди.
-Подтверждаю.
"""
Out[9]:
'\n-Многострочный комментарий. Филин, подтверди.\n-Подтверждаю.\n'

Язык Python является динамически типизированным поэтому при создании переменных и при их перезаписи не требуется явное указание типа данных

In [1]:
# Пример динамической типизации
variable = 'some string'
variable = 3
In [2]:
# Неявная типизация
integer_variable = 3

# Для удобства написания и дальнейшей работы с кодом можно использовать аннотирование
integer_variable: int = 4

1 Целочисленный тип данных

Целочисленный тип данных позволяет работать с целыми числами, поддерживая длинную арифметику и неявное приведение к вещественному типу данных при операциях деления или извлечения корня

1 Операции над целыми числами

1.1 Сложение и вычитание

Используются операторы + и - соответственно

In [3]:
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 Умножение

Используется оператор *

In [5]:
# Обычное умножение
print(var_1 * var_2)

# Поддерживается длинная арифметика
print(var_2 * 999999999999999999999999999999999999999999)
150
14999999999999999999999999999999999999999985

1.3 Возведение в степень

Используется оператор **

In [6]:
print(var_2 ** 3)
3375

1.4 Деление

Используются операторы:

  • / деление
  • // деление до целой части
  • % остаток от деления
In [7]:
# Деление, в результате получаем вещественное число (число с плавающей точкой)
print(var_1 / var_2)

# Деление до целой части
print(var_1 // 3)

# Остаток от деления
print(var_2 % 2)
0.6666666666666666
3
1

Задание:

Создайте переменную и присвойте ей значение 42317. Посчитайте остаток от деления на 7 и целочисленное деление на 7.

Разницу между результатами возведите в квадрат.

In [ ]:
 

2 Вещественный тип данных

Вещественный тип данных так же позволяет использовать все вышеперечисленные операции

In [23]:
float_var_1 = 10.0
float_var_2 = 3.33

# равнозначно записи 0.03
float_var_3 = .03 

Задание:

Создайте переменные со значениями 15.17 и 21.11. Выведите кубический корень их отношения.

In [ ]:
 

3 Последовательности

3.1 Строки

Строковый тип данных (str) в Python может представляться как последовательность отдельных символов (строк одинарной длины). Использование двойных или одинарных кавычек равнозначно. В строках могут применяться все символы из ASCII.

In [9]:
# пустая строка
s = '' 

s = 'There is some text and 100500 reasons for scroll it down'

С последовательностями можно работать поиндексно, для этого после имени последовательности ставятся квадратные скобки и указываются следующие значения:

In [10]:
# Выбор элемента по индексу 10 (начинается отсчет с 0)
print(s[10])

print(s[0])
o
T

Так как str является неизменяемым типом данных, то мы не можем поменять его элементы - будет ошибка:

In [11]:
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. Левая граница включается, правая не включается:

In [12]:
print(s[:8])

print(s[8:])

print(s[15:20])
There is
 some text and 100500 reasons for scroll it down
ext a

Можно использовать итерацию с шагом при помощи выражения ::step :

In [13]:
print(s[::1])
print(s[::2])
There is some text and 100500 reasons for scroll it down
Teei oetx n 050raosfrsrl tdw

Строки можно складывать (конкатенация) и умножать (репликация)

In [14]:
# Как будет видно по выводу пробел между двумя частями в "склейке" отсутствует
print('First part of string' + 'Second part') 

print('he' * 8)
First part of stringSecond part
hehehehehehehehe

Так как питон имеет строгую типизацию, то результат следующей операции будет ошибкой:

In [15]:
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

Для исправления этого нужно применить ЯВНОЕ приведение типа, которое получается следующим образом:

In [17]:
print('Variable is: ' + str(5))
Variable is: 5

Справедливо и обратное преобразование:

In [18]:
print(int('5') + 5)
10

Для любой последовательности применима встроенная функция len() которая вернет длину переданной последовательности:

In [19]:
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.

In [ ]:
 

3.2 Списки

Списки list создаются при помощи квадратных скобок [] и перечисления элементов внутри них.

In [29]:
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]]

Со списками так же можно работать при помощи индексов и срезов:

In [30]:
l = ['a', 'b', 'c', 'd', 'e']

print(l[3])

print(l[1:4])
d
['b', 'c', 'd']

Так как списки являются изменяемым типом данных, то его элементы можно менять, добавлять и удалять

In [31]:
print(l)
l[3] = 'new'
print(l)
['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'new', 'e']

Возможно добавление вложенных списков любой глубины:

In [32]:
l = [1, [1],[[1],[1]]]
print(l)
[1, [1], [[1], [1]]]

Списки можно объединять через оператор сложения

In [33]:
l_1 = [1, 2, 3]
l_2 = [4, 5, 6]

print(l_1 + l_2)
[1, 2, 3, 4, 5, 6]

Вызывая у списка методы .append() или .extend() можно добавлять элемент или дополнять исходный список (в результате он изменяется!):

In [34]:
print(l_1)
l_1.append(l_2)
print(l_1)
[1, 2, 3]
[1, 2, 3, [4, 5, 6]]
In [35]:
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. Объедините эти списки. Отсортируйте по возрастанию. Выведите первые четыре элемента.

In [ ]:
 

3.3 Кортежи

Кортежи tuple похожи на списки, но являются неизменяемыми, т.е. в них нельзя изменить значение элемента, добавить или удалить элементы. Создаются при помощи () в которых прописываются значения.

In [47]:
tup = (1,2,3)
print(tup)
(1, 2, 3)

Кортеж можно распаковать в несколько переменных:

In [48]:
var_1, var_2, var_3 = tup

print(var_1, var_2, var_3)
1 2 3

В кортеже можно применять индексирование и срезы

In [49]:
print(tup[1])
print(tup[:2])
2
(1, 2)

4 Множества

Множество set это набор уникальных элементов. Создается при помощи {} и перечисления в нем элементов.

In [76]:
s = {'a', 'b', 'c'}
print(s)
{'b', 'c', 'a'}

Применяя set к последовательностям можно получить набор уникальных неупорядоченных значений:

In [50]:
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!

In [53]:
# выведет ошибку
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
In [54]:
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]. Найдите симметрическую разницу этих двух списков. Отсортируйте по возрастанию и выведете первые два элемента.

In [ ]:
 

5 Словари

Словарь dict представляет собой набор ключей keys и соответствующих им значений values. Ключи являются уникальными и должны задаваться неизменяемым типом данных, значения могут быть любыми. Создается при помощи {} и требуемых пар key:value. Применим для быстрого доступа к значениям ключей. Для этого вызывается объект словаря с [] где указывается наименование ключа.

In [58]:
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']. Создайте словарь, где ключи будут представлены первым списком, а значения вторым, в том же порядке в каком они представлены.

In [ ]:
 

6 Логический тип

Логический (булев) тип задается двумя ключевыми словами True и False. Данный тип нужен для работы с условными конструкциями (будут рассмотрены далее). True и False могут быть заменены int значениями 1 и 0 соответственно (при явном приведении к целочисленному типу). При приведении любого числа кроме 0 к bool будет получено True, для 0 соответственно False.

In [62]:
b = True
print(b)
print(int(b))
True
1
In [67]:
b = False
print(b)
print(int(b))
False
0
In [68]:
b = 3123123
print(b)
print(bool(b))
3123123
True
In [69]:
b = 0
print(b)
print(bool(b))
0
False

Условные конструкции

В Python представлены следующие условные операторы:

  • операции сравнения
  • > больше
  • < меньше
  • == равно
  • >= больше или равно
  • <= меньше или равно
  • != не равно
  • логические операторы
  • and логическое И
  • or логическое ИЛИ
  • not логическое отрицание
  • оператор вхождение in
  • оператор сравнения объектов is

Условная конструкция в Python задается ключевыми словами if, elif и else. Имеет следующий вид:

In [74]:
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 поддерживает вложенность:

In [4]:
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

Логические операторы являются представлением булевой алгебры

In [71]:
print(True and True)
print(True and False)
print(False and False)
True
False
False
In [72]:
print(True or True)
print(True or False)
print(False or False)
True
True
False
In [74]:
print(not(False))
print(not(True))
True
False

При помощи оператора in можно определять наличие элемента в какой-либо последовательности

In [75]:
print('s' in 'super')
print('s' in 'puper')
True
False

При помощи оператора is определяется являются ли объекты слева и справа одним и тем же объектом

In [87]:
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!"

In [ ]:
 

Циклы

Циклы в Python представлены операторами while и for.

Оператор while принимает условное выражение, если оно true - оператор будет выполнять операции вложенные в его тело.

In [88]:
stepper = 0

while(stepper < 5):
    print(stepper)
    stepper += 1 # увеличиваем значение stepper на 1 каждый шаг
0
1
2
3
4

оператор for используется для итерирования по последовательностям, пока не достигнет их конца.

Имеет конструкцию: for имя_переменной in имя_последовательности

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

In [91]:
seq = [1, 2, 3, 4, 5]

for elem in seq:
    print(elem)
1
2
3
4
5
In [92]:
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

In [ ]:
 

Функции

Функции представляют собой обособленную совокупность кода, выполняющего какую-то специфическую задачу, с возможностью бесконечного вызова этого кода без надобности его перезаписи. В Python представляется в виде конструкции:

In [8]:
def name_function(arg1, arg2):
    """
    Тут какой-то код
    """
    return 0 # функция при любом корректном вызове вернет 0
  1. Имя функции лучше указывать максимально емким, чтобы при его прочтении было понятно что делает эта функция в контексте

  2. Функция может не принимать никаких значений, т.е. arg1, arg2, arg... могут отсутствовать

  3. Функция может ничего не возвращать, т.е. отсутствует оператор return

Напишем функцию которая считает время, через которое упадет тело на поверхность земли с нулевой начальной скоростью с заданной высоты:

In [12]:
def fall_time(height):
    time = (2 * height / 9.81) ** 0.5
    return time

Вызовем нашу функцию:

In [15]:
print(fall_time(10))
1.4278431229270645

Можно в аргументах задать ускорение свободного падения с значением по умолчанию, если его не задает пользователь:

In [16]:
def fall_time_2(height, g=9.81):
    time = (2 * height / g) ** 0.5
    return time
In [17]:
print(fall_time_2(10))
print(fall_time_2(10, 4))
1.4278431229270645
2.23606797749979

Можно явно указывать каким аргументам мы присваиваем передаваемые значения (тогда их последовательность можно менять)

In [18]:
print(fall_time_2(g=4, height=10))
2.23606797749979

Задание

  1. Реализуйте функцию, которая считает квадрат разницы между двумя величинами и возвращает полученное значение

  2. Дан список чисел:

    [12,32,1,67,2,15,12,68,90]

    Реализуйте функцию, которая найдет максимальное значение в этом списке и вернет его.

In [ ]:
 

Классы

Класс представляет собой некоторую абстрактную сущность, которая имеет свое поведение (методы) и атрибуты.

Для создания требуется следующая конструкция:

In [19]:
class class_name:
    def __init__(self, atr_1, atr_2):
        self.atr_1 = atr_1
        self.atr_2 = atr_2

В классе требуется описать метод init() который ОБЯЗАТЕЛЬНО принимает self. Атрибуты в нем необязательны (но зачем вам тогда такой класс?).

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

In [1]:
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')
In [2]:
# создадим объект класса 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
In [3]:
# вызовем метод drive у обоих классов
coupe.drive()
sedan.drive()
coupe drives on the road
sedan drives on the road

Задание

Создайте класс Plane который будет иметь атрибуты length, wingspan, engines_count. Эти атрибуты должны быть проинициализированы в конструкторе. Так же создайте метод класса, который будет выводить характеристики вашего самолета (нафантазируйте в каком виде).

Создайте объект этого класса с разными значениями атрибутов и вызовите у объекта метод показа характеристик.

In [ ]:
 

Чтение и запись в файл

Для чтения или записи в файл используется следующая конструкция:

f = open('путь_к_файлу', 'флаг_открытия')

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

Откроем файл с флагом на запись для того, чтобы он создался, если его нет

In [55]:
f = open('test.txt', 'w')

запишем в него пару строк:

In [56]:
f.write('First line')
f.write('\n')
f.write('Second line')
Out[56]:
11

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

In [57]:
f.close()

Для чтения из файла воспользуемся флагом r

In [68]:
f = open('test.txt', 'r')

Считаем из файла все что в нем есть в список

In [69]:
l_file = f.readlines()
In [71]:
print(l_file)
['First line\n', 'Second line']
In [72]:
f.close()

Чтобы не закрывать вручную поток чтения/записи лучше использовать следующую конструкцию, которая делает это за вас:

In [73]:
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.

In [ ]:
 

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

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

Их подключение выглядит следующим образом:

import названиеодуля

Если он поставляется в пакете, то требуется оказать что он извлекается из определенного пакета

from название_пакета import названиеодуля

Если название слишком длинное, то можно добавить сокращенное название модуля

import названия_модуля as нзвн_мдл

In [41]:
# модуль для работы с матрицами, векторами и математическими операциями
# np общепринятое сокращение для удобства использования в коде модуля numpy
import numpy as np

# из пакета matplotlib нам потребуется модуль pyplot, к которому мы будем
# обращаться по сокращенному общепринятому имени plt
from matplotlib import pyplot as plt

Теперь возможно обращение к методам данных модулей, например найдем косинус угла 90,

для этого вызовем метод cos() из модуля np, в который передадим значение угла домноженного на константу Пи, которую так же можно взять из данного модуля:

In [45]:
np.cos(90 * np.pi)
Out[45]:
1.0

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

Введем в консоль

pip install названиеодуля

Так же возможна установка модулей прямо из jupyter, используя ! pip

!pip install названиеодуля
In [4]:
!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.

Задание

Установите модули pandas, numpy и matplotlib если их нет. Проверить установлены они или нет можно с помощью команды:

!pip show названиеодуля
In [ ]: