Tech
June 6, 2024

Python Syntax 

Типы данных

Числовые типы

Целые числа (int):

x = 10

Числа с плавающей запятой (float):

y = 10.5

Комплексные числа (complex):

z = 1 + 2j

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

Строки (str):

s = "Hello, World!"

Списки (list):

my_list = [1, 2, 3, 4, 5]

Кортежи (tuple):

my_tuple = (1, 2, 3, 4, 5)

Диапазоны (range):

my_range = range(1, 10)

Коллекции

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

my_set = {1, 2, 3, 4, 5}

Неизменяемые множества (frozenset):

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

Словари (dict):

my_dict = {"name": "Alice", "age": 25, "city": "New York"}

Дополнительные типы данных

Булевы значения (bool):

flag = True

NoneType (представляет отсутствие значения):

none_value = None

Байты (bytes):

my_bytes = b"Hello, World!"

Массивы байтов (bytearray):

ba = bytearray([104, 101, 108, 108, 111])
print(ba.decode('utf-8'))  # hello

Проверка типов

Определение типа

a = 1
typeis = type(a)
print(typeis) # <class 'int'>

Валидация типа в функции

def greet(name: str) -> str:
    return f"Привет, {name}!"

print(greet("Мир"))

Условия

Условные операторы

age = 18

if age >= 18:
    print("Взрослый")
else:
    print("Несовершеннолетний")

Сопоставление с образцом (Pattern Matching)

def http_status(status):
    match status:
        case 200:
            return "OK"
        case 404:
            return "Not Found"
        case 500:
            return "Server Error"
        case _:
            return "Unknown status"

print(http_status(200))
print(http_status(404))

Тернарный оператор

Простое условие

# Синтаксис: результат1 if условие else результат2
x = 10
y = 20

# Если x больше y, присвоить переменной result значение "x больше", иначе "y больше"
result = "x больше" if x > y else "y больше"
print(result)  # Вывод: y больше

Вложенные условия

# Определение максимального из трех чисел
a, b, c = 5, 10, 15

max_value = a if a > b and a > c else (b if b > c else c)
print(max_value)  # Вывод: 15

Циклы

for

for i in range(5):
    print(f"Цикл for: {i}")

while

count = 0
while count < 5:
    print(f"Цикл while: {count}")
    count += 1

break

for i in range(10):
    if i == 5:
        break  # Выход из цикла, когда i равно 5
    print(i)

# Вывод:
# 0
# 1
# 2
# 3
# 4

continue

for i in range(10):
    if i % 2 == 0:
        continue  # Пропуск оставшегося кода в текущей итерации, если i чётное
    print(i)

# Вывод:
# 1
# 3
# 5
# 7
# 9

Работа со списками

Индексы

# Создаем список
items = [1, 2, 3, 4, 5]

# Обращение к элементу по индексу
first_item = items[0]
print(first_item)  # Вывод: 1

# Обращение к элементу по отрицательному индексу
last_item = items[-1]
print(last_item)  # Вывод: 5

Срезы

# Создаем список
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Срез от 2 до 5 элемента (индексы 2, 3, 4)
slice1 = items[2:5]
print(slice1)  # Вывод: [3, 4, 5]

# Срез с начала до 4 элемента (индексы 0, 1, 2, 3)
slice2 = items[:4]
print(slice2)  # Вывод: [1, 2, 3, 4]

# Срез с 6 элемента до конца (индексы 6, 7, 8, 9)
slice3 = items[6:]
print(slice3)  # Вывод: [7, 8, 9, 10]

# Срез с шагом 2 (берем каждый второй элемент)
slice4 = items[::2]
print(slice4)  # Вывод: [1, 3, 5, 7, 9]

Отрицательные индексы

# Создаем список
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Доступ к последнему элементу
last_item = items[-1]
print(last_item)  # Вывод: 10

# Доступ к предпоследнему элементу
second_last_item = items[-2]
print(second_last_item)  # Вывод: 9

# Срез от 2 элемента с конца до конца списка
slice1 = items[-2:]
print(slice1)  # Вывод: [9, 10]

# Срез от 4 элемента с конца до 2 элемента с конца
slice2 = items[-4:-2]
print(slice2)  # Вывод: [7, 8]

# Срез с шагом -1 (реверс списка)
slice3 = items[::-1]
print(slice3)  # Вывод: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

Функции

Обычная функция

def greet(name):
    return f"Привет, {name}!"

print(greet("Мир"))

Функции высшего порядка и лямбда-выражения

# Лямбда-выражения
add = lambda x, y: x + y
print(add(3, 5))

# Функции высшего порядка
def apply_func(func, value):
    return func(value)

print(apply_func(lambda x: x ** 2, 10))

Функции для работы со списками

Фильтрация

# Создаем список от 0 до 9
items = [x for x in range(10)]

# Фильтрация четных чисел
even_items = list(filter(lambda x: x % 2 == 0, items))
print(even_items)  # Вывод: [0, 2, 4, 6, 8]

Преобразование

# Создаем список от 0 до 9
items = [x for x in range(10)]

# Преобразование чисел в строки
str_items = list(map(lambda x: str(x), items))
print(str_items)  # Вывод: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

Добавление элементов

# Создаем пустой список
items = []

# Добавление элементов в конец списка
items.append(1)
items.append(2)
print(items)  # Вывод: [1, 2]

# Вставка элемента по индексу
items.insert(1, 1.5)
print(items)  # Вывод: [1, 1.5, 2]

Удаление элементов

# Создаем список
items = [1, 2, 3, 4, 5]

# Удаление элемента по значению
items.remove(3)
print(items)  # Вывод: [1, 2, 4, 5]

# Удаление элемента по индексу
del items[1]
print(items)  # Вывод: [1, 4, 5]

# Извлечение последнего элемента
last_item = items.pop()
print(last_item)  # Вывод: 5
print(items)      # Вывод: [1, 4]

Работа с файлами

# Запись в файл
with open("example.txt", "w") as file:
    file.write("Hello, World!")

# Чтение из файла
with open("example.txt", "r") as file:
    content = file.read()
    print("Содержимое файла:", content)

Регулярные выражения

import re

pattern = r'\b[a-zA-Z]{4}\b'
text = "This is a test text with some four letter words like test and text."

matches = re.findall(pattern, text)
print(matches)

Исключения

Создание исключения

# Пользовательское исключение
class NegativeNumberError(Exception):
    """Исключение для обработки отрицательных чисел."""
    def __init__(self, message="Число не должно быть отрицательным"):
        self.message = message
        super().__init__(self.message)

def check_positive(number):
    if number < 0:
        # Throw (выброс исключения)
        raise NegativeNumberError(f"Ошибка: {number} является отрицательным числом!")
    return number

Обработка исключения

try:
    file = open('somefile.txt', 'r')
    content = file.read()
except FileNotFoundError:
    print("Ошибка: файл не найден!")
finally:
    file.close()
    print("Файл закрыт.")

Классы и объекты

Создание класса и объекта класса

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        return f"Меня зовут {self.name}, и мне {self.age} лет."

person = Person("Alice", 25)
print(person.introduce())

Наследование

# Базовый класс
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        raise NotImplementedError("Subclass must implement abstract method")

# Дочерний класс
class Dog(Animal):
    def speak(self):
        return f"{self.name} говорит: Гав-гав!"

# Дочерний класс
class Cat(Animal):
    def speak(self):
        return f"{self.name} говорит: Мяу!"

# Использование классов
dog = Dog("Шарик")
cat = Cat("Мурка")

print(dog.speak())  # Шарик говорит: Гав-гав!
print(cat.speak())  # Мурка говорит: Мяу!

Специальные методы классов

super()

Метод для вызова методов родительского класса в дочернем классе.

class Parent:
    def __init__(self):
        print("Parent init")

class Child(Parent):
    def __init__(self):
        super().__init__()
        print("Child init")

__init__()

Метод конструктор, который вызывается при создании объекта класса.

class MyClass:
    def __init__(self, value):
        self.value = value

__str__()

Метод, который вызывается для функции str() и print().

class MyClass:
    def __str__(self):
        return f"MyClass with value {self.value}

__repr__()

Метод, который вызывается для функции repr().

class MyClass:
    def __repr__(self):
        return f"MyClass({self.value})"

__call__()

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

class MyCallableClass:
    def __init__(self, value):
        self.value = value

    def __call__(self, increment):
        self.value += increment
        return self.value

# Создаем экземпляр класса
obj = MyCallableClass(10)

# Вызываем экземпляр как функцию
print(obj(5))  # Выведет: 15
print(obj(3))  # Выведет: 18

__del__()

Метод деструктор, который вызывается при удалении экземпляра

class FileHandler:
    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename, 'w')

    def write(self, data):
        self.file.write(data)

    def __del__(self):
        # Закрываем файл при удалении объекта
        if self.file:
            self.file.close()
            print(f'Файл {self.filename} закрыт.')

# Создаем экземпляр класса и записываем данные в файл
handler = FileHandler('example.txt')
handler.write('Hello, world!')

# Принудительно удаляем объект, чтобы вызвать __del__
del handler

# Проверяем, что файл закрыт
# Выведет: Файл example.txt закрыт.

__len__()

Метод, который возвращает длину объекта для функции len().

class MyCollection:
    def __len__(self):
        return len(self.items)

__getitem__(), __setitem__(), __delitem__()

__getitem__ – метод, который позволяет экземплярам класса использовать оператор индексирования

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

__delitem__ – метод который позволяет экземплярам класса удалять элементы по индексу.

class CustomList:
    def __init__(self, data=None):
        if data is None:
            self.data = []
        else:
            self.data = data

    def __getitem__(self, index):
        return self.data[index]

    def __setitem__(self, index, value):
        self.data[index] = value

    def __delitem__(self, index):
        del self.data[index]

    def __repr__(self):
        return repr(self.data)

# Создаем экземпляр класса CustomList
my_list = CustomList([10, 20, 30, 40, 50])

# Доступ к элементам по индексу
print(my_list[0])  # Выведет: 10
print(my_list[3])  # Выведет: 40

# Присваивание значений по индексу
my_list[1] = 25
print(my_list)  # Выведет: [10, 25, 30, 40, 50]

# Удаление элементов по индексу
del my_list[2]
print(my_list)  # Выведет: [10, 25, 40, 50]

# Удаление элементов по срезу
del my_list[1:3]
print(my_list)  # Выведет: [10, 50]

__iter__ + __next__

__iter__ – метод, который возвращает итератор объекта.

__next__ – метод, который возвращает следующий элемент итератора.

class MyRangeIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.end:
            current = self.current
            self.current += 1
            return current
        else:
            raise StopIteration

class MyRange:
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        return MyRangeIterator(self.start, self.end)

# Пример использования
my_range = MyRange(1, 5)
for num in my_range:
    print(num)

__enter__() и __exit__()

Методы для менеджеров контекста с with-оператором

class ManagedFile:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()

# Пример использования
with ManagedFile('example.txt', 'w') as f:
    f.write('Hello, world!')

# После выполнения блока 'with' файл будет автоматически закрыт

Модули

Использование модуля

# Импорт модуля
import math

# Использование функции из модуля
print("Квадратный корень из 16:", math.sqrt(16))

Создание пакетов

# Структура пакета
# my_package/
# ├── __init__.py
# ├── module1.py
# └── module2.py

# __init__.py
from .module1 import func1
from .module2 import func2

# module1.py
def func1():
    return "Hello from module1"

# module2.py
def func2():
    return "Hello from module2"

# main.py
from my_package import func1, func2

print(func1())
print(func2())

Списковые включения (List comprehensions)

# Генерация списка квадратов чисел от 0 до 9
squares = [x ** 2 for x in range(10)]
print("Квадраты чисел от 0 до 9:", squares)

Декораторы

def my_decorator(func):
    def wrapper():
        print("Что-то делаем до функции")
        func()
        print("Что-то делаем после функции")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

Генераторы

def my_generator():
    for i in range(3):
        yield i

gen = my_generator()
for value in gen:
    print(value)

Менеджер контекста

class MyContextManager:
    def __enter__(self):
        print("Входим в контекст")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("Выходим из контекста")

with MyContextManager():
    print("Внутри контекста")

Замыкания

def outer_function(msg):
    def inner_function():
        print(msg)
    return inner_function

closure = outer_function("Hello from closure!")
closure()

Асинхронное программирование

import asyncio

async def my_coroutine():
    print("Начало")
    await asyncio.sleep(1)
    print("Конец")

async def main():
    await asyncio.gather(my_coroutine(), my_coroutine())

asyncio.run(main())

Многопоточность и многопроцессорность

import threading
import multiprocessing

def worker():
    print("Работа в потоке")

# Многопоточность
thread = threading.Thread(target=worker)
thread.start()
thread.join()

# Многопроцессорность
process = multiprocessing.Process(target=worker)
process.start()
process.join()