🤔 Что такое объект первого класса?
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).
🚩Почему это важно?
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
🚩Пример на Python
Присваивание функции переменной
Передача функции как аргумента
Возврат функции из функции
Ставь 👍 и забирай 📚 Базу знаний
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).
🚩Почему это важно?
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
🚩Пример на Python
Присваивание функции переменной
def say_hello():
return "Hello!"
# Функция присваивается переменной
greet = say_hello
print(greet()) # Вывод: Hello!
Передача функции как аргумента
def apply_function(func, value):
return func(value)
def square(x):
return x * x
result = apply_function(square, 5)
print(result) # Вывод: 25
Возврат функции из функции
def multiplier(n):
def multiply(x):
return x * n
return multiply
double = multiplier(2)
print(double(10)) # Вывод: 20
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Откуда берётся O(n) и почему это лучше, чем O(n²)?
O(n) означает, что время выполнения пропорционально количеству элементов. O(n²) — значит, число операций растёт квадратично. Например, при 1 000 элементах:
- O(n) ≈ 1 000 операций;
- O(n²) ≈ 1 000 000 операций.
Поэтому линейная сложность значительно быстрее при больших объёмах данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
O(n) означает, что время выполнения пропорционально количеству элементов. O(n²) — значит, число операций растёт квадратично. Например, при 1 000 элементах:
- O(n) ≈ 1 000 операций;
- O(n²) ≈ 1 000 000 операций.
Поэтому линейная сложность значительно быстрее при больших объёмах данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3💊2
🤔 Что такое пакет?
Пакет (
🚩Как создать пакет?
Допустим, мы хотим создать пакет
Код в
Код в
Код в
Теперь можно импортировать функции прямо из пакета:
🚩Импорт модулей из пакета
Импортируем весь пакет (с
Импортируем конкретный модуль
Импортируем конкретную функцию из модуля
🚩Как работают пакеты в Python?
Python ищет пакеты по
Если Python не находит пакет, можно добавить путь вручную:
Можно создавать вложенные пакеты
Импорт:
Ставь 👍 и забирай 📚 Базу знаний
Пакет (
package) в Python — это набор модулей, объединённых в одну директорию. Главное отличие от обычной папки — наличие файла __init__.py, который делает директорию пакетом. 🚩Как создать пакет?
Допустим, мы хотим создать пакет
math_utils с модулями для работы с числами. /my_project
/math_utils ← Это пакет
__init__.py ← Делаем директорию пакетом
arithmetic.py ← Модуль с функциями сложения/вычитания
geometry.py ← Модуль с функциями для работы с фигурами
main.py ← Основной файл программы
Код в
arithmetic.pydef add(a, b):
return a + b
def subtract(a, b):
return a - b
Код в
geometry.py def square_area(side):
return side * side
Код в
__init__.py from .arithmetic import add, subtract
from .geometry import square_area
Теперь можно импортировать функции прямо из пакета:
from math_utils import add, square_area
print(add(2, 3)) # 5
print(square_area(4)) # 16
🚩Импорт модулей из пакета
Импортируем весь пакет (с
__init__.py) from math_utils import add, square_area
Импортируем конкретный модуль
from math_utils import arithmetic
print(arithmetic.add(3, 5))
Импортируем конкретную функцию из модуля
from math_utils.arithmetic import add
print(add(3, 5))
🚩Как работают пакеты в Python?
Python ищет пакеты по
sys.path import sys
print(sys.path) # Пути, где Python ищет модули
Если Python не находит пакет, можно добавить путь вручную:
import sys
sys.path.append("/path/to/my_project")
Можно создавать вложенные пакеты
/my_project
/math_utils
__init__.py
/advanced
__init__.py
calculus.py
Импорт:
from math_utils.advanced.calculus import derivative
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Как можно сделать копию словаря?
Существует несколько способов создать копию словаря:
1. Метод copy()
2. Через dict()
3. С использованием copy.deepcopy() — если словарь вложенный
Обычная копия (copy()) создаёт поверхностную копию, то есть вложенные объекты по-прежнему ссылаются на те же структуры.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Существует несколько способов создать копию словаря:
1. Метод copy()
2. Через dict()
3. С использованием copy.deepcopy() — если словарь вложенный
Обычная копия (copy()) создаёт поверхностную копию, то есть вложенные объекты по-прежнему ссылаются на те же структуры.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Как происходит наследование моделей в Django?
В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования:
🟠Абстрактные модели
Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных.
Создается базовый класс с
Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
🟠Многоуровневое (конкретное) наследование
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает
🟠Прокси-модели (Proxy Models)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В
Можно переопределять методы, добавлять новые, но не менять поля.
Ставь 👍 и забирай 📚 Базу знаний
В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования:
🟠Абстрактные модели
Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных.
Создается базовый класс с
abstract = True в Meta.Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
from django.db import models
class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True # Указывает, что это абстрактная модель
class Post(BaseModel):
title = models.CharField(max_length=255)
content = models.TextField()
class Comment(BaseModel):
text = models.TextField()
🟠Многоуровневое (конкретное) наследование
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает
OneToOneField на родительскую.class Person(models.Model):
name = models.CharField(max_length=255)
class Employee(Person): # Отдельная таблица employee
salary = models.DecimalField(max_digits=10, decimal_places=2)
🟠Прокси-модели (Proxy Models)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В
Meta указывается proxy = True.Можно переопределять методы, добавлять новые, но не менять поля.
class Person(models.Model):
name = models.CharField(max_length=255)
class Manager(Person):
class Meta:
proxy = True # Указываем, что это прокси-модель
def get_uppercase_name(self):
return self.name.upper()
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Чем массивы отличаются от списков?
- Массивы (например, в array или C) — это однородные структуры, где все элементы одного типа и известны по размеру;
- Списки в Python — это динамические массивы произвольных объектов, могут содержать разные типы данных, и автоматически расширяются при необходимости.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Массивы (например, в array или C) — это однородные структуры, где все элементы одного типа и известны по размеру;
- Списки в Python — это динамические массивы произвольных объектов, могут содержать разные типы данных, и автоматически расширяются при необходимости.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥2👍1
🤔 Что такое класс baseview?
🚩Зачем нужен `BaseView`?
Обеспечивает общую структуру для классов-представлений.
Разделяет логику обработки запроса и рендеринг.
Позволяет переопределять логику обработки запросов через
Является родительским классом для
🚩Как работает `BaseView`?
Этот класс сам по себе не обрабатывает запросы. Он лишь задаёт каркас для представлений.
🚩Использование `BaseView`
Обычно мы используем
Ставь 👍 и забирай 📚 Базу знаний
BaseView — это базовый класс представления (view) в Django, который предоставляет основу для создания представлений без жёсткой привязки к HTTP-методам (GET, POST и др.). Он является родительским классом для всех классов-представлений (CBV, Class-Based Views) в Django. 🚩Зачем нужен `BaseView`?
Обеспечивает общую структуру для классов-представлений.
Разделяет логику обработки запроса и рендеринг.
Позволяет переопределять логику обработки запросов через
dispatch(). Является родительским классом для
View, TemplateView, ListView и других CBV. 🚩Как работает `BaseView`?
Этот класс сам по себе не обрабатывает запросы. Он лишь задаёт каркас для представлений.
from django.views import View
class BaseView:
def dispatch(self, request, *args, **kwargs):
"""Определяет, какой метод (GET, POST и т. д.) вызывать"""
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
return handler(request, *args, **kwargs)
def http_method_not_allowed(self, request, *args, **kwargs):
"""Обработчик для неподдерживаемых HTTP-методов"""
return HttpResponseNotAllowed(self._allowed_methods())
🚩Использование `BaseView`
Обычно мы используем
View, который наследуется от BaseView. from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
return HttpResponse("Это GET-запрос")
def post(self, request):
return HttpResponse("Это POST-запрос")
Ставь 👍 и забирай 📚 Базу знаний
🤔 Как соединить список строк в одну?
Используется метод join, который объединяет строки с заданным разделителем. Это более эффективный и гибкий способ, чем сложение строк.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Используется метод join, который объединяет строки с заданным разделителем. Это более эффективный и гибкий способ, чем сложение строк.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как в питоне реализуется многопоточность. Какими модулями?
Многопоточность в Python реализуется с помощью модуля
🟠Модуль `threading` (многопоточность, но с GIL)
Модуль
Вывод
🟠Модуль `multiprocessing` (настоящая параллельность)
В отличие от
🟠Модуль `concurrent.futures` (более удобный API)
Этот модуль позволяет легко управлять потоками (
Пример
🟠Модуль `asyncio` (асинхронность, не потоки!)
Модуль
Ставь 👍 и забирай 📚 Базу знаний
Многопоточность в Python реализуется с помощью модуля
threading, но из-за GIL (Global Interpreter Lock) потоки не могут выполняться параллельно на нескольких ядрах. 🟠Модуль `threading` (многопоточность, но с GIL)
Модуль
threading позволяет запускать несколько потоков (threads) в одном процессе. import threading
import time
def task(name):
print(f"{name} начал работу")
time.sleep(2) # Имитация задержки
print(f"{name} завершил работу")
# Создаём два потока
t1 = threading.Thread(target=task, args=("Поток 1",))
t2 = threading.Thread(target=task, args=("Поток 2",))
t1.start()
t2.start()
t1.join()
t2.join()
print("Все потоки завершены")
Вывод
Поток 1 начал работу
Поток 2 начал работу
(пауза 2 секунды)
Поток 1 завершил работу
Поток 2 завершил работу
Все потоки завершены
🟠Модуль `multiprocessing` (настоящая параллельность)
В отличие от
threading, модуль multiprocessing создаёт отдельные процессы, которые могут выполняться на разных ядрах процессора. import multiprocessing
import time
def task(name):
print(f"{name} начал работу")
time.sleep(2)
print(f"{name} завершил работу")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=task, args=("Процесс 1",))
p2 = multiprocessing.Process(target=task, args=("Процесс 2",))
p1.start()
p2.start()
p1.join()
p2.join()
print("Все процессы завершены")
🟠Модуль `concurrent.futures` (более удобный API)
Этот модуль позволяет легко управлять потоками (
ThreadPoolExecutor) и процессами (ProcessPoolExecutor). from concurrent.futures import ThreadPoolExecutor
import time
def task(n):
time.sleep(2)
return f"Готово: {n}"
with ThreadPoolExecutor(max_workers=2) as executor:
results = executor.map(task, [1, 2, 3])
for result in results:
print(result)
Пример
ProcessPoolExecutor (процессы)from concurrent.futures import ProcessPoolExecutor
def square(n):
return n * n
with ProcessPoolExecutor() as executor:
results = executor.map(square, [1, 2, 3, 4])
print(list(results)) # [1, 4, 9, 16]
🟠Модуль `asyncio` (асинхронность, не потоки!)
Модуль
asyncio не создаёт потоки или процессы, а работает через "корутины" и цикл событий (event loop). import asyncio
async def task():
print("Начало")
await asyncio.sleep(2) # Не блокирует другие задачи
print("Конец")
async def main():
await asyncio.gather(task(), task())
asyncio.run(main())
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое Apache Airflow?
Apache Airflow — это платформа для оркестрации рабочих процессов (workflow), особенно в задачах обработки данных. Она позволяет описывать пайплайны в виде DAG (направленного графа задач), управлять зависимостями, планировать и отслеживать выполнение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Apache Airflow — это платформа для оркестрации рабочих процессов (workflow), особенно в задачах обработки данных. Она позволяет описывать пайплайны в виде DAG (направленного графа задач), управлять зависимостями, планировать и отслеживать выполнение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥1
🤔 Что такое git stash?
🚩Когда это полезно?
Нужно переключиться на другую ветку, но есть незаконченные изменения. Хочешь сохранить текущую работу, но не коммитить её. Нужно экспериментировать, но без риска потерять код.
🚩Как использовать `git stash`?
Сохранить изменения в
Посмотреть список сохранённых изменений
Выведет список всех
Восстановить сохранённые изменения
ИЛИ
Удалить
🚩Пример использования
Сценарий
- Ты работаешь в ветке
- У тебя есть изменения, которые ты не хочешь коммитить.
Решение
Ставь 👍 и забирай 📚 Базу знаний
git stash — это команда в Git, которая сохраняет незакоммиченные изменения во временное хранилище (stash) и очищает рабочую директорию. 🚩Когда это полезно?
Нужно переключиться на другую ветку, но есть незаконченные изменения. Хочешь сохранить текущую работу, но не коммитить её. Нужно экспериментировать, но без риска потерять код.
🚩Как использовать `git stash`?
Сохранить изменения в
stash git stash
Посмотреть список сохранённых изменений
git stash list
Выведет список всех
stash-ов stash@{0}: WIP on main: 1234567 Добавил новую фичу
stash@{1}: WIP on dev: 89abcde Исправил багВосстановить сохранённые изменения
git stash pop # Восстановит изменения и удалит stash
ИЛИ
git stash apply # Восстановит, но stash останется в списке
Удалить
stash после применения git stash drop stash@{0} # Удалит конкретный stash
git stash clear # Удалит все stash'и🚩Пример использования
Сценарий
- Ты работаешь в ветке
main, но нужно срочно переключиться на dev. - У тебя есть изменения, которые ты не хочешь коммитить.
Решение
git stash # Сохраняем изменения
git checkout dev # Переключаемся на другую ветку
# Делаем нужную работу...
git checkout main # Возвращаемся в основную ветку
git stash pop # Восстанавливаем изменения
Ставь 👍 и забирай 📚 Базу знаний
🔥2
🤔 Что такое курсор и зачем он нужен?
Курсор — это механизм построчного чтения данных из результата запроса. Используется, когда:
- нужно обрабатывать большие объемы данных постепенно;
- необходима пошаговая обработка внутри хранимой процедуры или скрипта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Курсор — это механизм построчного чтения данных из результата запроса. Используется, когда:
- нужно обрабатывать большие объемы данных постепенно;
- необходима пошаговая обработка внутри хранимой процедуры или скрипта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое деструктор класса?
Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В Python этот метод называется
🚩Определение и использование деструктора
Определяется внутри класса с помощью метода
🟠Класс
🟠Метод
🟠Деструктор
🚩Создание и уничтожение объекта
Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
🚩Важные замечания
🟠Сборка мусора
Python использует механизм сборки мусора для автоматического управления памятью. Когда объект больше не используется (например, нет активных ссылок на него), сборщик мусора удаляет объект и вызывает его деструктор.
🟠Неопределенное время вызова
Точное время вызова деструктора зависит от работы сборщика мусора. Это означает, что нельзя гарантировать момент вызова деструктора. Поэтому для критических операций лучше использовать явное управление ресурсами, например, с помощью контекстных менеджеров (
🟠Контекстные менеджеры
Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
Ставь 👍 и забирай 📚 Базу знаний
Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В Python этот метод называется
__del__(). Деструктор используется для выполнения операций очистки, таких как освобождение ресурсов или выполнение завершающих действий перед тем, как объект будет удален из памяти.🚩Определение и использование деструктора
Определяется внутри класса с помощью метода
__del__(). class FileManager:
def __init__(self, filename):
self.file = open(filename, 'w')
print(f"Файл {filename} открыт для записи.")
def write_data(self, data):
self.file.write(data)
def __del__(self):
self.file.close()
print("Файл закрыт.")
🟠Класс
FileManager имеет конструктор __init__(), который открывает файл для записи.🟠Метод
write_data() записывает данные в файл.🟠Деструктор
__del__() закрывает файл, когда объект FileManager уничтожается.🚩Создание и уничтожение объекта
Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
manager = FileManager('example.txt')
manager.write_data('Hello, world!')
# Когда объект manager больше не нужен, вызывается деструктор и файл закрывается🚩Важные замечания
🟠Сборка мусора
Python использует механизм сборки мусора для автоматического управления памятью. Когда объект больше не используется (например, нет активных ссылок на него), сборщик мусора удаляет объект и вызывает его деструктор.
🟠Неопределенное время вызова
Точное время вызова деструктора зависит от работы сборщика мусора. Это означает, что нельзя гарантировать момент вызова деструктора. Поэтому для критических операций лучше использовать явное управление ресурсами, например, с помощью контекстных менеджеров (
with).🟠Контекстные менеджеры
Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Файл автоматически закрывается после выхода из блока withСтавь 👍 и забирай 📚 Базу знаний
🤔 Как в одной команде проиндексировать все файлы и добавить коммит?
Это делается одной строкой, в которой последовательно добавляются все файлы в индекс и сразу создаётся коммит. Такой приём используется для быстрого фиксации всех изменений без необходимости вручную указывать файлы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это делается одной строкой, в которой последовательно добавляются все файлы в индекс и сразу создаётся коммит. Такой приём используется для быстрого фиксации всех изменений без необходимости вручную указывать файлы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊11🤔1
🔥 Скрытые вакансии с удаленной работой для Python разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров.
🔹 Python Jobs | Вакансии
🔹 Data Science ML | Вакансии
🔹 Golang Go Jobs | Вакансии
🔸 Все каналы с вакансиями
🔹 Python Jobs | Вакансии
🔹 Data Science ML | Вакансии
🔹 Golang Go Jobs | Вакансии
🔸 Все каналы с вакансиями
💊1
🤔 Что такое Host?
Host (хост) — это устройство или сервер, подключённый к сети, который может предоставлять или запрашивать данные.
🚩Где используется `Host`?
🟠В HTTP-запросах (заголовок `Host`)
Когда браузер запрашивает сайт, он отправляет заголовок
🟠В настройке DNS и доменных имён
Host — это доменное имя, привязанное к IP-адресу.
-
-
🟠3. В локальной сети (локальные хосты)
Внутри сети устройства тоже считаются хостами (
Ставь 👍 и забирай 📚 Базу знаний
Host (хост) — это устройство или сервер, подключённый к сети, который может предоставлять или запрашивать данные.
GET /index.html HTTP/1.1
Host: example.com
🚩Где используется `Host`?
🟠В HTTP-запросах (заголовок `Host`)
Когда браузер запрашивает сайт, он отправляет заголовок
Host, чтобы сервер знал, какой сайт нужно отдать. GET / HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0
🟠В настройке DNS и доменных имён
Host — это доменное имя, привязанное к IP-адресу.
-
example.com → 192.168.1.100 -
mail.example.com → 192.168.1.101 127.0.0.1 mysite.local
🟠3. В локальной сети (локальные хосты)
Внутри сети устройства тоже считаются хостами (
192.168.1.10, 192.168.1.20). localhost (127.0.0.1) — это всегда локальный компьютер.Ставь 👍 и забирай 📚 Базу знаний
🤔 Как реализуются метод объекта?
1. Методы объекта определяются внутри класса и автоматически получают ссылку на текущий объект в виде аргумента self.
2. Они могут обращаться к атрибутам объекта и вызывать другие методы через self.
3. Пример: def example_method(self): предоставляет доступ к объекту, на котором вызван метод.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Методы объекта определяются внутри класса и автоматически получают ссылку на текущий объект в виде аргумента self.
2. Они могут обращаться к атрибутам объекта и вызывать другие методы через self.
3. Пример: def example_method(self): предоставляет доступ к объекту, на котором вызван метод.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊2
🤔 В чем отличия pytz от datetime?
🟠`datetime` – встроенный модуль Python
Модуль
🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека
🚩Как работать с часовыми поясами правильно?
Создание
Конвертация времени между часовыми поясами
Использование UTC (лучший подход для серверов)
Ставь 👍 и забирай 📚 Базу знаний
🟠`datetime` – встроенный модуль Python
Модуль
datetime позволяет работать с датами и временем, но по умолчанию он не поддерживает часовые пояса.from datetime import datetime
dt = datetime.now() # Получаем текущую дату и время
print(dt) # Например: 2024-02-28 14:30:00.123456
print(dt.tzinfo) # None (нет информации о часовом поясе)
🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека
pytz добавляет поддержку часовых поясов и позволяет работать с разными временными зонами. from datetime import datetime
import pytz
tz = pytz.timezone("Europe/Moscow") # Часовой пояс Москвы
dt = datetime.now(tz) # Получаем текущее время с учетом часового пояса
print(dt) # Например: 2024-02-28 17:30:00+03:00
print(dt.tzinfo) # Europe/Moscow
🚩Как работать с часовыми поясами правильно?
Создание
datetime с часовым поясом pytz dt = datetime(2024, 2, 28, 15, 0) # Наивная дата
tz = pytz.timezone("Europe/Moscow")
dt = tz.localize(dt) # Присваиваем часовой пояс
print(dt) # 2024-02-28 15:00:00+03:00
Конвертация времени между часовыми поясами
ny_tz = pytz.timezone("America/New_York")
ny_time = dt.astimezone(ny_tz)
print(ny_time) # Конвертированное время в Нью-ЙоркеИспользование UTC (лучший подход для серверов)
utc_now = datetime.now(pytz.UTC) # Текущее время в UTC
print(utc_now) # Например: 2024-02-28 14:30:00+00:00
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Как устроен словарь?
Словарь (dict) реализован как хеш-таблица. Ключи хешируются с помощью hash() и связываются с соответствующим значением.
Доступ к элементам происходит быстро (в среднем за O(1)).
Ключи должны быть хешируемыми (обычно неизменяемыми типами).
С Python 3.7+ порядок вставки элементов сохраняется.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Словарь (dict) реализован как хеш-таблица. Ключи хешируются с помощью hash() и связываются с соответствующим значением.
Доступ к элементам происходит быстро (в среднем за O(1)).
Ключи должны быть хешируемыми (обычно неизменяемыми типами).
С Python 3.7+ порядок вставки элементов сохраняется.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Как в Python происходит поиск переменной по области видимости?
В Python поиск переменной происходит по правилу LEGB, которое определяет порядок поиска в четырёх областях видимости:
Пример работы LEGB
Вывод
🚩Глобальные переменные (`global`)
Если нужно изменить глобальную переменную внутри функции, используем
🚩Переменные из внешней функции (`nonlocal`)
Если в вложенной функции нужно изменить переменную из enclosing-области, используем
🚩Что если переменная отсутствует во всех областях?
Если переменная не найдена в LEGB, Python выдаст
Ошибка
🚩`Built-in` — встроенные функции
Python в последнюю очереде проверяет встроенные функции (
Ставь 👍 и забирай 📚 Базу знаний
В Python поиск переменной происходит по правилу LEGB, которое определяет порядок поиска в четырёх областях видимости:
Пример работы LEGB
x = "глобальная" # Global
def outer():
x = "охватывающая" # Enclosing
def inner():
x = "локальная" # Local
print(x) # Поиск начинается отсюда (L)
inner()
outer()
Вывод
локальная
🚩Глобальные переменные (`global`)
Если нужно изменить глобальную переменную внутри функции, используем
globalx = 10 # Глобальная переменная
def modify_global():
global x
x = 20 # Меняем глобальную переменную
modify_global()
print(x) # 20
🚩Переменные из внешней функции (`nonlocal`)
Если в вложенной функции нужно изменить переменную из enclosing-области, используем
nonlocaldef outer():
x = 10 # Переменная из enclosing-области
def inner():
nonlocal x
x = 20 # Меняем `x` в `outer()`
inner()
print(x) # 20
outer()
🚩Что если переменная отсутствует во всех областях?
Если переменная не найдена в LEGB, Python выдаст
NameErrordef func():
print(y) # Ошибка: y не объявлена!
func()
Ошибка
NameError: name 'y' is not defined
🚩`Built-in` — встроенные функции
Python в последнюю очереде проверяет встроенные функции (
print(), len(), sum() и т. д.). print = "Ошибка!" # Переопределили встроенную функцию
print("Hello") # TypeError: 'str' object is not callable
Ставь 👍 и забирай 📚 Базу знаний
👍2