Skip to content

4. Основы Python

BohdanObruch edited this page Apr 18, 2024 · 21 revisions

Данный раздел разделен на несколько частей(каждый пункт - это ссылка на соответствующий раздел):

Переход по внутренним ссылкам происходит только при открытом разделе блока в котором находится ссылка.

Основы Python


Типы данных в Python


Основы Python

Переменные

Нажать, чтобы раскрыть Переменная в Python - это контейнер для хранения данных. Она является именованным местом в памяти, в котором хранится значение. В Python переменные создаются при присваивании значения и уничтожаются, когда они больше не используются.
>>> a = 5
>>> b = "Hello"
>>> c = 5.0

В Python переменные не требуется объявлять, они создаются при первом присваивании значения. Тип переменной определяется автоматически во время выполнения программы.

>>> a = 5
>>> print(type(a))  
<class 'int'>

>>> b = "Hello"
>>> print(type(b))  
<class 'str'>

>>> c = 5.0
>>> print(type(c))   
<class 'float'>

>>> d = True
>>> print(type(d)) 
<class 'bool'>

>>> e = None
>>> print(type(e))  
<class 'NoneType'>

>>> f = [1, 2, 3]
>>> print(type(f))  
<class 'list'>

>>> g = (1, 2, 3)
>>> print(type(g))  
<class 'tuple'>

>>> h = {1, 2, 3}
>>> print(type(h))  
<class 'set'>

>>> i = {"a": 1, "b": 2, "c": 3}
>>> print(type(i))  
 <class 'dict'>

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

>>> a, b, c = 5, "Hello", 5.0

Именование переменных

Имена переменных в Python могут содержать буквы, цифры и символ подчеркивания, но не могут начинаться с цифры. Имена переменных чувствительны к регистру, то есть a и A - это разные переменные.

>>> a = 5
>>> A = 10

Имена переменных не могут быть ключевыми словами Python, такими как if, else, for, while, break, continue, class, def, return, import, from, as, with, try, except, finally, raise, assert, global, nonlocal, lambda, and, or, not, is, in, None, True, False, del, pass, yield, async, await, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with.

>>> if = 5  # Ошибка

Имена переменных в Python обычно пишутся в нижнем регистре, а слова разделяются символом подчеркивания. Это называется стилем snake_case. Данные рекомендации описаны в PEP 8 - руководстве по написанию кода на Python. Ссылка на PEP 8: https://www.python.org/dev/peps/pep-0008/

>>> my_variable = 5

Константы

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

>>> PI = 3.14
>>> GRAVITY = 9.8

Ввод данных

Нажать, чтобы раскрыть

Для ввода данных в Python используется функция input().

>>> name = input()
>>> print("Hello, " + name)

Функция input() выводит сообщение, которое передается в качестве аргумента, и ждет, пока пользователь введет данные с клавиатуры. После этого она возвращает введенные данные в виде строки. Если необходимо ввести данные определенного типа, то их можно привести к нужному типу с помощью функций int(), float(), bool().

>>> age = input("Enter your age: ")
>>> print("You are " + age + " years old.")

Вывод данных

Нажать, чтобы раскрыть

Для вывода данных в Python используется функция print().

>>> print("Hello, World!")

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

>>> print("Hello", "World!")
Hello World!

Функция print() также может принимать именованные аргументы, такие как sep и end.

>>> print("Hello", "World!", sep=", ", end="!")
Hello, World!! 

sep - это разделитель между аргументами, по умолчанию это пробел. End - это символ, который будет добавлен в конце вывода, по умолчанию это символ новой строки. sep может быть любым символом, например, запятой, пробелом, точкой и т.д.

#for formatting a date 
>>> print('09','12','2016', sep='-') 
09-12-2016

>>> print('practik','python', sep='@')
practik@python

end может быть любым символом, например, пробелом, точкой, восклицательным знаком и т.д.

>>> print('practik','words', sep='_', end='@') 
practik_words@

Операторы

Нажать, чтобы раскрыть

Операторы в Python - это символы, которые выполняют операции над переменными и значениями. Например, + - это оператор сложения, - - оператор вычитания, * - оператор умножения, / - оператор деления, // - оператор целочисленного деления, % - оператор остатка от деления, ** - оператор возведения в степень.

>>> a = 5
>>> b = 2
>>> print(a + b)
7

>>> print(a - b) 
3

>>> print(a * b)  
10

>>> print(a / b)  
2.5

>>> print(a // b)  
2 (целочисленное деление. Возвращает целую часть от деления(сколько раз b влезет в a))

>>> print(a % b)  
1 (остаток от деления. Возвращает остаток от деления a на b(сколько останется после деления a на b))

>>> print(a ** b)  
25 (возведение в степень. Возводит a в степень b(в данном случае 5 возводится в степень 2(умножается само на себя 2 раза)))

Операторы сравнения

Операторы сравнения в Python - это символы, которые используются для сравнения двух значений. Они возвращают булево значение True или False.

>>> a = 5
>>> b = 2
>>> print(a > b)  
True

>>> print(a < b)  
False

>>> print(a >= b)  # (больше или равно)
True 

>>> print(a <= b)  # (меньше или равно)
False 

>>> print(a == b)  # (равно. Важно отметить, что для сравнения используется двойное равно)
False 

>>> print(a != b)  # (не равно. Важно отметить, что для сравнения используется восклицательный знак(знак отрицания) и равно)
True 

Логические операторы

Логические операторы в Python - это операторы, которые используются для комбинирования условий. Они возвращают булево значение True или False.

>>> a = 5
>>> b = 2
>>> print(a > 3 and b > 1)  #(и. Возвращает True, если оба условия истинны)
True

>>> print(a > 3 or b > 3)  # (или. Возвращает True, если хотя бы одно условие истинно)
True 

>>> print(not (a > 3 and b > 1))  # (не. Возвращает True, если условие ложно)
False 

Последнее выражение можно переписать так:
>>> print(not True) 
False

Если в выражении указано and , то оба условия должны быть истинными, чтобы результат был истинным. Если в выражении указано or, то хотя бы одно условие должно быть истинным, чтобы результат был истинным. Если в выражении указано not, то результат будет противоположным. Если в выражении указано or, то хотя бы одно условие должно быть истинным, чтобы результат был истинным. Если в выражении указано not, то результат будет противоположным.

Операторы присваивания

Операторы присваивания в Python - это операторы, которые используются для присваивания значения переменной.

>>> a = 5  # Присваивание значения переменной
>>> a += 5  # Присваивание суммы переменной
полная форма a = a + 5

>>> a -= 5  # Присваивание разности переменной
полная форма a = a - 5

>>> a *= 5  # Присваивание произведения переменной
полная форма a = a * 5

>>> a /= 5  # Присваивание частного переменной
полная форма a = a / 5

>>> a //= 5  # Присваивание целочисленного деления переменной
полная форма a = a // 5

>>> a %= 5  # Присваивание остатка от деления переменной
полная форма a = a % 5

>>> a **= 5  # Присваивание возведения в степень переменной
полная форма a = a ** 5

Также есть моржовый оператор :=, который используется для присваивания значения переменной. В том же выражении, в котором она используется.

>>> a = 5
>>> print(b := a + 5)
10

# Пример использования в разных выражениях
>>> print((a := 5) + (b := 5))  
10

>>> print(a)  
5

>>> print(b)  
5

При попытке использовать обычный оператор присваивания в выражении, возникнет ошибка:

>>> print(a = 5 + 5)  # Ошибка синтаксиса, так как оператор присваивания не возвращает значение. А вот моржовый оператор возвращает значение переменной.
TypeError

Типизация в Python

Нажать, чтобы раскрыть Python является языком с динамической типизацией, что означает, что тип переменной определяется во время выполнения программы, а не во время компиляции. Это означает, что переменная может содержать любой тип данных, и его тип может изменяться во время выполнения программы.
>>> a = 5
>>> a = "Hello"

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

>>> a = 5
>>> b = "Hello"
>>> c = a + b  # Ошибка

Типы данных в Python

Числа (numbers)

Нажать, чтобы раскрыть

Целые числа

Целые числа в Python, это числа без дробной части. Они могут быть положительными или отрицательными. Например, 2, -2, 0, 1000.

Целые числа в Python задаются следующим образом:

>>> number = 123

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

# Сложение
>>> number = 123 + 321

# Вычитание
>>> number = 123 - 321

# Деление
>>> number = 123 / 321

# Целочисленное деление (возвращает целую часть от деления)
>>> number = 123 // 321

# Остаток от деления (возвращает остаток от деления)
>>> number = 123 % 321

# Умножение
>>> number = 123 * 321

# Возведение в степень (возводит число в степень)
>>> number = 123 ** 321

# Математические выражение выполняются по правилам арифметики (сначала умножение и деление, потом сложение и вычитание), но при необходимости можно использовать скобки для изменения порядка выполнения операций.
>>> number = (123 + 321) * 213

Для того чтобы записать в двоичной системе, необходимо использовать префикс 0b:

>>> number = 0b1010  # (это число в десятичной системе равно 10)

Для того чтобы записать в восьмеричной системе, необходимо использовать префикс 0o:

>>> number = 0o12  # (это число в десятичной системе равно 10)

Для того чтобы записать в шестнадцатеричной системе, необходимо использовать префикс 0x:

>>> number = 0xA  # (это число в десятичной системе равно 10)

Дробные числа

Дробные числа это числа с дробной частью. Они могут быть положительными или отрицательными. Например, 2.6, -2.0, 0.0, 1000.0. И записываются с помощью точки. Дробные числа в Python задаются следующим образом:

>>> number = 123.321

Дробные или вещественные числа в Python поддерживают те же операции, что и целые.

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

Пример:

>>> 0.1 + 0.2
0.30000000000000004

Мы ожидали получить 0.3, но получили 0.30000000000000004. Это связано с тем, что вещественные числа в Python представлены в двоичной системе счисления и могут быть неточными. https://0.30000000000000004.com/ - сайт, который посвящен этой проблеме.

Модуль math

Модуль math(нажмите для открытия)

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

>>> import math

# Вывод числа пи
>>> math.pi

# Возведение числа X в степень Y
>>> math.pow(X, Y)

# Факториал числа X
>>> math.factorial(X)

# Модуль числа X
>>> math.fabs(X)

# Округление X до ближайшего большего числа
>>> math.celi(X)

# Округление X вниз
>>> math.floor(X)

Модуль random

Модуль random(нажмите для открытия) Для генерации случайных данных можно использовать модуль `random`. Он содержит в себе большое количество функций для генерации случайных чисел, выбора случайных элементов из последовательности и т.д. Чтобы использовать функции из модуля `random`, его необходимо импортировать и можно использовать следующие вызовы:
>>> import random

# Генерация случайного целого числа в диапазоне от 1 до 10
>>> a = random.randint(1, 10)

Важно: Нужно помнить что в авто тестах использование случайных данных не рекомендуется, так как это может привести к непредсказуемому поведению тестов, так как мы не можем контролировать входные данные. Или же в случае использования случайных данных, их нужно контролировать, как например в случае генерации случайных чисел, но в заданном диапазоне. Это нужно для того чтобы тесты были предсказуемыми(что числа точно будут в данном диапазоне, а не в разброс от 1 до 10000000) и стабильными. Чтобы получить стабильные рандомные данные, нужно использовать seed, который будет генерировать одинаковые данные при каждом запуске тестов. Следующий пример показывает как использовать seed:

>>> import random

>>> random.seed(1) # В скобках указывается любое значение(число или строка), которое будет использоваться для генерации случайных чисел
>>> print(random.randint(1, 10))
3

Модуль Faker

Модуль Faker(нажмите для открытия) Модуль `Faker` позволяет генерировать случайные данные, такие как имена, адреса, тексты, числа и т.д. Это может быть полезно для генерации тестовых данных, например для тестирования форм, где нужно вводить данные пользователя. Для того чтобы использовать функции из модуля `Faker`, его необходимо импортировать и можно использовать следующие вызовы:
>>> from faker import Faker

>>> fake = Faker()

# Генерация случайного имени
>>> fake.name()
'Maureen Guerrero'

# Генерация случайного адреса
>>> fake.address()
'651 Greg Station\nMurillotown, MN 66520'

Функция round

Функция round позволяет округлить число до заданного количества знаков после запятой. По умолчанию округление происходит до целого числа.

# Округление числа до целого
>>> round(1.5)
2

# Округление числа до 2 знаков после запятой
>>> round(1.333333, 2)
1.33

Строки (strings)

Нажать, чтобы раскрыть Строки в Python это последовательность символов, которые могут быть буквами, цифрами, знаками препинания и т.д и задаются с помощью кавычек. Строки в Python задаются одним из следующих образов:
>>> s = "Python"
>>> s = 'Python'

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

>>> s = "I'm a string"
>>> s = 'I"m a string'

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

>>> s = "I'm a string with \"quotes\"" 

>>> s = 'I"m a string with \'quotes\''

Где \" и \' это экранированные символы, которые позволяют использовать кавычки в строке.

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

>>> multiline_string = """first
second
third"""

>>> multiline_string = "first\nsecond\nthird"

>>> multiline_string = "first\n" \
                   "second\n" \
                   "third"

Сырые(необработанные) строки (raw strings)

Сырые строки это строки, в которых экранированные символы не обрабатываются и позволяют использовать специальные символы в строке. Сырые строки задаются с помощью префикса r перед строкой:

s = r"I'm a string with \"quotes\""

Или же с помощью экранирования:

>>> s = 'first \\nsecond \\nthird'

Индексы и слайсы(срезы)

Индексы в Python позволяют получать доступ к отдельным символам строки. Слайсы позволяют получать доступ к нескольким символам строки. Элементы строк в Python индексируются с нуля. Поэтому если необходимо получить из строки первый элемент, то запросить надо нулевой.

>>> s = "abcdefg"
>>> print(s[0])

Также можно получить элементы с конца строки, используя отрицательные индексы:

>>> s = "abcdefg"
>>> print(s[-1])

Важно: Индексы с конца строки начинаются с -1, что позволяет удобно получать элементы с конца строки. А индексы с начала строки начинаются с 0.

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

>>> s[x:y:z]

"""
Где:
x — начальный индекс;
y — конечный индекс(не включительно);
z — шаг(по умолчанию 1).
"""

Примеры:

>>> s = "abcdefg"

>>> print(s[0:3])
abc

>>> print(s[0:-1])
abcdef

>>> print(s[0:-1:2])
ace

Значение 0 в срезе можно опустить, так как оно подразумевается по умолчанию:

>>> s = "abcdefg"

>>> print(s[:3])
abc

Также можно получить все элементы строки с начала до конца:

>>> s = "abcdefg"

>>> print(s[:])
abcdefg

Можно получить все элементы строки с конца до начала(перевернуть), в обратном порядке:

>>> s = "abcdefg"

>>> print(s[::-1])
gfedcba

Операции

Все операции, которые можно совершать со строками доступны через точку после строки:

# Замена слов в строке
>>> "Hello, world!".replace("Hello", "Bye")  # первый аргумент - что заменить, второй - на что заменить
Bye, world!

# Разделение строки 
>>> "Hello, world!".split()
['Hello,', 'world!']

# Проверка начала строки 
>>> "Hello, world!".startswith("Hello") # Возвращает True, если строка начинается с указанной подстроки
True

# Первый символ строки заглавный
>>> "hello, world!".capitalize() 
Hello, world!

# Все символы заглавными буквами
>>> "hello, world!".upper()
HELLO, WORLD!

# Все символы строчными буквами
>>> "HELLO, WORLD!".lower()
hello, world!

# Проверка на то, что строка состоит только из букв
>>> "Hello, world!".isalpha()
False

# Проверка на то, что строка состоит только из цифр
>>> "123".isdigit()
True

Форматирование

Форматирование в Python позволяет удобно склеивать строки и вставлять в них значения переменных. В Python есть несколько способов «склеивания» строк:

# Строки без переменных
>>> print("first " "second " "third ")
first second third 

# Строки в переменных
>>> first = "first"
>>> second = "second"
>>> third = "third"

>>> print(first + second + third)
firstsecondthird

# С пробелами
>>> print(first + " " + second + " " + third)
first second third

Для более удобной конкатенации («склеивания») строк в Python предусмотрены так называемые f-строки:

>>> first = "first"
>>> second = "second"
>>> third = "third"

# Без пробелов
>>> print(f"{fist}{second}{third}")
firstsecondthird

# С пробелами
>>> print(f"{first} {second} {third}")
first second third

Внутри фигурных скобок можно вызывать функции и выполнять выражения:

>>> print(f"{first} {second} {third.upper()} {10 + 10}")
first second THIRD 20

До появления f-строк в Python был доступен следующий способ форматирования(format):

>>> print("{} {} {}".format(first, second, third))
first second third

f-строки это не замена, а удобная альтернатива методу format. У format есть свои преимущества в виде отложенного форматирования шаблона и возможности использовать именованные аргументы. Данная конструкция позволяет вставлять значения переменных в строку в порядке их следования в методе format:

>>> print("{first} {second} {third}".format(first=first, second=second, third=third))
first second third

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

>>> url_template = "https://yourserver.com/v1/api/{}"
>>> users_url = url_template.format("users")
>>> groups_url = url_template.format("groups")

>>> print(users_url)
https://yourserver.com/v1/api/users

>>> print(groups_url)
https://yourserver.com/v1/api/groups

Доступен и еще более старый способ форматирования, который иногда встречается в проектах:

>>> print("%s %s %s" % (first, second, third))
first second third

Приведение типов в строку:

>>> s = "123"
>>> n = 123

>>> assert s == n  # Будет ошибка, так как типы разные
>>> assert s == str(n)  # Переменную n приводим к строке и сравниваем. Будет истина, так как n приведено к строке
>>> assert int(s) == n  # Переменную s приводим к числу и сравниваем. Будет истина, так как s приведено к числу

Проверка на то, что переменная состоит только из цифр:

>>> s = "123"
>>> s.isdigit()  # Если True, то переменная состоит только из цифр
True

Проверка на то, что переменная состоит только из букв:

>>> s = "123ffsdfs"
>>> s.isalpha()  # Если True, то переменная состоит только из букв
False

Списки (lists)

Нажать, чтобы раскрыть

Составные типы данных в Python это списки, кортежи, словари и множества. В данном разделе рассмотрим списки. Списки в Python задаются с помощью квадратных скобок ([]). Содержимым списков могут быть любые типы данных и даже сами списки. При этом один список может содержать в себе сразу несколько типов данных.

>>> l = ["list", 123, 12.3, ["another_list", 321]]

Пустой список задается следующим образом:

>>> l = []

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

>>> l = list("first")

>>> print(l)
['f', 'i', 'r', 's', 't']

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

>>> l = ["first", "second", "third", ["another_list", 321]]

>>> print(l[0]) # Получение первого элемента
first

>>> print(l[0:2]) # Получение первых двух элементов
['first', 'second']

>>> print(l[-1]) # Получение последнего элемента
['another_list', 321]

>>> print(l[-1][0]) # Получение элемента из вложенного списка
another_list

Важно учесть: У списков нет размерности, что позволяет удобно с ними работать. При этом надо внимательнее следить за размером содержимого списков. Нумерация списков начинается с нуля и списки поддерживают слайсы.

Некоторые методы списков

# Добавление элемента x в конец списка
>>> list.append(x)

# Расширение списка list элементами списка L
>>> list.extend(L)

# Вставка на i-ое место списка элемента x
>>> list.insert(i, x)

# Удаление первого элемента в списке со значением x
>>> list.remove(x)

# Возвращение количества элементов списка list со значением x
>>> list.count(x)

# Разворачивание списка в обратном порядке
>>> list.reverse()

# Очистка списка
>>> list.clear()

# Сортировка списка
>>> list.sort()  # Сортирует список по возрастанию
>>> list.sort(reverse=True)  # Сортирует список по убыванию

>>> len(list)  # Возвращает длину списка

Чтобы удалить дубликаты из списка, можно воспользоваться множеством:

>>> l = [1, 2, 3, 4, 5, 5, 5, 5, 5]
>>> l = list(set(l)) # Удаляет дубликаты из списка, так как множество не содержит дубликатов. После чего преобразует множество обратно в список, но при этом порядок элементов может измениться
[1, 2, 3, 4, 5]

Множества (set)

Нажать, чтобы раскрыть

Множества в Python это неупорядоченные коллекции уникальных элементов. Множества в Python задаются с помощью фигурных скобок ({}):

>>> s1 = {1, 2, 3, 4, 5}
>>> s2 = {1, 2, 3, 4, 5, 5, 5, 5, 5} # При этом все дубликаты будут удалены
>>> print(s2)
{1, 2, 3, 4, 5}

Множества поддерживают операции объединения, пересечения и разности:

>>> s1 = {1, 2, 3, 4, 5}
>>> s2 = {4, 5, 6, 7, 8}

# Объединение множеств
>>> s3 = s1 | s2 или s1.union(s2)
>>> print(s3)
{1, 2, 3, 4, 5, 6, 7, 8}

# Пересечение множеств
>>> s3 = s1 & s2  или s1.intersection(s2)
>>> print(s3)
{4, 5}

# Разность множеств
>>> s3 = s1 - s2 или s1.difference(s2)
>>> print(s3)
{1, 2, 3}

>>> s1.intersection(s2)  # Пересечение множеств
{4, 5}

Словари (dict)

Нажать, чтобы раскрыть

Словари в Python представляют собой неупорядоченные коллекции произвольных объектов с доступом по ключу. Часто их называют хеш-таблицами или массивами.

Задать словарь можно следующим образом:

>>> d = {
    "key": "value"
}

Получать значения можно по ключу. Для этого достаточно обратиться к ключу:

>>> d = {
    "name": "John",
    "age": 30
}

>>> print(d["name"])
John
>>> print(d["age"])
30

Также можно изменить значение по ключу:

>>> d = {
    "name": "John",
    "age": 30
}

>>> d["name"] = "Mike"
>>> print(d["name"])
Mike

Добавить новую пару ключ-значение можно следующим образом:

>>> d = {
    "name": "John",
    "age": 30
}

>>> d["city"] = "New York"
>>> print(d)
{'name': 'John', 'age': 30, 'city': 'New York'}

Удалить пару ключ-значение можно следующим образом:

>>> d = {
    "name": "John",
    "age": 30
}

>>> del d["name"]
>>> print(d)
{'age': 30}

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

>>> d = {
    "name": "John",
    "age": 30,
    "address": {
        "city": "New York",
        "street": "Broadway"
    }
}

>>> print(d["address"]["city"])
New York

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

>>> print(d.keys()) # Получение списка ключей
dict_keys(['name', 'age', 'address'])

>>> print(d.values()) # Получение списка значений
dict_values(['John', 30, {'city': 'New York', 'street': 'Broadway'}])

>>> print(d.list()) # Получение списка пар ключ-значение
dict_items([('name', 'John'), ('age', 30), ('address', {'city': 'New York', 'street': 'Broadway'})])

Пары значений можно получить следующим образом:

>>> print(d.items()) # Получение списка пар ключ-значение в виде кортежей
dict_items([('name', 'John'), ('age', 30)])

Можно проверить наличие ключа в словаре:

>>> d = {
    "name": "John",
    "age": 30
}

>>> print("name" in d)
True

>>> print("city" in d)  
False

pprint - библиотека для красивого вывода сложных структур данных.

Пример использования pprint:

user1 = {
    "name": "Vasya",
    "age": 18,
}

user2 = {
    "name": "Petya",
    "age": 20,
}

users = {25: user1, 42: user2, 55: {"name": "Oleg", "age": 25}}

from pprint import pprint

pprint(list(users.items()))

Функции словарей

>>> d = {
    "name": "John",
    "age": 30
}

# Получение значения по ключу. 
>>> print(d.get("name"))
John


# Получение значения по ключу, если его нет, то возвращает значение по умолчанию
>>> print(d.get("name", "Mike"))
John

# Получение значения по ключу, которого нет в словаре и вставка значения по умолчанию
>>> print(d.get("city", {"city": "New York"}))
{'city': 'New York'}

# Удаление пары ключ-значение по ключу. Возвращает значение по ключу
>>> print(d.pop("name"))
John

>>> print(d) # Что осталось в словаре после удаления
{'age': 30}

# Удаление всех пар ключ-значение
>>> print(d.clear())
None

>>> print(d)
{}

# Копирование словаря
>>> print(d.copy())
{'name': 'John', 'age': 30}
>>> print(d)
{'name': 'John', 'age': 30}

# Обновление словаря
>>> d.update({"name": "Mike"})
>>> print(d)
{'name': 'Mike', 'age': 30}

Изменяемость списков, словарей, множеств

Нажать, чтобы раскрыть

Списки, словари и множества являются изменяемыми объектами, что позволяет изменять их содержимое. Это означает, что при изменении списка, словаря или множества, изменения будут происходить в самом объекте, а не в его копии.

Следующий пример показывает, что при изменении списка, изменения происходят в самом списке:

>>> l1 = [1, 2, 3, 4, 5]
>>> l2 = l1
>>> l2.append(6)
>>> print(l1)  
[1, 2, 3, 4, 5, 6]

>>> print(l2)  
[1, 2, 3, 4, 5, 6]

Также это относится и к словарям и множествам:

>>> d1 = {"name": "John", "age": 30}
>>> d2 = d1
>>> d2["city"] = "New York"
>>> print(d1)  
{'name': 'John', 'age': 30, 'city': 'New York'}

>>> print(d2)  
{'name': 'John', 'age': 30, 'city': 'New York'}
>>> s1 = {1, 2, 3, 4, 5}
>>> s2 = s1
>>> s2.add(6)
>>> print(s1)  
{1, 2, 3, 4, 5, 6}

>>> print(s2)
{1, 2, 3, 4, 5, 6}

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

>>> l1 = [1, 2, 3, 4, 5]
>>> l2 = l1.copy()
>>> l2.append(6)
>>> print(l1)  
[1, 2, 3, 4, 5]

>>> print(l2)  
[1, 2, 3, 4, 5, 6]

>>> d1 = {"name": "John", "age": 30}
>>> d2 = d1.copy()
>>> d2["city"] = "New York"
>>> print(d1)  
{'name': 'John', 'age': 30}

>>> print(d2)  
{'name': 'John', 'age': 30, 'city': 'New York'}

>>> s1 = {1, 2, 3, 4, 5}
>>> s2 = s1.copy()
>>> s2.add(6)
>>> print(s1)  
{1, 2, 3, 4, 5}

>>> print(s2)  
{1, 2, 3, 4, 5, 6}

Со вложенными списками, словарями и множествами ситуация несколько сложнее. При изменении вложенного объекта, изменения будут происходить в самом объекте, а не в его копии:

>>> l1 = [1, 2, 3, [4, 5, 6]]
>>> l2 = l1.copy()
>>> l2[3].append(7)
>>> print(l1)  
[1, 2, 3, [4, 5, 6, 7]]  

>>> print(l2)  
[1, 2, 3, [4, 5, 6, 7]]

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

>>> import copy

>>> l1 = [1, 2, 3, [4, 5, 6]]
>>> l2 = copy.deepcopy(l1)
>>> l2[3].append(7)
>>> print(l1)  
[1, 2, 3, [4, 5, 6]]

>>> print(l2)  
[1, 2, 3, [4, 5, 6, 7]]

Кортежи (tuple)

Нажать, чтобы раскрыть

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

>>> t = (1, 2, 3, 4, 5)

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

При присвоении кортежа новой переменной, создается новый кортеж, а не его копия:

>>> t1 = (1, 2, 3, 4, 5)
>>> t2 = t1
>>> t2 += (6, 7, 8) # При этом создается новый кортеж, а не изменяется старый. Данный синтаксис эквивалентен t2 = t2 + (6, 7, 8)
>>> print(t1)  
(1, 2, 3, 4, 5)

>>> print(t2)  
(1, 2, 3, 4, 5, 6, 7, 8)

Frozenset

Нажать, чтобы раскрыть

Frozenset это неизменяемое множество, которое задается следующим образом:

>>> f = frozenset([1, 2, 3, 4, 5])

Frozenset поддерживает те же операции, что и множества, но при этом не поддерживает операции, которые изменяют множество.

Подсказка к домашнему заданию

Смотрите только когда не можете понять что делать(нажать, чтобы раскрыть)

В тесте test_random_list нужно создать список из 10 случайных чисел от 1 до 100 (включая обе границы) и отсортировать его по возрастанию.

def test_random_list():
    """
    Создайте список из 10 случайных чисел от 1 до 100 (включая обе границы) и отсортируйте его по возрастанию.
    """
    # TODO создайте список
    l = []

Чтобы не создавать дубли кода, и не писать вручную 10 раз:

l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l2 = [5, 7, 9, 12, 99, 66, 80, 39, 99, 100]
l3 = [4, 5, 9, 19, 20, 21, 22, 23, 24, 25]
l4 = [1, 88, 8, 66, 55, 44, 33, 22, 11, 10]
l5 = [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
l6 = [55, 59, 63, 67, 71, 75, 79, 83, 87, 91]
l7 = [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
l8 = [7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
l9 = [99, 98, 97, 96, 95, 94, 93, 92, 91, 90]
l10 = [5, 15, 25, 35, 45, 55, 65, 75, 85, 95]

Можно использовать функцию random.randint из модуля random как в примере ниже:

import random

def test_random_list():
    """
    Создайте список из 20 случайных чисел от 5 до 200 (включая обе границы)
    """
    # TODO создайте список
    l = [random.randint(5, 200) for _ in range(20)]
    print(l)

Результат:
[103, 199, 112, 15, 71, 135, 129, 108, 82, 127, 96, 154, 60, 134, 40, 77, 40, 198, 29, 163]

Или можно использовать random.sample для получения уникальных случайных чисел: random.sample - это функция, которая возвращает список уникальных случайных чисел из диапазона.

import random

def test_random_list():
    """
    Создайте список из 20 случайных чисел от 2 до 200 (включая обе границы)
    """
    # TODO создайте список
    l = random.sample(range(2, 201), 20) # Указано 201, так как второй аргумент всегда не включается(-1)
    print(l)

Содержание
Командная строка
Кодировка UTF-8 в Java
Список полезных книг для автоматизаторов тестирования на языке Java
Список полезных книг для автоматизаторов тестирования на языке Python Структура проекта Github README.md

Java:
1. Вводное занятие. Сразу к практике.
2. Git. GitHub. Погружаемся.
3. Погружаемся в инструментарий и библиотеки
4. Основы Java
5. Продолжаем разрабатывать автотесты. PageObjects
6. JUnit 5
7. Allure Reports
8. Работа с файлами
9. Selenide #1
10. Jenkins. Создаем первую задачу
11. Управляем параметрами в коде и в Jenkins
12. Отправляем уведомления о результатах прохождения автотестов
13. Учимся быстро разрабатывать проекты для тестовых заданий
14. Selenoid
15. Библиотека Owner
16. REST API. Пишем автотесты с Rest assured
17. REST API. Декомпозируем UI тесты. Подключаем отчетность
18. REST API. Продолжаем изучать
19. Мобильная автоматизация #1. Разрабатываем автотесты с Browserstack
20. Allure TestOps
21. Переезд на собственную инфраструктуру Java

Python:
1. Вводное занятие. Сразу к практике!
2. Погружаемся в инструментарий и библиотеки
3. Git. GitHub. Погружаемся.
4. Основы Python
5. Selene #1
6. Основы Python. Часть II
7. Основы Python. Часть III
8. Page Object
9. Allure Reports
10. Работаем с файлами Python
11. Jenkins. Создаем первую задачу и управляем параметрами Python
12. Телеграм бот. Отправляем уведомления о результатах прохождения тестов
13. Pytest
14. Selenoid
15. Pytest. Часть II
16. Venv, Poetry и управление зависимостями проекта
17. REST API. Часть I. Пишем автотесты с Requests
18. REST API. Часть II. Продолжаем изучать
19. Мобильная автоматизация #1. Разрабатываем автотесты с Browserstack
20. Мобильная автоматизация #2. Разрабатываем автотесты с эмулятором Android устройства
21. Allure TestOps
22. Переезд на собственную инфраструктуру Python

Clone this wiki locally