🤔 Что такое объект первого класса?
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).
🚩Почему это важно?
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
🚩Пример на 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
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Как связаны for и next?
Цикл for в Python работает на основе итераторов. Он неявно вызывает метод next, чтобы получить следующий элемент из последовательности. Когда элементы заканчиваются, вызывается исключение, которое завершает цикл. Таким образом, for — это более удобная и безопасная обёртка над вызовами next.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Цикл for в Python работает на основе итераторов. Он неявно вызывает метод next, чтобы получить следующий элемент из последовательности. Когда элементы заканчиваются, вызывается исключение, которое завершает цикл. Таким образом, for — это более удобная и безопасная обёртка над вызовами next.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥1
🤔 Какие нюансы есть в использовании чисел как ключей?
Использование чисел в качестве ключей в словарях Python – это достаточно распространённый случай. Однако у этого подхода есть несколько нюансов, которые нужно учитывать для избежания ошибок.
🚩Хешируемость чисел
Ключи в словаре должны быть хешируемыми, поскольку словари в Python основаны на хеш-таблицах. Хешируемость означает, что объект имеет неизменное значение хеша в течение его жизни. Числа (как
🚩Взаимодействие `int` и `float`
Python не делает различий между
🚩Непредсказуемое поведение при работе с `float`
Числа с плавающей запятой (
🚩Производительность
Использование чисел как ключей в словарях эффективно с точки зрения производительности. Поскольку числа хешируются быстро и занимают меньше памяти, операции добавления, удаления и поиска выполняются очень быстро.
🚩Проблемы при преобразованиях
Если ключами словаря являются числа, то при обработке данных (например, чтении из файла или API) можно случайно преобразовать их в строки, что приведёт к созданию новых ключей вместо использования существующих.
🚩Пользовательские объекты с числовыми свойствами
Если вы используете пользовательские объекты как ключи и они ведут себя как числа (например, реализуют методы
Ставь 👍 и забирай 📚 Базу знаний
Использование чисел в качестве ключей в словарях Python – это достаточно распространённый случай. Однако у этого подхода есть несколько нюансов, которые нужно учитывать для избежания ошибок.
🚩Хешируемость чисел
Ключи в словаре должны быть хешируемыми, поскольку словари в Python основаны на хеш-таблицах. Хешируемость означает, что объект имеет неизменное значение хеша в течение его жизни. Числа (как
int, так и float) являются хешируемыми, поэтому их можно использовать в качестве ключей.d = {1: "один", 2: "два"}
print(d[1]) # "один"🚩Взаимодействие `int` и `float`
Python не делает различий между
int и float, если их значения равны. Это связано с тем, что у них одинаковое хеш-значение при равенстве. d = {1: "один", 1.0: "float один", 2: "два"}
print(d) # {1: 'float один', 2: 'два'}🚩Непредсказуемое поведение при работе с `float`
Числа с плавающей запятой (
float) иногда ведут себя непредсказуемо из-за ошибок округления, которые возникают из-за особенностей представления чисел в памяти компьютера.d = {0.1 + 0.2: "значение"} # 0.1 + 0.2 не равно точно 0.3 из-за округления
print(d.get(0.3)) # None, ключ не найден!🚩Производительность
Использование чисел как ключей в словарях эффективно с точки зрения производительности. Поскольку числа хешируются быстро и занимают меньше памяти, операции добавления, удаления и поиска выполняются очень быстро.
🚩Проблемы при преобразованиях
Если ключами словаря являются числа, то при обработке данных (например, чтении из файла или API) можно случайно преобразовать их в строки, что приведёт к созданию новых ключей вместо использования существующих.
d = {1: "один", 2: "два"}
print(d.get("1")) # None, строка "1" и число 1 – это разные ключи!🚩Пользовательские объекты с числовыми свойствами
Если вы используете пользовательские объекты как ключи и они ведут себя как числа (например, реализуют методы
__hash__ и __eq__), то их поведение должно быть совместимо с ожидаемым использованием. class MyNumber:
def __init__(self, value):
self.value = value
def __hash__(self):
return hash(self.value)
def __eq__(self, other):
return self.value == other.value
d = {MyNumber(1): "один"}
print(d[MyNumber(1)]) # "один"
Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что такое DNS и как он работает?
DNS (Domain Name System) — это система, которая преобразует доменное имя (например,google.com ) в IP-адрес, нужный для соединения.
Принцип работы:
1. Вводишь адрес в браузере.
2. Запрос уходит к DNS-серверу.
3. Он возвращает IP-адрес.
4. С этого момента браузер знает, куда направить HTTP-запрос.
DNS работает как телефонная книга интернета.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
DNS (Domain Name System) — это система, которая преобразует доменное имя (например,
Принцип работы:
1. Вводишь адрес в браузере.
2. Запрос уходит к DNS-серверу.
3. Он возвращает IP-адрес.
4. С этого момента браузер знает, куда направить HTTP-запрос.
DNS работает как телефонная книга интернета.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥1
🤔 Какие объекты можно положить в множество?
В Python множество (
🚩Можно добавить в `set`:
Числа (
Строки (
Кортежи (
Булевые значения (
🚩Нельзя добавить в `set`
Изменяемые объекты (
Кортежи с изменяемыми элементами
Ставь 👍 и забирай 📚 Базу знаний
В Python множество (
set) — это неупорядоченная коллекция уникальных элементов, которая работает на основе хеш-таблицы. Это значит, что только хешируемые (immutable) объекты могут быть добавлены в set.🚩Можно добавить в `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 не добавятся повторно)🚩Нельзя добавить в `set`
Изменяемые объекты (
list, set, dict) s = { [1, 2, 3] } # Ошибка: TypeError: unhashable type: 'list' s = { {"key": "value"} } # Ошибка: TypeError: unhashable type: 'dict'Кортежи с изменяемыми элементами
s = { (1, [2, 3]) } # Ошибка: TypeErrorСтавь 👍 и забирай 📚 Базу знаний
👍6
🤔 Строка — это последовательность или нет?
Да, в Python строка (str) — это последовательность символов, поддерживающая индексацию, срезы и итерируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Да, в Python строка (str) — это последовательность символов, поддерживающая индексацию, срезы и итерируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥1
🤔 Что такое многопоточность/многопроцессорность?
В программировании многопоточность и многопроцессорность помогают выполнять задачи параллельно, но работают по-разному.
🟠Многопоточность (Multithreading)
Многопоточность позволяет одной программе запускать несколько потоков (threads), которые работают одновременно.
Вывод
🟠2. Многопроцессорность (Multiprocessing)
Многопроцессорность запускает отдельные процессы, которые работают полностью независимо и могут использовать разные ядра процессора.
Вывод (процессы действительно работают параллельно)
Ставь 👍 и забирай 📚 Базу знаний
В программировании многопоточность и многопроцессорность помогают выполнять задачи параллельно, но работают по-разному.
🟠Многопоточность (Multithreading)
Многопоточность позволяет одной программе запускать несколько потоков (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 начал работу
Поток 1 завершил работу
Поток 2 завершил работу
Все потоки завершены
🟠2. Многопроцессорность (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("Все процессы завершены")
Вывод (процессы действительно работают параллельно)
Процесс 1 начал работу
Процесс 2 начал работу
Процесс 1 завершил работу
Процесс 2 завершил работу
Все процессы завершены
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое self?
Это ссылка на текущий экземпляр класса, используемая для доступа к атрибутам и методам объекта.
Он всегда первым аргументом передаётся в методы экземпляра класса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это ссылка на текущий экземпляр класса, используемая для доступа к атрибутам и методам объекта.
Он всегда первым аргументом передаётся в методы экземпляра класса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥2💊1
🤔 Что такое CRUD?
CRUD — это аббревиатура из четырех основных операций с данными:
C (Create) – создание
R (Read) – чтение
U (Update) – обновление
D (Delete) – удаление
🚩Разберем CRUD на примере работы с базой данных в Python
🟠Create (Создание)
Добавление новой записи в базу данных.
🟠Read (Чтение)
Получение данных из базы.
🟠Update (Обновление)
Изменение существующей записи.
🟠Delete (Удаление)
Удаление записи из базы.
Ставь 👍 и забирай 📚 Базу знаний
CRUD — это аббревиатура из четырех основных операций с данными:
C (Create) – создание
R (Read) – чтение
U (Update) – обновление
D (Delete) – удаление
🚩Разберем CRUD на примере работы с базой данных в Python
🟠Create (Создание)
Добавление новой записи в базу данных.
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
# Создаем таблицу, если её нет
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
# Добавляем пользователя
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Алиса",))
conn.commit() # Сохраняем изменения
conn.close()
🟠Read (Чтение)
Получение данных из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
users = cursor.fetchall() # Получаем все записи
for user in users:
print(user)
conn.close()🟠Update (Обновление)
Изменение существующей записи.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ("Боб", 1))
conn.commit()
conn.close()🟠Delete (Удаление)
Удаление записи из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
conn.commit()
conn.close()Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Какие типы HTTP запросов знаешь? В чем их отличия?
Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5