В Python множество (
set) — это неупорядоченная коллекция уникальных элементов, которая работает на основе хеш-таблицы. Это значит, что только хешируемые (immutable) объекты могут быть добавлены в set.Числа (
int, float, complex) s = {1, 2.5, 3+4j}Строки (
str) s = {"apple", "banana", "cherry"}Кортежи (
tuple), если они тоже содержат только неизменяемые объекты s = {(1, 2), ("a", "b")}Булевые значения (
bool)** (но True считается 1, а False — 0) s = {True, False, 1, 0}
print(s) # {False, True} (0 и 1 не добавятся повторно)Изменяемые объекты (
list, set, dict) s = { [1, 2, 3] } # Ошибка: TypeError: unhashable type: 'list' s = { {"key": "value"} } # Ошибка: TypeError: unhashable type: 'dict'Кортежи с изменяемыми элементами
s = { (1, [2, 3]) } # Ошибка: TypeErrorСтавь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Итератор обязан реализовать два метода:
- iter — возвращает сам итератор;
- next — возвращает следующий элемент или выбрасывает исключение StopIteration при завершении.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1💊1
Для реализации протокола итерирования данных в Python необходимо использовать два метода:
__iter__() и __next__().Этот метод должен возвращать объект-итератор. В простом случае он возвращает сам объект, если объект реализует метод
__next__(). Метод __iter__() необходим для того, чтобы объект можно было использовать в конструкциях, которые требуют итерируемого объекта, таких как циклы for. __next__()Этот метод возвращает следующий элемент в последовательности. Когда элементы заканчиваются, метод должен вызвать исключение
StopIteration для остановки итерации.class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start
def __iter__(self):
self.current = self.start # Перезапуск итератора при каждом вызове
return self
def __next__(self):
if self.current >= self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1
# Использование
for number in MyRange(1, 5):
print(number)
Для упрощения создания итераторов в Python можно использовать генераторы. Генераторы позволяют писать итераторы с использованием ключевого слова
yield вместо определения методов __iter__() и __next__() вручную.def my_range(start, end):
current = start
while current < end:
yield current
current += 1
# Использование
for number in my_range(1, 5):
print(number)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Да, это встроенная (built-in) область видимости. Она содержит определения, доступные в любом месте Python: встроенные функции (len, type, range, print) и константы (True, None, Ellipsis и т.д.). Эта область всегда доступна, но идёт последней в цепочке поиска.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
В Python счетчик ссылок (reference count) используется для управления памятью. Он показывает, сколько раз объект используется в программе. Когда счетчик ссылок падает до нуля, Python автоматически удаляет объект, освобождая память.
Python использует автоматическое управление памятью, основанное на подсчёте ссылок. Когда создаётся объект, Python хранит специальное число — количество ссылок на этот объект. Это число увеличивается, когда мы создаём новую ссылку на объект, и уменьшается, когда удаляем или перезаписываем переменную.
import sys
a = [1, 2, 3] # Создаём список
print(sys.getrefcount(a)) # Выведет 2 (одна ссылка 'a' + вызов getrefcount)
b = a # Новая ссылка на тот же объект
print(sys.getrefcount(a)) # Теперь 3 (a, b и сам getrefcount)
del a # Удаляем одну ссылку
print(sys.getrefcount(b)) # Теперь 2
del b # Удаляем последнюю ссылку, объект будет удалён из памяти
Python сам удаляет ненужные объекты, не давая памяти переполняться.
Если объект имеет циклические ссылки (например, список ссылается сам на себя), Python не может освободить его сразу, поэтому дополнительно используется сборщик мусора (Garbage Collector, GC).
import gc
class Node:
def __init__(self):
self.ref = self # Циклическая ссылка!
n = Node()
del n # Обычный подсчёт ссылок не сработает, объект останется в памяти
gc.collect() # Явный вызов сборщика мусора удалит его
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
EXPLAIN — команда в SQL (особенно PostgreSQL), которая показывает план выполнения запроса:
- какие индексы используются;
- как идут соединения;
- примерная стоимость.
Это помогает оптимизировать производительность сложных запросов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
В Python исключения (
exceptions) — это специальные объекты, которые возникают при ошибках и прерывают выполнение программы, если их не обработать.Все исключения в Python — это объекты, унаследованные от
BaseException. try:
1 / 0
except ZeroDivisionError as e:
print(type(e)) # <class 'ZeroDivisionError'>
print(e) # division by zero
Все исключения унаследованы от
BaseException: BaseException
├── Exception
│ ├── ArithmeticError
│ │ ├── ZeroDivisionError
│ │ ├── OverflowError
│ ├── ValueError
│ ├── IndexError
│ ├── KeyError
│ ├── TypeError
├── SystemExit
├── KeyboardInterrupt
Можно перехватывать несколько исключений
try:
x = int("abc") # Ошибка ValueError
except (ValueError, TypeError) as e:
print(f"Ошибка: {e}")
Если не знаем, какая ошибка может произойти:
try:
x = 1 / 0
except Exception as e:
print(f"Ошибка: {e}") # division by zero
finally выполняется всегда try:
1 / 0
except ZeroDivisionError:
print("Ошибка!")
finally:
print("Этот код выполнится всегда")
raise позволяет выбрасывать исключения вручную raise ValueError("Ошибка: неверное значение!")Можно создать свой класс ошибки, унаследованный от
Exception: class MyError(Exception):
pass
raise MyError("Это моя ошибка!")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Функции упрощают поддержку кода, делают его переиспользуемым и модульным. Они способствуют разбиению программы на логические части, что облегчает отладку и тестирование. Также они позволяют сократить объём кода и сделать его более понятным.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊2
Паттерн "Мост" (Bridge) является структурным паттерном проектирования, который предназначен для разделения абстракции и реализации так, чтобы они могли изменяться независимо друг от друга. Этот паттерн полезен, когда класс должен работать с различными платформами или когда нужно избежать жесткой связки между абстракцией и ее реализацией.
Он позволяет отделить абстракцию от ее реализации, что упрощает поддержку и расширение системы.
Без применения этого паттерна, если у нас есть несколько вариантов абстракции и несколько вариантов реализации, то нам пришлось бы создавать классы для всех возможных комбинаций, что приводит к взрывному росту количества классов.
Это позволяет изменять и абстракцию, и реализацию независимо друг от друга.
Определяет интерфейс и хранит ссылку на объект Implementor.
Наследует Abstraction и расширяет интерфейс.
Определяет интерфейс для всех реализаций.
Реализует интерфейс Implementor.
Допустим, у нас есть программа для управления различными типами устройств (например, телевизор и радио), которые можно включать и выключать. Мы хотим, чтобы способ управления устройствами мог изменяться независимо от типов устройств.
# Implementor
class Device:
def is_enabled(self):
pass
def enable(self):
pass
def disable(self):
pass
# ConcreteImplementor
class TV(Device):
def __init__(self):
self._on = False
def is_enabled(self):
return self._on
def enable(self):
self._on = True
def disable(self):
self._on = False
class Radio(Device):
def __init__(self):
self._on = False
def is_enabled(self):
return self._on
def enable(self):
self._on = True
def disable(self):
self._on = False
# Abstraction
class RemoteControl:
def __init__(self, device):
self._device = device
def toggle_power(self):
if self._device.is_enabled():
self._device.disable()
else:
self._device.enable()
# RefinedAbstraction
class AdvancedRemoteControl(RemoteControl):
def mute(self):
print("Device is muted.")
# Клиентский код
tv = TV()
remote = RemoteControl(tv)
remote.toggle_power() # Включает TV
radio = Radio()
advanced_remote = AdvancedRemoteControl(radio)
advanced_remote.toggle_power() # Включает Radio
advanced_remote.mute() # Заглушает Radio
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Global позволяет объявить, что переменная в функции ссылается на глобальную переменную, а не создаёт локальную. Nonlocal указывает, что переменная находится в охватывающем, но не глобальном контексте — это полезно во вложенных функциях и замыканиях.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1
Разбить список (
list) можно разными способами в зависимости от задачи: На части фиксированной длины
На N частей
По условию
Если нужно разделить список на подсписки длиной
n, можно использовать list comprehensiondef split_list(lst, size):
return [lst[i:i + size] for i in range(0, len(lst), size)]
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_list(data, 3))
Вывод
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Если нужно разделить список на
N частей, можно использовать numpy или itertools import numpy as np
def split_into_n_parts(lst, n):
return np.array_split(lst, n)
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_into_n_parts(data, 4))
Вывод
[array([1, 2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
Если нужно разделить список по какому-то критерию, например, на чётные и нечётные числа
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even = [x for x in data if x % 2 == 0]
odd = [x for x in data if x % 2 != 0]
print(even, odd)
Вывод
[2, 4, 6, 8] [1, 3, 5, 7, 9]
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
- all() — получить все записи;
- filter() — отфильтровать по условиям;
- exclude() — исключить по условиям;
- get() — получить одну запись (если больше — исключение);
- create() — создать запись;
- update() — обновить записи;
- delete() — удалить;
- exists() — проверить наличие;
- count() — подсчитать количество;
- order_by() — сортировка;
- values() / values_list() — извлечение словарей/списков.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
объект можно передавать как параметр функции.
функция может возвращать объект.
объект можно создавать во время выполнения программы (не только на этапе компиляции).
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
Присваивание функции переменной
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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔2
HTTP (HyperText Transfer Protocol) — это протокол, который управляет передачей данных между клиентом и сервером.
Клиент отправляет запрос, содержащий метод (например, GET), путь, заголовки и (опционально) тело.
Сервер возвращает ответ, состоящий из статус-кода, заголовков и тела (например, HTML или JSON).
HTTP — протокол без состояния: каждый запрос обрабатывается отдельно, без сохранения контекста предыдущих.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
Методы и атрибуты класса могут быть скрыты от внешнего использования с помощью различных уровней сокрытия. Сокрытие реализуется с помощью соглашений об именах, а не с помощью жесткой инкапсуляции, как в некоторых других языках программирования. Основные уровни сокрытия включают публичные, защищенные и приватные методы и атрибуты.
Доступны из любого места, как внутри класса, так и за его пределами. Их имена не начинаются с подчеркиваний.
class MyClass:
def __init__(self):
self.public_attribute = "I am public"
def public_method(self):
return "This is a public method"
obj = MyClass()
print(obj.public_attribute) # Вывод: I am public
print(obj.public_method()) # Вывод: This is a public method
Не предназначены для использования за пределами класса и его подклассов. Они обозначаются одним подчеркиванием в начале имени. Это всего лишь соглашение, сигнализирующее другим разработчикам, что такие методы и атрибуты не следует использовать вне класса или его подклассов.
class MyClass:
def __init__(self):
self._protected_attribute = "I am protected"
def _protected_method(self):
return "This is a protected method"
class SubClass(MyClass):
def access_protected(self):
return self._protected_method()
obj = MyClass()
sub_obj = SubClass()
print(sub_obj.access_protected()) # Вывод: This is a protected method
Скрыты от внешнего доступа и доступны только внутри самого класса. Они обозначаются двумя подчеркиваниями в начале имени. Python реализует это с помощью механизма именования, который изменяет имя метода или атрибута, добавляя к нему имя класса, чтобы затруднить доступ извне.
class MyClass:
def __init__(self):
self.__private_attribute = "I am private"
def __private_method(self):
return "This is a private method"
def access_private(self):
return self.__private_method()
obj = MyClass()
try:
print(obj.__private_attribute)
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '__private_attribute'
try:
print(obj.__private_method())
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '__private_method'
# Доступ к приватным методам через публичный метод класса
print(obj.access_private()) # Вывод: This is a private method
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Диапазон (range) — это ленивый объект, представляющий собой последовательность чисел. Он часто используется в циклах и экономит память по сравнению со списками.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊3👍1
Циклы — это конструкции, которые позволяют многократно выполнять код, пока выполняется определённое условие.
В Python есть два типа циклов:
for — перебирает элементы последовательности (list, tuple, dict, range() и т. д.). while — выполняется, пока условие True. Простой пример
for for i in range(5):
print(i)
Вывод
0
1
2
3
4
Перебор списка
names = ["Alice", "Bob", "Charlie"]
for name in names:
print(name)
Вывод
Alice
Bob
Charlie
Перебор словаря (
dict) user = {"name": "Alice", "age": 25}
for key, value in user.items():
print(f"{key}: {value}")Вывод
name: Alice
age: 25
Пример
while x = 0
while x < 5:
print(x)
x += 1
Вывод
0
1
2
3
4
*
while с input() (бесконечный цикл) while True:
command = input("Введите команду: ")
if command == "exit":
break # Выход из цикла
print(f"Вы ввели: {command}")
break — выход из цикла for i in range(10):
if i == 5:
break # Прерывает цикл, если i == 5
print(i)
Вывод
0
1
2
3
4
continue — пропуск итерации for i in range(5):
if i == 2:
continue # Пропускаем 2
print(i)
Вывод
0
1
3
4
else выполняется, если цикл завершился без break for i in range(5):
print(i)
else:
print("Цикл завершён!")
Вывод
0
1
2
3
4
Цикл завершён!
Но если сработает
break, else не выполняется for i in range(5):
if i == 3:
break
print(i)
else:
print("Цикл завершён!") # Не выполнится!
Вывод
0
1
2
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
Аннотации типов в Python не влияют на выполнение кода напрямую — они являются подсказками для разработчиков и инструментов анализа. Эти аннотации сохраняются в специальном атрибуте функции и могут использоваться фреймворками, редакторами и валидаторами. Интерпретатор Python сам по себе не применяет строгую проверку типов во время выполнения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Forwarded from easyoffer
Новая фича на easyoffer – Автоотлики
Вы автоматически откликаетесь на подходящие вам вакансии. Попробуйте её бесплатно и начните получать больше предложений о работе.
🚀 Запуск занимаем всего 3 минуты, а экономит очень много времени
🛡 Это безопасно: easyoffer официально одобрен HeadHunter и прошел его модерацию.
🥷🏻 Автоотклик незаметен для рекртера. Автоотклик ничем не отличается от обычного отклика, который вы делаете вручную
Рекрутеры давно используют автоматизацию для поиска кандидатов. Так почему вы должны откликаться вручную?
💡Совет – Добавьте шаблон сопроводительного письма, чтобы откликаться на большее количество вакансий (на некоторые вакансии нельзя откликнуться без сопроводительного)
Попробовать бесплатно → https://easyoffer.ru/autoapply
Вы автоматически откликаетесь на подходящие вам вакансии. Попробуйте её бесплатно и начните получать больше предложений о работе.
🚀 Запуск занимаем всего 3 минуты, а экономит очень много времени
🛡 Это безопасно: easyoffer официально одобрен HeadHunter и прошел его модерацию.
🥷🏻 Автоотклик незаметен для рекртера. Автоотклик ничем не отличается от обычного отклика, который вы делаете вручную
Рекрутеры давно используют автоматизацию для поиска кандидатов. Так почему вы должны откликаться вручную?
💡Совет – Добавьте шаблон сопроводительного письма, чтобы откликаться на большее количество вакансий (на некоторые вакансии нельзя откликнуться без сопроводительного)
Попробовать бесплатно → https://easyoffer.ru/autoapply
💊1
GET — это HTTP-метод, который используется для запроса данных с сервера.
Когда ты открываешь веб-сайт или вводишь URL в браузере — это GET-запрос. Браузер запрашивает страницу у сервера, и сервер возвращает данные.
Когда ты заходишь на
https://example.com/users, браузер отправляет: GET /users HTTP/1.1
Host: example.com
Ответ сервера
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
параметры передаются в строке запроса (например,
?id=123). GET не изменяет данные на сервере.
браузеры и серверы могут сохранять результаты GET-запросов.
слишком длинные запросы могут не работать.
передача пароля в URL (
?password=123) небезопасна. Если нужно передать параметры, они добавляются в URL:
GET /search?q=python&page=2
В Python можно отправить GET-запрос с помощью библиотеки
requests import requests
response = requests.get("https://api.example.com/users", params={"id": 123})
print(response.json()) # Получаем ответ в JSON
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4💊1