PyCode
22 subscribers
22 photos
43 links
Добро пожаловать на PyCode! Здесь мы вместе шаг за шагом изучаем основы языка программирования Python. От простых понятий до продвинутых тем, каждый урок будет наполнен понятными объяснениями, практическими примерами и, конечно же, юмором!
Download Telegram
👩‍💻Что такое ООП в Python?

Объектно-ориентированное программирование (ООП) — это подход к программированию, который строится вокруг объектов. Каждый объект в ООП содержит данные (называемые атрибутами) и функции для работы с этими данными (называемые методами). Python поддерживает ООП, что позволяет писать гибкий и структурированный код.

🚽Зачем нужно ООП? ООП помогает:
Структурировать код: Упрощает управление большими проектами, так как позволяет организовать данные и логику в одном месте — внутри объектов.
Повторно использовать код: Понятие наследования позволяет создать общие шаблоны (классы) и расширять их для специфических задач.
Работать с реальными сущностями: ООП позволяет моделировать реальные объекты и взаимодействия между ними.

❗️Основные понятия ООП:
Класс: Шаблон для создания объектов. Класс определяет, какие атрибуты и методы будет иметь объект.
Пример: класс Car может описывать атрибуты (цвет, модель) и методы (ездить, тормозить).Объект: Экземпляр класса, представляющий конкретную сущность.
class Car:
def __init__(self, brand, color):
self.brand = brand # Атрибуты
self.color = color

def drive(self): # Метод
print(f"{self.color} {self.brand} едет!")

# Создаем объект (экземпляр класса)
my_car = Car("Tesla", "красная")
my_car.drive() # Вывод: красная Tesla едет!

В этом примере:
Car — это класс, который описывает автомобиль.
Метод init() — это конструктор, который вызывается при создании объекта, чтобы инициализировать атрибуты объекта.drive() — метод, который выполняет действие "ехать".

ООП в Python помогает писать код, который легко расширять, поддерживать и использовать повторно. С его помощью вы можете строить сложные системы, разбивая их на более мелкие и понятные части.
#PyLearn #ООП

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻3
👨‍💻3
👩‍💻Основные типы данных в Python

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

💡Неизменяемые. Это значит, что строку нельзя изменить после её создания. Если нужно изменить строку, создаётся новая.
Числа: Целые числа (int), Числа с плавающей точкой (float)
Строки (str): Последовательность символов, представляющая текст (например, "Hello, World!")
Кортежи (tuple): Похожи на списки, но неизменяемые (например, (1, 2, 3))

👀Изменяемые типы данных можно модифицировать после их создания — изменять значения, добавлять или удалять элементы.
Списки (list): Последовательность элементов, которая может содержать объекты разных типов (например, [1, 2, "hello"])
Множества (set): Набор уникальных элементов (например, {1, 2, 3}). Порядок элементов не гарантируется.
Словари (dict): Набор пар "ключ: значение" (например, {"name": "Alice", "age": 25}).

😵‍💫Где удобно применять
Строки: Подходят для хранения и обработки текста, сообщений, логов
Списки: Идеальны для хранения изменяемых последовательностей данных. Например, список товаров, чисел или пользователей.
Кортежи: Подходят, когда данные не должны изменяться. Например, координаты или настройки, которые должны быть неизменны.
Множества: Удобны для хранения уникальных элементов и быстрых проверок наличия элементов.
Словари: Полезны, когда нужно хранить данные в виде пар "ключ: значение".

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

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻3
👍2👨‍💻2
👩‍💻Магические методы в ООП Python

🥺Что это и для чего они нужны?
Магические методы (или "специальные методы") — это особые методы в Python, которые начинаются и заканчиваются двойным подчеркиванием (например, init, str).
Они позволяют вам определять поведение объектов ваших классов при выполнении стандартных операций, таких как:
Инициализация (init)
Сравнение (eq, lt)
Арифметические операции (add, sub)
Преобразование в строку (str, repr)
Итерация (iter, next)

Давайте разберем на примере, как магические методы могут определять поведение экземпляра класса (далее ЭК):
class Car:
def __init__(self, car_model): # описываем поведение ЭК с аргументами
self.car_model = car_model # присваиваем ЭК переданный аргумент

def __str__(self): # описываем поведение при функции print
return f'Модель автомобиля - {self.car_model}'

def __call__(self): # описываем поведение ЭК при его вызове
print(f'Вы завели автомобиль')

car = Car('Tesla')
print(car) # Модель автомобиля - Tesla
car() # Вы завели автомобиль


👍Таким образом, мы можем описать поведение нашего ЭК. Магические методы позволяют сделать классы Python мощными и гибкими. Они позволяют интегрировать ваши объекты в систему языка на уровне базовых операций, делая их поведение более предсказуемым и удобным.
#PyLearn #ООП

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻2
👩‍💻Итераторы и генераторы в Python

☄️Итераторы и генераторы — важные инструменты в Python, которые позволяют работать с последовательностями данных более эффективно. Они помогают обрабатывать данные по одному элементу за раз, не загружая всю коллекцию в память.

💡Итератор — это объект, который позволяет перебирать элементы одной за другой. Любой объект, поддерживающий протокол итераций, должен реализовать методы:
iter(): Возвращает сам итератор
next(): Возвращает следующий элемент последовательности или вызывает исключение StopIteration, когда элементы заканчиваются.

Пример создания итератора:
class MyIterator:
def __init__(self, start, end):
self.current = start
self.end = end

def __iter__(self):
return self

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

my_iter = MyIterator(0, 3)
for num in my_iter:
print(num) # 1 2


✨Генераторы — это особый вид итераторов, которые упрощают создание итераторов. Они автоматически поддерживают протокол итерации и создаются с помощью ключевого слова yield. В отличие от обычных функций, которые возвращают результат и завершаются, генераторы "приостанавливают" своё выполнение и "возвращаются" в то место, где остановились, при следующем вызове.

Пример генератора:
def my_generator(start, end):
while start < end:
yield start
start += 1

for num in my_generator(0, 3):
print(num) # 1 2


👀Итераторы и генераторы — это инструменты, которые позволяют обрабатывать данные "лениво", экономя память и делая код более производительным. Итераторы требуют больше кода для реализации, тогда как генераторы позволяют реализовать то же самое гораздо проще.
😃Эта тема может показаться бесполезной, но будьте уверены, что вас спросят об этом на собеседовании
#PyLearn

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻3
👩‍💻Основные принципы ООП: Наследование (1/3)

❓Что такое наследование?
Наследование позволяет создавать новые классы на основе уже существующих, заимствуя у них функционал и добавляя новый. Класс, который наследует другой класс, называется дочерним (или подклассом), а класс, от которого идёт наследование, — родительским (или базовым).

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

💡Представьте, что у нас есть базовый класс Animal, который содержит общие атрибуты и методы для всех животных, такие как move() (двигаться) или sleep() (спать). Дочерние классы, такие как Dog или Cat, могут наследовать эти методы, а также добавлять свои уникальные.

class Animal:
def move(self):
print("Животное двигается")

class Dog(Animal):
def bark(self):
print("Собака лает")

dog = Dog()
dog.move() # Животное двигается

Здесь Dog наследует поведение от Animal, но может также иметь свои собственные методы, как bark().

🥺Зачем нужно наследование?
Повторное использование кода: Вместо того чтобы писать одинаковый код для нескольких классов, можно вынести общую логику в родительский класс и наследовать её.
Упрощение структуры программы: Наследование позволяет организовать классы в иерархическую структуру, что делает код более логичным и структурированным.
Расширяемость: Дочерние классы могут переопределять или расширять функционал родительского класса, адаптируя его под свои нужды.

😵‍💫В Python класс может наследовать от нескольких родительских классов одновременно, однако это может усложнить код и сделать его менее понятным (для более подробного изучения этого механизма вам стоит изучить ознакомиться с механизмом MRO)
#PyLearn #ООП

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻2
👨‍💻1
👨‍💻3
👩‍💻Как работают try, except, finally и else в Python

🚽Что такое обработка исключений?
Когда возникает ошибка, Python генерирует исключение. Если это исключение не обработано, программа завершится с ошибкой. Блоки try-except позволяют вам "ловить" такие ошибки и обрабатывать их, не прерывая выполнение программы.

🥺Как работает try и except?
В блоке try помещается код, который может вызвать ошибку. Если ошибка возникает, программа переходит в блок except, где вы можете её обработать.

try:
result = 10 / 0
except ZeroDivisionError as error:
print("Ошибка: деление на ноль невозможно")
print(f"Пойманная ошибка - {error}") # python позволяет поместить пойманную ошибку в переменную

В этом примере, когда возникает ошибка ZeroDivisionError (деление на ноль), программа не завершится с аварией, а перейдёт к блоку except и выведет сообщение.

💡Блок except позволяет обрабатывать как конкретные ошибки, так и абсолютно любые
try:
# кусок кода, который может вызвать ошибку
except:
# код зайдет в блок except при любом искючении


👀Зачем нужны блоки finally и else?
Блок finally выполняется всегда, независимо от того, произошло исключение или нет. Он используется для выполнения завершающих действий, таких как освобождение ресурсов, закрытие файлов или завершение операций, которые должны быть выполнены в любом случае.
Блок else выполняется только если ошибок не возникло в блоке try. Это полезно, когда нужно выполнить действия, которые зависят от успешного выполнения кода в блоке try, но они сами по себе не должны обрабатываться в блоке except.

💻Конструкция try-except позволяют программам не падать при возникновении ошибок и дают возможность контролировать их поведение. Использование этих механизмов помогает предотвратить аварийные завершения программы и обеспечивает правильное освобождение ресурсов.
#PyLearn

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻2
👨‍💻1
👩‍💻f-строки в Python

💡f-строки (или форматированные строки) — это один из самых удобных способов форматировать строки в Python. Они были введены в версии 3.6 и значительно упростили подстановку переменных и выражений в текст. Форматирование с помощью f-строк читается проще, быстрее пишется и зачастую работает эффективнее по сравнению с другими методами.

☄️Для создания f-строки перед открывающей кавычкой добавляется символ f, а внутри строки в фигурных скобках {} можно вставлять переменные и выражения.
x = 10
y = 20
print(f"Сумма {x} и {y} равна {x + y}") # Сумма 10 и 20 равна 30


🥺Сравнение с str.format():
name = "PyCode"
age = 5

# Старый метод format
formatted_string = "Привет, {0}, тебе {1} лет.".format(name, age)

# f-строка
formatted_string = f"Привет, {name}, тебе {age} лет."

С f-строками нет необходимости отслеживать порядок подстановок — код становится более читаемым и интуитивным.

❗️Полезные возможности f-строк:
Округление чисел: Можно легко управлять форматированием чисел прямо в f-строке.
pi = 3.14159
print(f"Число π: {pi:.2f}") # Вывод: Число π: 3.14


Вызов функций: Внутри f-строки можно вызывать функции и методы.
name = "pycode"
print(f"Имя в верхнем регистре: {name.upper()}") # Вывод: Имя в верхнем регистре: PYCODE


📖Использование f-строк упрощает работу с форматированием строк, делает код чище и быстрее. Это важный инструмент для любого Python-разработчика.
#PyLearn

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻2
👩‍💻Функция enumerate

💡Когда ты итерируешься по списку и тебе нужно не только значение, но и его индекс, используй enumerate(). Этот метод возвращает пару: индекс и элемент, упрощая работу с циклами.
Пример:
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")


Вывод:
0: apple
1: banana
2: cherry


💻Это помогает сделать код чище и избавляет от необходимости вручную отслеживать индексы!
#PyTips

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻3
👨‍💻1
👩‍💻Аргументы в функциях

👍В Python существует несколько способов передавать данные в функции с помощью аргументов.
Разберём основные виды: позиционные, именованные, а также специальные аргументы *args и **kwargs (но их разберем чуть позже).

👀Позиционные аргументы
Это аргументы, которые передаются в функцию в определённом порядке. Важно, чтобы порядок их следования совпадал с порядком, в котором они указаны в определении функции.
def greet(name, age):
print(f"Привет, {name}! Тебе {age} лет.")

greet('Alex', 25) # Позиционные аргументы

Здесь, 'Alex' передаётся параметру name, а 25 — параметру age. Если поменять порядок аргументов при вызове функции, результат будет некорректным.

💻Именованные аргументы
Именованные аргументы позволяют явно указывать, какому параметру соответствует передаваемое значение. Это особенно полезно, когда у функции много параметров, или вы хотите передать значения не в порядке их объявления.
    print(f"Привет, {name}! Тебе {age} лет.")

pythongreet(age=25, name='Alex')

В данном случае порядок передачи не важен, так как каждый аргумент явно сопоставляется с именем параметра.

💡Аргументы по умолчанию
Если вы хотите сделать какой-то аргумент необязательным, можно задать для него значение по умолчанию. Тогда, если при вызове функции этот аргумент не будет указан, будет использовано значение по умолчанию.
def greet(name, age=30):
print(f"Привет, {name}. Тебе {age} лет.")

greet('Alex') # age будет 30 по умолчанию


🤩Понимание различных типов аргументов помогает писать гибкие и универсальные функции.
#PyLearn

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻3
👩‍💻Функция zip() для объединения коллекций

🏎Функция zip() позволяет объединить несколько последовательностей (списки, кортежи) в один итератор, создавая из элементов кортежи.
Пример:
names = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f"{name}: {score}")


Вывод:
Alice: 85
Bob: 92
Charlie: 78


✨Это удобно, если нужно итерироваться по нескольким спискам одновременно.
#PyTips

🐍Питай код с PyCode
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻4