Асинхронность (
asyncio
) в Python не выполняет код параллельно, а переключается между задачами во время ожидания (I/O-bound). Если в
async
-функции делать тяжёлые вычисления (CPU-bound), это блокирует asyncio
, потому что в Python есть GIL (Global Interpreter Lock). Асинхронность позволяет выполнять задачи без блокировки, но только если они ждут чего-то (файлы, сеть, БД).
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com"] * 5
results = await asyncio.gather(*(fetch(url) for url in urls))
asyncio.run(main())
Если в
async
-функции делать тяжёлые вычисления, Python не сможет переключаться между задачами. import asyncio
async def heavy_task(n):
print(f"Вычисляю {n}...")
total = sum(i**2 for i in range(n)) # Долгий процесс
return total
async def main():
await asyncio.gather(heavy_task(10**7), heavy_task(10**7))
asyncio.run(main())
В Python 3.9+ можно выполнять CPU-задачи в отдельных потоках, не блокируя
asyncio
. import asyncio
def heavy_computation(n):
return sum(i**2 for i in range(n))
async def main():
result = await asyncio.to_thread(heavy_computation, 10**7)
print(result)
asyncio.run(main())
Так как Python использует GIL, единственный способ выполнять настоящий параллелизм — это
multiprocessing
.import asyncio
import multiprocessing
def heavy_computation(n):
return sum(i**2 for i in range(n))
async def main():
loop = asyncio.get_running_loop()
with multiprocessing.Pool() as pool:
result = await loop.run_in_executor(pool, heavy_computation, 10**7)
print(result)
asyncio.run(main())
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤔1
Conflict management — это процесс обнаружения, анализа и разрешения конфликтов:
- В разработке: слияние кода, разные изменения в одной строке, ветке или файле.
- В команде: несогласие между участниками — решается через коммуникации, правила, арбитраж.
- В системах данных: конфликт версий, репликаций или состояния.
В DevOps и разработке чаще говорят о разрешении конфликтов в Git, при merge или rebase.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Текстовые и бинарные файлы — это два типа файлов, которые хранят и обрабатывают данные по-разному. Разберем их отличия.
Текстовые файлы хранят данные в виде обычного текста, используя кодировку (например, UTF-8, ASCII). Они читаются и редактируются текстовыми редакторами (Notepad, VS Code).
-
.txt
— обычный текстовый файл -
.csv
— таблица в текстовом формате -
.json
, .xml
, .html
— текстовые форматы данных Каждый символ в файле представлен в кодировке (например, в UTF-8 буква "А" занимает 1 байт).
В Python текстовые файлы открываются в режиме
t
(text mode). # Запись в текстовый файл
with open("example.txt", "w", encoding="utf-8") as file:
file.write("Привет, мир!")
# Чтение текстового файла
with open("example.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content) # Выведет: Привет, мир!
Бинарные файлы хранят данные в машинном формате (набор байтов). Они не предназначены для чтения человеком и требуют специальных программ для обработки.
-
.exe
— исполняемый файл -
.png
, .jpg
— изображения -
.mp3
, .mp4
— аудио и видео файлы -
.dat
, .bin
— файлы с произвольными данными Байты записываются напрямую без конвертации в текст. Например, число
123
может храниться в 4-байтовом формате (например, 01111011
в двоичном коде). В Python бинарные файлы открываются в режиме
b
(binary mode). # Запись бинарных данных
data = b'\x48\x65\x6C\x6C\x6F' # "Hello" в байтах
with open("example.bin", "wb") as file:
file.write(data)
# Чтение бинарных данных
with open("example.bin", "rb") as file:
content = file.read()
print(content) # Выведет: b'Hello'
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4💊2
Когда токен истёк:
- Сервер отклоняет запрос с ошибкой авторизации (чаще всего 401).
- Клиент должен использовать refresh токен (если есть), чтобы получить новый access токен.
- Если refresh токена нет или он тоже просрочен — требуется повторная авторизация пользователя.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4
Если нужно:
Перехватить исключение
Выполнить какие-то действия (лог, очистка, уведомление и т. д.)
Снова выбросить это же исключение
try:
x = 1 / 0 # Ошибка деления на ноль
except ZeroDivisionError:
print("Ошибка! Записываем в лог...")
raise # Повторно выбрасываем то же исключение
Вывод
Ошибка! Записываем в лог...
Traceback (most recent call last):
File "script.py", line 2, in <module>
x = 1 / 0
ZeroDivisionError: division by zero
Пример: Логирование перед повторным выбросом
import logging
logging.basicConfig(filename="errors.log", level=logging.ERROR)
try:
user_input = int("abc") # Ошибка ValueError
except ValueError as e:
logging.error(f"Ошибка: {e}") # Записываем в лог
raise # Повторно выбрасываем исключение
Пример: Очистка ресурсов перед выбросом исключения
try:
file = open("data.txt", "r")
data = file.read()
except FileNotFoundError:
print("Файл не найден. Освобождаем ресурсы...")
raise # Снова выбрасываем исключение
finally:
file.close() # Гарантированно закроет файл
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Пакет в Python — это папка, содержащая файл __init__.py, который указывает, что она является модулем. Внутри пакета могут находиться другие модули или подпакеты. Это позволяет удобно структурировать код по функциональным блокам и импортировать нужные части.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
В 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
👍16
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Словарь (
dict
) — это структура данных, которая хранит пары "ключ → значение". Через
{}
(фигурные скобки)my_dict = {"name": "Alice", "age": 25, "city": "New York"}
Изменение значения
my_dict["age"] = 26 # Меняем возраст
del
— удаление по ключуdel my_dict["city"]
Перебор ключей (
for key in dict
)for key in my_dict:
print(key, my_dict[key])
Проверка наличия ключа
if "name" in my_dict:
print("Ключ существует!")
Создадим словарь квадратов чисел
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Нельзя использовать
list
как ключ! my_dict[[1, 2, 3]] = "Ошибка" # TypeError: unhashable type: 'list'
Можно использовать
tuple
, int
, str
, frozenset
my_dict[(1, 2, 3)] = "OK"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Кэш — это временное хранилище данных, предназначенное для ускорения доступа к ним.
Кэш может быть:
- Браузерным (сохраняются изображения, стили и скрипты).
- DNS-кэшем (сохраняются IP-адреса доменов).
- Серверным или CDN-кэшем (снижение нагрузки на сервер).
- В оперативной памяти — например, у приложений и баз данных.
Цель кэша — уменьшить задержку и количество повторных обращений.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥3💊1
Моржовый оператор (
:=
) – это новый оператор, появившийся в Python 3.8, который позволяет присваивать значение переменной прямо внутри выражения. Обычно мы записываем код так:
value = len(my_list) # Сначала присваиваем
if value > 10: # Потом используем
print("Список большой")
С
:=
можно совместить оба действия if (value := len(my_list)) > 10:
print("Список большой")
В циклах (избегаем лишних вычислений). Вместо:
data = input("Введите строку: ")
while data != "exit":
print("Вы ввели:", data)
data = input("Введите строку: ")
С
:=
можно записать короче:while (data := input("Введите строку: ")) != "exit":
print("Вы ввели:", data)
В
if
и while
(проверяем и присваиваем одновременно) Без
:=
text = input("Введите слово: ")
if len(text) > 5:
print(f"Слово длинное ({len(text)} символов)")
С
:=
:if (length := len(text)) > 5:
print(f"Слово длинное ({length} символов)")
В списковых включениях (list comprehensions)
Без
:=
:numbers = [random.randint(1, 100) for _ in range(10)]
filtered = [num for num in numbers if num % 2 == 0]
С
:=
:filtered = [num for _ in range(10) if (num := random.randint(1, 100)) % 2 == 0]
Если код становится сложнее для чтения
if (a := func()) and (b := another_func(a)) > 10:
...
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥3
- while — цикл, который выполняется пока условие истинно. Используется, когда неизвестно количество итераций.
- for — итерационный цикл, проходящий по элементам коллекции или диапазону. Обычно применяется, когда известны шаги или есть итерируемый объект.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23
Параллелизм — это способ выполнения программ, при котором несколько задач выполняются одновременно (реально параллельно). Он используется для ускорения работы программ, особенно на многоядерных процессорах.
Пример без параллелизма (последовательное выполнение)
Допустим, у нас есть две задачи:
1. Скачать файл (3 секунды).
2. Обработать данные (2 секунды).
Если выполнять их последовательно
[1] Скачать файл... (3 сек)
[2] Обработать файл... (2 сек)
[Готово за 5 секунд]
Пример с параллелизмом (оба процесса выполняются одновременно)
Если у нас 2 ядра процессора, можно выполнить задачи одновременно.
[1] Скачать файл... (3 сек) ──► Готово!
[2] Обработать файл... (2 сек) ──► Готово!
[Готово за 3 секунды] ✅ Быстрее!
В Python
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("Все процессы завершены")
Python не может выполнять потоки параллельно из-за GIL, но
threading
всё же полезен для задач ввода-вывода.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("Все потоки завершены")
Асинхронность позволяет не ждать выполнения операции, а переключаться на другие задачи.
import asyncio
async def task(name):
print(f"Начал {name}")
await asyncio.sleep(2) # НЕ блокирует другие задачи
print(f"Закончил {name}")
async def main():
await asyncio.gather(task("Задача 1"), task("Задача 2"))
asyncio.run(main())
Процессор выполняет несколько инструкций одновременно. Например, в современных процессорах есть конвейер (pipeline), который выполняет несколько операций параллельно.
Одна операция применяется к разным данным одновременно (используется в нейросетях, GPU).
import numpy as np
arr = np.array([1, 2, 3, 4])
result = arr * 2 # Все элементы умножаются одновременно (векторизация)
print(result) # [2 4 6 8]
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
Исключение пробросится выше по стеку вызовов. Если его не перехватит ни один уровень, программа завершится с трейсбеком.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Docker — это инструмент для создания, развертывания и управления контейнерами. Основные команды позволяют управлять образами, контейнерами, сетями и томами.
Образы — это "шаблоны" для создания контейнеров.
Пример: скачиваем Python-образ
docker pull python:3.11
Контейнер — это запущенный процесс на основе образа.
Пример: запустить контейнер с Ubuntu и войти в него
docker run -it ubuntu bash
Пример: остановить и удалить контейнер
docker stop my_app
docker rm my_app
Том (volume) — это способ хранения данных, которые не пропадут при перезапуске контейнера.
Пример: подключить том к контейнеру
docker run -v my_data:/app/data ubuntu
Сети в Docker позволяют контейнерам взаимодействовать друг с другом.
Пример: запустить два контейнера в одной сети
docker network create my_network
docker run -d --network my_network --name app1 ubuntu
docker run -d --network my_network --name app2 ubuntu
Docker Compose позволяет управлять несколькими контейнерами с помощью
docker-compose.yml
. Пример
docker-compose.yml
version: "3"
services:
app:
image: python:3.11
volumes:
- my_data:/app/data
networks:
- my_network
volumes:
my_data:
networks:
my_network:
Запуск
docker compose up -d
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💊1
Redis используется как высокопроизводительное in-memory хранилище.
1. Подходит для кэширования данных, управления сессиями, очередей сообщений.
2. Обеспечивает поддержку структур данных, таких как списки, множества, хэши, что упрощает реализацию сложных операций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥6
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
объект можно передавать как параметр функции.
функция может возвращать объект.
объект можно создавать во время выполнения программы (не только на этапе компиляции).
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
Присваивание функции переменной
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
🔥6👍5
Подгенератор — это генератор, из которого делается вложенный вызов через yield from. Это позволяет делегировать генерацию значений другому генератору.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊12🤔3🔥1
Предоставляют более высокую степень абстракции от аппаратного обеспечения компьютера, чем низкоуровневые языки. Они ориентированы на удобство программирования, упрощение разработки, читаемость и поддержку кода. Эти языки скрывают детали работы с памятью и процессором, позволяя программистам сосредоточиться на логике приложения.
Веб-разработка, анализ данных, научные исследования, искусственный интеллект, автоматизация.
def greet(name):
return f"Hello, {name}!"
print(greet("World"))
Разработка корпоративного ПО, веб-приложений, мобильных приложений (Android), больших распределенных систем.
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Разработка настольных приложений, веб-приложений, игр (с использованием Unity), облачных сервисов.
using System;
class Program {
static void Main() {
Console.WriteLine("Hello, World!");
}
}
Веб-разработка, создание интерактивных пользовательских интерфейсов, серверные приложения, мобильные приложения (с использованием фреймворков, таких как React Native).
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("World"));
Веб-разработка, скрипты автоматизации, создание прототипов.
def greet(name)
"Hello, #{name}!"
end
puts greet("World")
Веб-разработка, серверные приложения, управление контентом.
<?php
function greet($name) {
return "Hello, $name!";
}
echo greet("World");
?>
Разработка мобильных и настольных приложений для экосистемы Apple.
func greet(name: String) -> String {
return "Hello, \(name)!"
}
print(greet(name: "World"))
Разработка Android-приложений, серверных приложений, веб-приложений.
fun greet(name: String): String {
return "Hello, $name!"
}
fun main() {
println(greet("World"))
}
Разработка серверных приложений, облачных сервисов, микросервисов.
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Системное программирование, разработка высокопроизводительных приложений, безопасное многопоточность.
fn main() {
println!("Hello, World!");
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
Замыкание — это функция, которая "помнит" значения переменных из внешней области видимости, даже после выхода из неё. Это позволяет сохранять состояние между вызовами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥7