Для сортировки списка словарей по определенному полю в Python удобно использовать функцию sorted() или метод sort(). Оба подхода позволяют указать ключ сортировки с помощью параметра key, где можно передать либо функцию, либо лямбда-выражение, которое извлекает значение из словаря для сортировки.
Списки словарей часто используются для хранения структурированных данных. Например, вы можете иметь список сотрудников, где каждый сотрудник представлен в виде словаря с полями, такими как имя, возраст и зарплата. Сортировка по определенному полю позволяет упорядочить данные, чтобы ими было проще пользоваться или отображать.
Эта функция возвращает новый отсортированный список.
employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]
# Сортировка по возрасту
sorted_employees = sorted(employees, key=lambda x: x["age"])
print(sorted_employees)
Результат
[{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]
Этот метод изменяет существующий список.
employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]
# Сортировка по зарплате
employees.sort(key=lambda x: x["salary"])
print(employees)
Результат
[{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]
Установите параметр reverse=True, чтобы отсортировать в порядке убывания.
sorted_employees_desc = sorted(employees, key=lambda x: x["age"], reverse=True)
print(sorted_employees_desc)
Это более эффективный способ, чем лямбда-функция, особенно для больших данных.
from operator import itemgetter
sorted_employees = sorted(employees, key=itemgetter("age"))
print(sorted_employees)
Если поле может отсутствовать в некоторых словарях, можно использовать параметр key для обработки таких ситуаций.
employees = [
{"name": "Alice", "age": 30},
{"name": "Bob"},
{"name": "Charlie", "age": 35}
]
sorted_employees = sorted(employees, key=lambda x: x.get("age", 0))
print(sorted_employees)
Результат
[{'name': 'Bob'},
{'name': 'Alice', 'age': 30},
{'name': 'Charlie', 'age': 35}]Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
Изменение вложенных данных в копии отразится на оригинале.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
Это два подхода, которые используются для выполнения нескольких задач одновременно или для улучшения производительности. Однако они имеют разные концепции, способы реализации и области применения.
Это способ организации кода, при котором задачи, занимающие много времени (например, ввод/вывод, запросы к базе данных или сетевые операции), не блокируют выполнение остальных частей программы. Основная идея асинхронности заключается в том, чтобы не ждать завершения одной операции перед началом следующей.
Асинхронный код работает в основном потоке программы и переключается между задачами, когда одна из них ожидает завершения (например, чтения данных из сети).
Асинхронный подход использует цикл событий (event loop), который управляет выполнением задач. Если задача блокируется, цикл событий переключается на следующую задачу.
Асинхронный код не простаивает в ожидании завершения операций ввода/вывода (I/O). Вместо этого такие операции сигнализируют о завершении через "обещание" (например,
Future или asyncio.Task).import asyncio
async def fetch_data():
print("Начинаем загрузку данных...")
await asyncio.sleep(2) # Асинхронная пауза (имитирует длительную операцию)
print("Данные загружены!")
return {"data": "some data"}
async def main():
print("Старт программы")
data = await fetch_data()
print(f"Результат: {data}")
print("Конец программы")
# Запуск цикла событий
asyncio.run(main())
Это способ выполнения нескольких задач одновременно с использованием нескольких потоков. Потоки — это "легковесные" процессы, которые разделяют одну и ту же память, но могут выполняться независимо друг от друга.
Программа создает несколько потоков, каждый из которых выполняет свою задачу.
Если у процессора несколько ядер, потоки могут выполняться действительно параллельно.
В отличие от асинхронного подхода, потоки часто блокируются в ожидании завершения операций (например, I/O).
import threading
import time
def task(name):
print(f"Начало задачи {name}")
time.sleep(2) # Имитация длительной операции
print(f"Конец задачи {name}")
# Создаем и запускаем потоки
thread1 = threading.Thread(target=task, args=("A",))
thread2 = threading.Thread(target=task, args=("B",))
thread1.start()
thread2.start()
# Ожидаем завершения потоков
thread1.join()
thread2.join()
print("Все задачи завершены")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
1. Он должен реализовывать метод __iter__, возвращающий итератор.
2. Примеры: списки, строки, словари, множества.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3
В Python 3.11 были добавлены новые классы исключений
BaseExceptionGroup и ExceptionGroup. Эти классы решают проблему одновременной обработки нескольких исключений, которые могут возникать в сложных ситуациях, таких как асинхронное программирование, многопоточность или обработка нескольких связанных ошибок. Давайте разберем, зачем они нужны, как их использовать и какие преимущества они дают.Ранее в Python было возможно выбросить только одно исключение за раз, и обработка нескольких исключений одновременно требовала сложного и неочевидного кода. Например:
При работе с асинхронными функциями или потоками может возникнуть сразу несколько ошибок, и их нужно корректно обработать.
В больших приложениях или библиотеках (например, при работе с
asyncio) может быть необходимость передать сразу несколько исключений, которые произошли в разных местах, как единый объект.BaseExceptionGroup и его подкласс ExceptionGroup позволяют группировать несколько исключений и выбрасывать их вместе в виде одного объекта. Это делает код более читаемым, упрощает обработку и исключает необходимость ручной агрегации ошибок.BaseExceptionGroup - это базовый класс для группировки исключений. Он наследуется от BaseException и, как правило, не используется напрямую.ExceptionGroup - это подкласс, который наследуется от Exception. Этот класс используется для обработки групп исключений, которые возникают при обычных ошибках в коде (не фатальных).Классы исключений
BaseExceptionGroup и ExceptionGroup позволяют создать "группу исключений", которая содержит несколько отдельных исключений. Это полезно, когда вам нужно:Указать несколько ошибок одновременно.
Позволить обработчику исключений работать с каждым из них.
def task_1():
raise ValueError("Ошибка в задаче 1")
def task_2():
raise TypeError("Ошибка в задаче 2")
try:
# Создаем группу исключений
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка в задаче 1"), TypeError("Ошибка в задаче 2")]
)
except ExceptionGroup as eg:
for exc in eg.exceptions:
print(f"Обнаружено исключение: {exc}")
Результат
Обнаружено исключение: Ошибка в задаче 1
Обнаружено исключение: Ошибка в задаче 2
При обработке
ExceptionGroup можно использовать механизм фильтрации с помощью конструкции except*. Это нововведение в Python 3.11 позволяет обрабатывать разные типы исключений внутри группы по-разному.try:
raise ExceptionGroup(
"Ошибки в задачах",
[ValueError("Ошибка 1"), TypeError("Ошибка 2"), ValueError("Ошибка 3")]
)
except* ValueError as ve:
print("Обрабатываем ValueError:", ve)
except* TypeError as te:
print("Обрабатываем TypeError:", te)
Результат
Обрабатываем ValueError: Ошибка 1
Обрабатываем ValueError: Ошибка 3
Обрабатываем TypeError: Ошибка 2
Вы можете объединить связанные ошибки и передать их в одном объекте.
Использование
except* позволяет обработать каждое исключение из группы отдельно, не теряя гибкости.В асинхронных задачах (
asyncio) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки.Код становится проще и понятнее, так как не нужно вручную собирать и разбирать исключения.
Когда вы работаете с несколькими задачами, которые могут порождать ошибки одновременно (например, асинхронный код).
Когда вы хотите сообщить о нескольких связанных ошибках, не выбрасывая каждую из них отдельно.
Когда требуется раздельная обработка разных типов ошибок.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
2. deepcopy() создаёт глубокую копию, рекурсивно копируя все вложенные объекты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1🔥1
Это подход к проектированию веб-сервисов, основанный на архитектурном стиле REST (*Representational State Transfer*). Это не протокол или стандарт, а набор принципов и ограничений, которые используются для создания систем, взаимодействующих через HTTP. Если API соответствует этим принципам, его называют RESTful.
Клиент (например, браузер или мобильное приложение) и сервер (где размещена база данных и логика обработки данных) чётко разделены:
Клиент запрашивает данные или отправляет запросы к серверу.
Сервер отвечает, предоставляя ресурсы или выполняя действия.
Каждый запрос от клиента к серверу должен быть самодостаточным. Это означает, что сервер не хранит информацию о состоянии клиента между запросами. Вся необходимая информация передается в запросе (например, токен аутентификации).
RESTful API использует единый, стандартный интерфейс для взаимодействия. Это достигается следующими средствами:
Идентификация ресурсов через URI: Каждый ресурс имеет уникальный адрес (URI).
GET https://api.example.com/users/123
Использование стандартных HTTP-методов:
GET — для получения данных.POST — для создания новых данных.PUT или PATCH — для обновления данных.DELETE — для удаления данных.Ресурсы как представления: Ресурсы передаются в формате JSON, XML или другом формате.
Ответы сервера могут быть кэшируемыми. Это уменьшает нагрузку на сервер и ускоряет работу клиента.
RESTful системы могут включать несколько слоев (например, балансировщики нагрузки, кеш-сервисы), но клиент взаимодействует только с сервером, не зная о внутренних слоях.
Иногда сервер может передавать исполняемый код (например, JavaScript) клиенту, чтобы расширить его функциональность. Это не обязательно.
RESTful архитектура позволяет:
Клиенты легко понимают, как обращаться к ресурсам (используя стандартные методы и адреса).
Клиенты и серверы могут развиваться независимо друг от друга.
RESTful API легко масштабируются, так как все запросы независимы друг от друга (статичность).
RESTful API поддерживают стандартизированные протоколы (HTTP), что делает интеграцию с другими сервисами проще.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
2. Поток — это часть процесса, использующая общую память с другими потоками того же процесса.
3. Потоки легче создаются, но менее изолированы, чем процессы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍6
Конструкция import package.item используется для импорта конкретного подмодуля или элемента из пакета в Python.
Пакет — это каталог, который содержит файл
__init__.py и может содержать подкаталоги и модули. Подкаталоги в пакете также могут содержать файлыия import py, что делает их под-пакетами. Пример структуры пакета:package/
вероятность
py
item.py
subpackage/
Конструкции
py
subitem.py
Конструкция
import package.item позволяет импортировать подмодуль item из пакета package. Например:import package.item
# Теперь вы можете использовать функции и классы из package.item
package.item.some_function()
Пакеты позволяют структурировать код в иерархическую систему, что делает его более организованным и модульным.
Использование пакетов помогает избежать конфликтов имен, так как разные модули могут иметь одинаковые имена, но располагаться в разных пакетах.
Пакеты упрощают управление зависимостями между различными частями кода.
Структура каталога
math_operations/
init.
py
addition.py
subtraction.py
Код вort package.ite
def add(a, b):
return a + b
Код вport package.item
def subtract(a, b):
return a - b
Использование в скрипте
import math_operations.addition
import math_operations.subtraction
result_add = math_operations.addition.add(5, 3)
result_subtract = math_operations.subtraction.subtract(5, 3)
print("Addition:", result_add) # Выведет: Addition: 8
print("Subtraction:", result_subtract) # Выведет: Subtraction: 2
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊8👍1🔥1
1. Переменная не содержит сам объект, а указывает на него.
2. Тип объекта определяется автоматически, а его управление памятью осуществляется сборщиком мусора.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥5
Это неупорядоченная коллекция уникальных элементов в Python. Это одна из встроенных структур данных языка, которая используется, когда вам нужно работать с наборами данных, исключая дубликаты и выполняя операции над множествами (например, пересечение, объединение и разность).
Элементы множества не имеют фиксированного порядка, то есть вы не можете обращаться к элементам по индексу, как в списках или кортежах.
Во множестве не может быть дубликатов. Если вы добавите во множество несколько одинаковых элементов, они будут храниться как один экземпляр.
Множества в Python изменяемы: вы можете добавлять, удалять и изменять их элементы. Однако сами элементы множества должны быть неизменяемыми (например, числа, строки, кортежи).
Операции проверки принадлежности (
in), добавления и удаления элементов работают очень быстро, благодаря использованию хэш-таблиц в реализации множества.Для создания пустого множества используется функция
set(), так как {} создаёт пустой словарьempty_set = set()
print(empty_set) # Output: set()
Вы можете передать список, строку, кортеж или другой итерируемый объект в функцию
set(). # Создание множества из списка
numbers = set([1, 2, 3, 4, 5])
print(numbers) # Output: {1, 2, 3, 4, 5}
# Создание множества из строки (уникальные символы)
chars = set("hello")
print(chars) # Output: {'h', 'e', 'l', 'o'} (порядок может быть разным)
Вы также можете использовать фигурные скобки
{} для создания множестваfruits = {"apple", "banana", "cherry"}
print(fruits) # Output: {'apple', 'banana', 'cherry'}Используется метод
add()my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # Output: {1, 2, 3, 4}remove() — удаляет элемент, выбрасывая ошибку, если его нет.discard() — удаляет элемент, не выбрасывая ошибку, если его нет.my_set = {1, 2, 3}
my_set.remove(2) # Удаляем элемент 2
print(my_set) # Output: {1, 3}
my_set.discard(5) # Ошибки не будет, если элемента 5 нетpop() — удаляет и возвращает случайный элемент (так как множество неупорядочено)my_set = {1, 2, 3}
removed_element = my_set.pop()
print(removed_element) # Например: 1
print(my_set) # Например: {2, 3}my_set = {1, 2, 3}
my_set.clear()
print(my_set) # Output: set()Используется оператор
inmy_set = {1, 2, 3}
print(2 in my_set) # Output: True
print(5 in my_set) # Output: FalsePython поддерживает классические операции теории множеств:
Возвращает множество, содержащее все элементы из двух множеств.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 | set2) # Output: {1, 2, 3, 4, 5}
print(set1.union(set2)) # То же самоеВозвращает элементы, которые присутствуют в обоих множествах.
print(set1 & set2) # Output: {3}
print(set1.intersection(set2)) # То же самоеВозвращает элементы, которые присутствуют только в одном множестве (а не в другом).
print(set1 - set2) # Output: {1, 2} (только в set1)
print(set1.difference(set2)) # То же самоеВозвращает элементы, которые есть в одном из множеств, но не в обоих сразу.
print(set1 ^ set2) # Output: {1, 2, 4, 5}
print(set1.symmetric_difference(set2)) # То же самоеЕсли вам нужно создать множество, которое нельзя изменить, используйте
frozensetfrozen = frozenset([1, 2, 3])
print(frozen) # Output: frozenset({1, 2, 3})
# frozen.add(4) # Ошибка: 'frozenset' object has no attribute 'add'
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🤯2
1. Первый аргумент метода — cls, который указывает на сам класс, а не на экземпляр.
2. Используются для работы с атрибутами и методами класса, а не конкретного объекта.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4
Это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Паттерн "Стратегия" позволяет изменять алгоритмы независимо от клиентов, которые их используют.
Позволяет инкапсулировать различные алгоритмы и использовать их независимо.
Устраняет дублирование кода и упрощает классы, которые используют эти алгоритмы.
Легко добавлять новые алгоритмы или изменять существующие без изменения клиентского кода.
Интерфейс, определяющий общий метод, который должны реализовать все алгоритмы.
Реализации различных алгоритмов, которые реализуют интерфейс стратегии.
Класс, использующий стратегию для выполнения задачи.
from abc import ABC, abstractmethod
# Интерфейс стратегии
class Strategy(ABC):
@abstractmethod
def sort(self, data):
pass
# Конкретные стратегии
class BubbleSortStrategy(Strategy):
def sort(self, data):
print("Sorting using Bubble Sort")
for i in range(len(data)):
for j in range(0, len(data)-i-1):
if data[j] > data[j+1]:
data[j], data[j+1] = data[j+1], data[j]
class QuickSortStrategy(Strategy):
def sort(self, data):
print("Sorting using Quick Sort")
self.quick_sort(data, 0, len(data) - 1)
def quick_sort(self, data, low, high):
if low < high:
pi = self.partition(data, low, high)
self.quick_sort(data, low, pi - 1)
self.quick_sort(data, pi + 1, high)
def partition(self, data, low, high):
pivot = data[high]
i = low - 1
for j in range(low, high):
if data[j] <= pivot:
i = i + 1
data[i], data[j] = data[j], data[i]
data[i + 1], data[high] = data[high], data[i + 1]
return i + 1
# Контекст
class SortingContext:
def __init__(self, strategy: Strategy):
self._strategy = strategy
def set_strategy(self, strategy: Strategy):
self._strategy = strategy
def sort(self, data):
self._strategy.sort(data)
# Клиентский код
data = [5, 2, 9, 1, 5, 6]
context = SortingContext(BubbleSortStrategy())
context.sort(data)
print(data) # [1, 2, 5, 5, 6, 9]
context.set_strategy(QuickSortStrategy())
data = [3, 7, 8, 5, 2, 1, 9, 5, 4]
context.sort(data)
print(data) # [1, 2, 3, 4, 5, 5, 7, 8, 9]
Алгоритмы инкапсулируются в отдельные классы, что упрощает их замену и добавление.
Контекст использует стратегии, избегая громоздких условных операторов.
Легко добавлять новые стратегии без изменения существующего кода.
Добавление множества классов стратегий может усложнить проект.
Контекст должен знать о всех возможных стратегиях, чтобы иметь возможность их переключать.
Когда есть несколько вариантов алгоритмов для выполнения задачи.
Когда нужно динамически выбирать алгоритм во время выполнения.
Когда необходимо избежать множества условных операторов для выбора алгоритма.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Статические методы реализуются с помощью декоратора
1. Такие методы не имеют доступа к атрибутам или методам класса/экземпляра.
2. Они похожи на обычные функции, но принадлежат классу и вызываются через него.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
Предоставляют более высокую степень абстракции от аппаратного обеспечения компьютера, чем низкоуровневые языки. Они ориентированы на удобство программирования, упрощение разработки, читаемость и поддержку кода. Эти языки скрывают детали работы с памятью и процессором, позволяя программистам сосредоточиться на логике приложения.
Веб-разработка, анализ данных, научные исследования, искусственный интеллект, автоматизация.
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
👍4❤2
1. Класс должен наследоваться от ABC (Abstract Base Class).
2. Абстрактные методы обязаны быть реализованы в подклассах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
Использование чисел в качестве ключей в словарях Python – это достаточно распространённый случай. Однако у этого подхода есть несколько нюансов, которые нужно учитывать для избежания ошибок.
Ключи в словаре должны быть хешируемыми, поскольку словари в Python основаны на хеш-таблицах. Хешируемость означает, что объект имеет неизменное значение хеша в течение его жизни. Числа (как
int, так и float) являются хешируемыми, поэтому их можно использовать в качестве ключей.d = {1: "один", 2: "два"}
print(d[1]) # "один"Python не делает различий между
int и float, если их значения равны. Это связано с тем, что у них одинаковое хеш-значение при равенстве. d = {1: "один", 1.0: "float один", 2: "два"}
print(d) # {1: 'float один', 2: 'два'}Числа с плавающей запятой (
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)]) # "один"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤2
2. Предоставляет механизмы инкапсуляции, наследования и полиморфизма, что упрощает переиспользование и поддержку кода.
3. Объектно-ориентированный подход лучше подходит для моделирования сложных систем.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥4
Это два важных понятия в контексте работы интернета и компьютерных сетей. Они используются для идентификации устройств и ресурсов в сети, а также для упрощения доступа к ним.
Это уникальный числовой идентификатор, присваиваемый каждому устройству, подключенному к сети, использующей протокол IP (Internet Protocol). IP-адреса используются для маршрутизации пакетов данных между устройствами в сети.
Формат: 32-битные числа, записанные в виде четырех десятичных чисел, разделенных точками (например, 192.168.1.1). Пример: 192.168.0.1, 8.8.8.8
Формат: 128-битные числа, записанные в виде восьми групп шестнадцатеричных чисел, разделенных двоеточиями (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334). Пример: 2001:0db8:85a3:0000:0000:8a2e:0370:7334, ::1 (loopback адрес)
Это удобочитаемое имя, используемое для идентификации IP-адреса на уровне пользователя. Доменные имена упрощают доступ к ресурсам в интернете, так как их легче запомнить и использовать, чем числовые IP-адреса.
Верхний уровень, например, .com, .org, .net.
Основная часть доменного имени, например, example в example.com.
Дополнительные уровни, например, www в www.example.com.
Для преобразования доменных имен в IP-адреса используется система доменных имен (DNS, Domain Name System). DNS-серверы выполняют роль "телефонной книги" интернета, переводя доменные имена в соответствующие им IP-адреса.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍1
1. Используется для избирательного переноса изменений, не прибегая к полной слиянии веток.
2. Пример: исправление бага в одной ветке может быть перенесено в другую без полного объединения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥3