Спросят с вероятностью 26%
Словарь — это коллекция элементов, которая хранит данные в парах ключ-значение. Ключ в словаре может быть любым неизменяемым типом данных: числами, строками, кортежами. Главное требование к ключу — он должен быть уникальным в рамках одного словаря и хешируемым.
Хешируемость означает, что объект должен иметь хеш-значение, которое не изменяется на протяжении всего времени существования объекта. Это необходимо для того, чтобы Python мог быстро находить значение по ключу. Если бы ключи были изменяемыми, их хеш-значения могли бы измениться, и это привело бы к тому, что значение по ключу стало бы невозможно найти.
Примеры ключей в словаре:
Строки - самый часто используемый тип ключа. Строки удобны, поскольку они легко читаемы и понятны.
my_dict = {"name": "Alice", "age": 25}Числа - также могут использоваться в качестве ключей. Это могут быть целые числа или числа с плавающей точкой.
my_dict = {1: "one", 2: "two"}Кортежи - могут быть ключами, если все их элементы неизменяемы. Это делает их полезными для комплексных ключей.
my_dict = {(1, 2): "point", (3, 4): "another point"}Изменяемые типы данных, такие как списки или другие словари, не могут быть ключами, потому что они не хешируемы.
Ключи в словаре Python — это неизменяемые и хешируемые объекты, такие как строки, числа или кортежи. Это обеспечивает эффективный доступ и хранение данных. В качестве ключей используются данные, которые легко идентифицировать и которые не изменяются во время работы программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍5❤1👾1
Спросят с вероятностью 26%
Объектно-ориентированное программирование (ООП) — это парадигма программирования, основанная на концепции "объектов", которые могут содержать данные в виде полей (атрибуты или свойства) и код в виде процедур (методы).
Зачем нужно ООП?
ООП используется для структурирования программы таким образом, чтобы свойства и поведения были собраны в отдельные объекты. Например, в программе для управления животными в зоопарке каждое животное может быть объектом с атрибутами, такими как имя, возраст и вид, а также методами, такими как кормление или игра. Это делает программу легко понимаемой, расширяемой и поддерживаемой.
Основные концепции ООП:
1️⃣ Инкапсуляция — это сокрытие деталей реализации и объединение данных и методов, работающих с этими данными, в одном классе. Это помогает защитить данные от непосредственного доступа извне и делает интерфейс работы с объектом более четким и строгим.
2️⃣ Наследование позволяет создавать новые классы на основе уже существующих, наследуя их свойства и методы. Это облегчает повторное использование кода и создание иерархий классов.
3️⃣ Полиморфизм — способность одной и той же функции или метода работать с разными типами данных. В ООП это обычно достигается за счет переопределения методов в дочерних классах.
4️⃣ Абстракция — это способ выделить набор общих характеристик объекта, исключая из рассмотрения несущественные. Это позволяет сосредоточиться на том, что объект делает, а не на том, как он это делает.
Пример кода:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def speak(self):
return "Звуки, которые издает животное"
class Dog(Animal): # Наследование класса Animal
def speak(self): # Переопределение метода speak
return "Гав"
# Создание объекта класса Dog
my_dog = Dog("Бобик", 5)
print(my_dog.speak()) # Вывод: Гав
В этом примере
Animal является базовым классом с методом speak, а Dog — производным классом, который наследует свойства Animal и переопределяет метод speak. Это демонстрирует наследование и полиморфизм.Вкратце: ООП — это метод организации программы с помощью объектов, которые объединяют данные и методы работы с этими данными. Это делает программы более понятными, удобными для разработки и поддержки. Основные принципы ООП включают инкапсуляцию, наследование, полиморфизм и абстракцию.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍10❤5💊1
Спросят с вероятностью 23%
Лямбда-функции — это небольшие анонимные функции, состоящие из одного выражения, результат которого является значением функции. Они определяются с помощью ключевого слова
lambda, за которым следуют аргументы функции, двоеточие и выражение, значение которого функция должна вернуть.Зачем нужны лямбда-функции?
Лямбда-функции часто используются в тех случаях, когда необходима простая функция для кратковременного использования, и нет смысла определять полноценную функцию с помощью
def. Это может быть полезно для сортировки или фильтрации данных, а также в качестве аргумента для функций высшего порядка, таких как map(), filter() и reduce().Пример использования:
# Определение лямбда-функции для вычисления квадрата числа
square = lambda x: x * x
# Использование лямбда-функции
print(square(5)) # Выведет 25
# Лямбда-функция в качестве аргумента функции map()
numbers = [1, 2, 3, 4]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers) # Выведет [1, 4, 9, 16]
# Лямбда-функция для фильтрации списка
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # Выведет [2, 4]
Лямбда-функции удобны для создания небольших функций на лету, без необходимости явно определять функцию с использованием
def. Однако стоит отметить, что использование лямбда-функций может сделать код менее читаемым, если выражение становится сложным. По этой причине рекомендуется использовать лямбда-функции для простых операций и переходить к обычному определению функций с def для более сложной логики.Вкратце: лямбда-функции — это компактный способ создания анонимных функций для выполнения простых выражений. Они особенно полезны для использования в качестве аргументов для функций, работающих с коллекциями данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍2❤1
Спросят с вероятностью 23%
MRO (Method Resolution Order) — это порядок, в котором Python ищет методы и атрибуты класса при их вызове. Этот порядок особенно важен в контексте множественного наследования, когда класс наследует поведение и атрибуты от нескольких родительских классов, и нужно четко определить, откуда именно брать эти атрибуты и методы в случае их совпадения.
Зачем нужен MRO ?
MRO помогает избежать проблемы алмаза (diamond problem), которая возникает, когда два родительских класса наследуют от одного и того же базового класса, а затем эти классы сливаются в один дочерний класс. Без четко определенного MRO Python не смог бы автоматически решить, в каком порядке следует искать методы и атрибуты среди родительских классов.
Как работает MRO ?
Python использует алгоритм C3 Linearization для определения MRO. Этот алгоритм гарантирует, что порядок разрешения методов учитывает следующие условия:
✅ Подкласс всегда имеет приоритет перед родительским классом.
✅ Порядок родительских классов сохраняется.
✅ Если класс наследует от нескольких классов, порядок, указанный при наследовании, определяет приоритетность.
Можно узнать MRO любого класса, используя атрибут
__mro__ или метод mro() у самого класса.Пример:
class Base:
pass
class A(Base):
pass
class B(Base):
pass
class C(A, B):
pass
print(C.mro())
В этом примере порядок разрешения методов для класса
C будет следующим: C, A, B, Base, object. Это означает, что если метод вызывается для экземпляра класса C, интерпретатор Python будет искать его сначала в C, затем в A, после в B, затем в Base и, наконец, в встроенном объекте object, который является базовым для всех классов.MRO определяет порядок, в котором интерпретатор будет искать методы и атрибуты при их вызове в контексте множественного наследования. Это обеспечивает предсказуемость и избегает конфликтов при наследовании от нескольких классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3❤1
Спросят с вероятностью 23%
Миксин (Mixin) – это класс, предназначенный для предоставления определённых методов для использования другими классами, без необходимости становиться родительским классом для этих классов. Главная цель миксина - реализация функциональности, которую можно легко подключить к другому классу. Миксины позволяют разработчикам использовать композицию для добавления функций в классы вместо наследования, что делает структуру кода гибче и модульнее.
Применение миксинов удобно, когда одна и та же функциональность нужна в разных классах, но эти классы не должны быть связаны отношениями наследования. Таким образом, миксины позволяют избежать дублирования кода и упростить его поддержку.
Пример использования миксина:
class JsonMixin:
def to_json(self):
import json
return json.dumps(self.__dict__)
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class PersonJson(JsonMixin, Person): # Использование миксина для добавления функциональности сериализации в JSON
pass
p = PersonJson('Иван', 25)
print(p.to_json()) # Выведет строку в формате JSON, представляющую объект PersonJson
В этом примере
JsonMixin предоставляет метод to_json, который может сериализовать объекты класса в JSON. Класс PersonJson наследует этот метод благодаря множественному наследованию, где JsonMixin используется для добавления функциональности сериализации к классу Person, не изменяя его исходный код.Использование миксинов делает код более читаемым и легко поддерживаемым, так как оно позволяет разработчикам комбинировать и переиспользовать функциональности между различными классами без изменения их иерархии наследования.
–––
Миксин - это способ добавления функциональности к классам через множественное наследование, без необходимости изменять их иерархию. Это позволяет сделать код более модульным и легким для поддержки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥3👾3❤2💊2
Спросят с вероятностью 20%
Middleware — это механизм слоёв обработки запросов и ответов в веб-приложении. Эти слои выполняются на разных этапах обработки запроса: некоторые мидлвари вызываются до того, как запрос достигнет представления (view), а другие — после формирования ответа представлением, но до того, как этот ответ будет отправлен клиенту. Middleware в Django позволяет глобально изменять запросы входящие в ваше приложение или ответы из него, применять аутентификацию, сессии, кеширование и многое другое.
Django поставляется с набором встроенных middleware, каждый из которых выполняет свою специфическую задачу. Ниже перечислены некоторые из наиболее часто используемых встроенных middleware и их функции:
1️⃣ SecurityMiddleware - Обеспечивает выполнение различных мер безопасности для защиты приложения, таких как предотвращение заголовка X-Frame-Options, реализация HSTS (HTTP Strict Transport Security) и т.д.
2️⃣ SessionMiddleware - Управляет сессиями через запросы. Это позволяет сохранять информацию о сессиях пользователей между различными запросами.
3️⃣ CommonMiddleware - Предоставляет различные функции, такие как управление перенаправлением URL с "www" на без "www", управление заканчивающимся слешем в URL и отправку заголовков X-Content-Type-Options: nosniff.
4️⃣ CsrfViewMiddleware - Предотвращает атаки межсайтовой подделки запроса (CSRF) путём добавления токена CSRF в запросы, которые изменяют данные, защищая таким образом ваше приложение.
5️⃣ AuthenticationMiddleware - Ассоциирует пользователей с запросами используя сессии, что позволяет использовать request.user.
6️⃣ MessageMiddleware - Позволяет временно сохранять сообщения в запросе и выводить их пользователю. Это может быть полезно для отображения уведомлений об успехе, предупреждениях или ошибках после выполнения действий.
7️⃣ XFrameOptionsMiddleware - Защищает ваше приложение от кликовджекинга, устанавливая заголовок X-Frame-Options для всех ответов, которые содержат HTML.
Важно отметить, что порядок middleware в настройках
MIDDLEWARE в settings.py имеет значение, поскольку они обрабатываются в порядке, указанном в этом списке, сначала при обработке входящего запроса и в обратном порядке при обработке ответа.Middleware — это мощный инструмент, который позволяет глобально влиять на процесс обработки запросов и ответов в вашем веб-приложении, добавляя важные функции безопасности, управления сессиями, аутентификации и многие другие возможности.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2
Спросят с вероятностью 20%
Асинхронность — это концепция, позволяющая выполнение задач в программе так, чтобы они не блокировали выполнение друг друга. Это значит, что программа может переключаться между задачами, не дожидаясь завершения каждой из них. Это особенно полезно в ситуациях, когда выполнение задачи зависит от внешних факторов, которые могут занять неопределенное время (например, ожидание ответа от веб-сервиса или чтение файла).
В Python асинхронность реализуется с помощью корутин и асинхронного ввода-вывода
(asyncio) . Это позволяет программе быть более эффективной и отзывчивой, особенно при работе с I/O-задачами, такими как сетевое взаимодействие или операции с диском, которые могут значительно замедлить выполнение программы, если использовать блокирующий ввод-вывод.Пример асинхронной функции:
import asyncio
async def main():
print('Привет')
await asyncio.sleep(1) # Имитация асинхронной задачи, например, запроса к веб-серверу
print('Мир')
asyncio.run(main())
В этом примере
async def определяет асинхронную функцию. Ключевое слово await используется перед вызовом функции, которая может быть асинхронной (в нашем случае asyncio.sleep), указывая, что программа может переключиться на выполнение другой задачи во время ожидания завершения текущей. asyncio.run(main()) запускает асинхронный цикл событий, который управляет выполнением асинхронных функций.Использование асинхронности позволяет повысить производительность программы за счет неблокирующего выполнения задач, особенно когда есть много операций ввода-вывода, таких как запросы к сети или к базам данных.
Асинхронность позволяет делать программу более эффективной и отзывчивой, выполняя задачи параллельно и не ожидая завершения каждой из них. Это достигается за счет использования асинхронных операций, которые не блокируют выполнение программы.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍4❤1
Спросят с вероятностью 17%
Асинхронность, threading и мультипроцессинг - это три различных подхода к параллельному выполнению задач каждый из которых имеет свои особенности и применения:
1️⃣ Асинхронность (Asynchronous)
Асинхронность предполагает выполнение задач без ожидания их завершения. Используется для работы с вводом-выводом (I/O), таким как чтение или запись файлов, сетевые запросы и т. д. В асинхронном коде задачи не блокируют основной поток выполнения, что позволяет эффективно использовать ресурсы процессора. Примеры асинхронных моделей включают в себя асинхронные функции и ключевые слова в Python (например,
async, await).2️⃣ Потоки (Threading)
Потоки позволяют выполнять несколько частей кода (потоков) параллельно в пределах одного процесса. Используются для выполнения многозадачных операций, которые могут быть распределены между несколькими ядрами процессора. Потоки могут выполняться параллельно, но могут также конкурировать за общие ресурсы, что может привести к проблемам синхронизации и безопасности. В некоторых языках, таких как Python, использование потоков ограничено из-за GIL (Global Interpreter Lock), что может снижать эффективность при использовании множества потоков для CPU-интенсивных задач.
3️⃣ Мультипроцессинг (Multiprocessing)
Мультипроцессинг также позволяет выполнять несколько частей кода параллельно, но каждая часть выполняется в отдельном процессе. Каждый процесс имеет свое собственное пространство памяти, что делает мультипроцессинг более подходящим для многозадачных вычислений на многоядерных системах. Процессы обычно имеют больший накладные расходы по сравнению с потоками, поскольку каждый из них требует своих собственных ресурсов памяти и управления. Мультипроцессинг избегает проблемы GIL, что делает его более эффективным для CPU-интенсивных задач в Python и других языках.
Выбор между асинхронностью, потоками и мультипроцессингом зависит от конкретных требований вашего приложения, а также от характеристик вашей системы и языка программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🤔7❤3🔥3
Спросят с вероятностью 17%
Список (list) и кортеж (tuple) - это две различные структуры данных, которые обладают следующими основными различиями:
1️⃣ Изменяемость:
- Списки изменяемы, что означает, что их элементы могут быть изменены после создания списка.
- Кортежи неизменяемы, их элементы не могут быть изменены после создания кортежа.
2️⃣ Синтаксис:
- Списки создаются с использованием квадратных скобок
[ ], например: [1, 2, 3].- Кортежи создаются с использованием круглых скобок
( ), например: (1, 2, 3).3️⃣ Производительность:
- Кортежи работают быстрее, чем списки, потому что они неизменяемы и Python может проводить оптимизации, которые не доступны для списков.
4️⃣ Использование:
- Списки обычно используются там, где требуется изменяемая коллекция, например, когда вы планируете добавлять, удалять или изменять элементы списка.
- Кортежи обычно используются для представления фиксированных коллекций элементов, которые не должны изменяться, или для передачи неизменяемых последовательностей данных в функции, где изменяемость нежелательна.
Пример использования списков:
my_list = [1, 2, 3]
my_list.append(4)
print(my_list) # Вывод: [1, 2, 3, 4]
Пример использования кортежей:
my_tuple = (1, 2, 3)
# my_tuple[0] = 5 # Это вызовет ошибку, так как кортежи неизменяемы
print(my_tuple) # Вывод: (1, 2, 3)
Если ваши данные должны оставаться неизменными, лучше использовать кортежи. Если вам нужна изменяемость, используйте списки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥12❤1
Спросят с вероятностью 7%
Можно сделать все значения списка уникальными, преобразовав его в множество (set) и затем обратно в список. Множество автоматически удаляет дубликаты, оставляя только уникальные элементы. Вот как это можно сделать:
my_list = [1, 2, 3, 4, 2, 3, 5]
unique_list = list(set(my_list))
print(unique_list) # Вывод: [1, 2, 3, 4, 5]
В этом примере
set(my_list) создает множество уникальных значений из списка my_list, а list(set(my_list)) преобразует это множество обратно в список. Как результат, мы получаем список, содержащий только уникальные значения из исходного списка.Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤3🔥3
Спросят с вероятностью 17%
Метаклассы - это концепция, которая позволяет контролировать создание классов. Классы являются объектами, и они создаются с помощью других классов, которые называются метаклассами. Вот некоторые ключевые моменты о них:
1️⃣ Классы как объекты: Классы являются объектами первого класса, что означает, что они могут быть созданы, изменены и переданы как аргументы функций.
2️⃣ Типы и метаклассы: Каждый объект имеет тип, который определяется его классом. Этот класс, определяющий тип объекта, называется метаклассом. По умолчанию для всех классов метаклассом является
type.3️⃣ Использование метаклассов: Метаклассы можно использовать для изменения поведения создания классов. Это может быть полезно для автоматического добавления методов, проверки атрибутов или изменения наследования классов.
4️⃣ Ключевые методы метакласса: Для создания собственного метакласса обычно определяются методы
__new__() и __init__(). Метод __new__() вызывается перед созданием экземпляра класса, а метод __init__() вызывается после создания экземпляра.Пример создания метакласса:
class MyMeta(type):
def new(cls, name, bases, dct):
# Изменяем или расширяем класс
dct['custom_attribute'] = 'This is a custom attribute'
return super().new(cls, name, bases, dct)
class MyClass(metaclass=MyMeta):
pass
obj = MyClass()
print(obj.custom_attribute) # Вывод: This is a custom attribute
В этом примере
MyMeta - это метакласс, который изменяет класс MyClass, добавляя к нему новый атрибут custom_attribute.Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🤔7❤2👾1
Спросят с вероятностью 7%
Мутабельные (изменяемые) и иммутабельные (неизменяемые) типы данных определяются по их способности изменяться после создания.
1️⃣ Иммутабельные типы данных:
- Не могут быть изменены после создания.
- Если вы пытаетесь изменить значение иммутабельного объекта, на самом деле создается новый объект с измененным значением.
- Примеры таких данных включают числа (int, float), строки (str), кортежи (tuple), неизменяемые множества (frozenset) и неизменяемые словари (frozenset).
Пример:
x = 5
x += 1 # Создается новый объект с новым значением
2️⃣ Мутабельные типы данных:
- Могут быть изменены после создания.
- Вы можете изменять значение мутабельного объекта, не создавая новый объект.
- Примеры таких данных включают списки (list), множества (set), словари (dict) и пользовательские объекты.
Пример:
my_list = [1, 2, 3]
my_list.append(4) # Изменяется существующий список
Использование иммутабельных типов данных обычно приводит к более безопасному и предсказуемому поведению программы, так как они не могут быть случайно изменены в процессе выполнения программы. Однако мутабельные типы данных часто более эффективны в использовании, особенно при работе с большими объемами данных, поскольку они позволяют изменять значение объекта без создания нового экземпляра.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23👾2❤1
Спросят с вероятностью 17%
Декоратор property используется для создания вычисляемых атрибутов класса. Он позволяет определить методы
getter, setter и deleter для атрибута класса, что обеспечивает более гибкий доступ к данным объекта. Вот как работает каждый из этих методов:1️⃣ Getter (метод получения):
- Помеченный декоратором
@property, представляет собой метод, который возвращает значение атрибута.- Вызывается при обращении к атрибуту без использования скобок или при обращении через свойство.
2️⃣ Setter (метод установки):
- Помеченный декоратором
@property.setter, представляет собой метод, который устанавливает значение атрибута.- Вызывается при попытке установить новое значение атрибута.
3️⃣ Deleter (метод удаления):
- Помеченный декоратором
@property.deleter, представляет собой метод, который удаляет атрибут.- Вызывается при использовании оператора
del для удаления атрибута.Вот пример использования
property: class Circle:
def init(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value <= 0:
raise ValueError("Радиус должен быть положительным числом")
self._radius = value
@radius.deleter
def radius(self):
del self._radius
# Использование
c = Circle(5)
print(c.radius) # Вывод: 5
c.radius = 10
print(c.radius) # Вывод: 10
del c.radius
# print(c.radius) # Вызовет AttributeError, так как атрибут удален
В этом примере метод
radius() используется как getter, radius.setter используется для установки нового значения атрибуту, а radius.deleter используется для удаления атрибута.Please open Telegram to view this post
VIEW IN TELEGRAM
👍26
Спросят с вероятностью 7%
Замыкание (closure) в программировании — это функция, которая ссылается на свободные переменные в своей области видимости из внешней области видимости, в которой она была создана, даже если эта внешняя область видимости уже завершила свою работу.
В более простых терминах, замыкание — это функция, которая запоминает значение переменных из той области видимости, в которой она была определена, и продолжает использовать их, даже если эта область видимости уже не активна. Они часто используются для создания функций-фабрик, где каждый вызов такой фабрики создает новое замыкание с доступом к различным контекстам.
Пример:
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10) # Создаем замыкание с x = 10
print(closure(5)) # Вывод: 15
В этом примере
inner_function является замыканием, потому что она ссылается на переменную x из внешней функции outer_function, даже после того, как outer_function завершила свою работу. Каждый раз, когда мы вызываем closure(5), мы получаем результат сложения x (который был 10) и y (который был передан в замыкание, равный 5), что дает нам 15.Замыкания являются мощным и полезным инструментом, который может быть использован для создания гибких и эффективных решений в различных ситуациях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🤯11❤1🤔1
Спросят с вероятностью 17%
Магические методы - это специальные методы, начинающиеся и заканчивающиеся двумя подчеркиваниями (
__), которые предоставляют специальное поведение объектам при использовании встроенных операторов или функций. Они также называются "специальными методами" или "дандер-методами" (от "double underscore").Магические методы позволяют классам определять, как они должны реагировать на различные операции, такие как сложение (
+), вычитание (-), вызов функции (()), получение длины (len()), преобразование в строку (str()) и многое другое.Вот некоторые примеры магических методов и их предназначение:
-
__init__(self, ...): Инициализация объекта. Вызывается при создании нового экземпляра класса.-
__str__(self): Преобразование объекта в строку. Вызывается функцией str() или при использовании объекта в функциях форматирования строк.-
__repr__(self): Представление объекта. Вызывается функцией repr(), а также при использовании объекта в интерактивной оболочке.-
__add__(self, other): Сложение объектов. Вызывается при использовании оператора +.-
__sub__(self, other): Вычитание объектов. Вызывается при использовании оператора -.-
__len__(self): Получение длины объекта. Вызывается функцией len().-
__getitem__(self, key): Получение элемента по индексу или ключу. Вызывается при использовании оператора [].И это только несколько из множества магических методов, которые можно определить в классе. Использование магических методов делает классы более интегрированными с языком и позволяет использовать их встроенные функциональности более элегантным и естественным способом.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26
Спросят с вероятностью 7%
Модуль — это файл с расширением
.py, который содержит код. Он может содержать переменные, функции и классы, которые можно использовать в других программах или модулях.Модули используются для организации кода, упрощения его поддержки и повторного использования. Они позволяют разбить код на отдельные логические блоки, что делает его более структурированным и управляемым.
Пример:
# Модуль example_module.py
def greet(name):
return f"Привет, {name}!"
def add(x, y):
return x + y
class Person:
def init(self, name):
self.name = name
def say_hello(self):
return f"Привет, меня зовут {self.name}"
Этот код определяет модуль с именем
example_module.py, который содержит функции greet() и add(), а также класс Person. После того, как этот модуль был создан, его можно импортировать в другие скрипты с помощью ключевого слова import:import example_module
print(example_module.greet("Миша")) # Вывод: Привет, Миша!
print(example_module.add(2, 3)) # Вывод: 5
person = example_module.Person("Анна")
print(person.say_hello()) # Вывод: Привет, меня зовут Анна
Модули представляют собой важный механизм организации кода и его повторного использования, а также обеспечивают удобство и поддерживаемость проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20❤3🔥1
Спросят с вероятностью 17%
Типы данных делятся на изменяемые (mutable) и неизменяемые (immutable) в зависимости от того, можно ли изменять значения объектов этого типа после их создания. Вот общее разделение:
Изменяемые типы данных (Mutable):
1️⃣ Списки (List): Элементы могут быть изменены после его создания. Это значит, что вы можете добавлять, удалять или изменять элементы списка без создания нового списка.
2️⃣ Словари (Dictionary): Элементы могут быть изменены после его создания. Вы можете добавлять, удалять или изменять пары ключ-значение словаря.
3️⃣ Множества (Set): Элементы множества могут быть изменены после его создания. Вы можете добавлять или удалять элементы из множества.
Неизменяемые типы данных (Immutable):
1️⃣ Строки (String): Строки являются неизменяемыми. Вы не можете изменить отдельные символы строки после ее создания.
2️⃣ Кортежи (Tuple): Кортежи также неизменяемы. Вы не можете изменить элементы кортежа после его создания.
3️⃣ Числовые типы (int, float, complex): Числовые типы данных также неизменяемы. Вы не можете изменить значения чисел после их создания.
4️⃣ Неизменяемые версии структур данных: Некоторые библиотеки, такие как
collections.namedtuple, предоставляют неизменяемые версии структур данных.Изменяемые типы данных могут быть полезны для хранения и изменения коллекций данных, в то время как неизменяемые типы данных обеспечивают безопасность данных и подходят для хранения значений, которые не должны изменяться после создания.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤3
Спросят с вероятностью 17%
List comprehension - это конструкция, которая позволяет создавать списки на основе других последовательностей (например, списков, кортежей, множеств) более компактно и читаемо.
Синтаксис list comprehension выглядит следующим образом:
[выражение for элемент in последовательность if условие]
В расширенной форме:
[выражение for элемент in последовательность]
где:
-
выражение - это выражение, которое будет применено к каждому элементу последовательности.-
элемент - это переменная, представляющая текущий элемент последовательности.-
последовательность - это исходная последовательность, по которой будет проходить итерация.-
условие (необязательно) - это условие, которое фильтрует элементы последовательности.Примеры использования list comprehension:
1️⃣ Создание списка квадратов чисел от 0 до 9:
squares = [x**2 for x in range(10)]
2️⃣ Фильтрация списка, оставляя только четные числа:
even_numbers = [x for x in range(10) if x % 2 == 0]
3️⃣ Преобразование списка строк в список их длин:
strings = ["apple", "banana", "orange"]
lengths = [len(s) for s in strings]
List comprehension делает код более кратким и выразительным, особенно для простых преобразований и фильтраций данных. Однако не следует злоупотреблять им, чтобы избежать снижения читаемости кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤4
Спросят с вероятностью 7%
Термин "args" обычно используется для обозначения необязательного параметра функции, который позволяет передавать произвольное количество позиционных аргументов в функцию. Он является соглашением об именовании и может быть заменен на любое другое имя, но часто используется именно "args" для означения этого параметра.
Этот необязательный параметр обычно представляет собой кортеж (tuple) аргументов, переданных в функцию. Поскольку функция может принимать произвольное количество аргументов, он позволяет обрабатывать их динамически.
Пример использования:
def sum_values(*args):
total = 0
for num in args:
total += num
return total
result = sum_values(1, 2, 3, 4, 5)
print(result) # Вывод: 15
В этом примере `*args` позволяет функции принимать любое количество аргументов, которые будут представлены в виде кортежа. Функция затем проходит по всем элементам кортежа и суммирует их, возвращая общее значение.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤3
Спросят с вероятностью 7%
MRO2 (Method Resolution Order 2) и MRO3 (Method Resolution Order 3) являются алгоритмами разрешения порядка вызова методов в множественном наследовании. Эти алгоритмы используются для определения того, какой метод будет вызван при обращении к методу экземпляра класса, когда этот метод присутствует в нескольких классах, связанных цепочкой наследования.
Основное отличие между MRO2 и MRO3 заключается в том, как они обрабатывают классы, которые имеют одинаковые имена методов в цепочке наследования.
1️⃣ MRO2 (Python 2): В Python 2 использовался алгоритм MRO2, который был основан на алгоритме C3 Linearization. Он приводил к проблемам с алгоритмическими рекурсивными зависимостями в некоторых случаях множественного наследования, особенно когда классы имели сложные структуры наследования.
2️⃣ MRO3 (Python 3): В Python 3 был заменен на более усовершенствованный алгоритм MRO3, который является модифицированным алгоритмом C3 Linearization. Он решает проблемы, связанные с амбигуитетом при разрешении порядка вызова методов в множественном наследовании и обеспечивает более предсказуемое поведение в таких случаях.
Основным преимуществом MRO3 является его способность разрешать конфликты имен методов в множественном наследовании более точно и надежно, что упрощает и смягчает проблемы, связанные с неоднозначностью при определении порядка вызова методов. Это позволяет разработчикам писать более структурированный и надежный код с использованием множественного наследования.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯15👍2🤔2🔥1
Какие есть основные методы HTTP ?
Спросят с вероятностью 13%
Основные методы HTTP, которые широко используются при взаимодействии с веб-серверами, включают следующие:
1️⃣ GET: Запрашивает представление ресурса. GET-запросы обычно используются для получения данных от сервера. Они могут быть кэшированы и остаются в истории браузера. Они ограничены в размере.
2️⃣ POST: Отправляет данные для обработки на сервере. POST-запросы часто используются для отправки данных HTML-формы на сервер для обработки. Они не кэшируются и не остаются в истории браузера. Они могут отправлять большие объемы данных.
3️⃣ PUT: Загружает содержимое запроса на указанный URI. Если ресурс существует, он перезаписывается. Если ресурс не существует, сервер может создать его с использованием предоставленных данных.
4️⃣ DELETE: Удаляет указанный ресурс.
5️⃣ PATCH: Применяет частичные модификации к ресурсу. Обычно используется для обновления ресурса с частичными данными.
6️⃣ HEAD: Запрашивает заголовки, которые будут возвращены, как если бы был сделан запрос GET, но без тела ответа.
7️⃣ OPTIONS: Используется для запроса возможностей и параметров коммуникации для указанного ресурса.
8️⃣ TRACE: Используется для тестирования соединения по маршруту к ресурсу. Он выполняет циклический обход маршрутизации, который включает в себя передачу запроса через все узлы маршрута.
Это основные методы HTTP, но также существуют и другие, менее используемые. Понимание этих методов важно при разработке веб-приложений и работы с веб-серверами.
➡️ Примеры ответов
➡️ Список всех вопросов на Python Developer
🧩 Идущий | 🔐 Собесы | 🔐 Тестовые
Спросят с вероятностью 13%
Основные методы HTTP, которые широко используются при взаимодействии с веб-серверами, включают следующие:
1️⃣ GET: Запрашивает представление ресурса. GET-запросы обычно используются для получения данных от сервера. Они могут быть кэшированы и остаются в истории браузера. Они ограничены в размере.
2️⃣ POST: Отправляет данные для обработки на сервере. POST-запросы часто используются для отправки данных HTML-формы на сервер для обработки. Они не кэшируются и не остаются в истории браузера. Они могут отправлять большие объемы данных.
3️⃣ PUT: Загружает содержимое запроса на указанный URI. Если ресурс существует, он перезаписывается. Если ресурс не существует, сервер может создать его с использованием предоставленных данных.
4️⃣ DELETE: Удаляет указанный ресурс.
5️⃣ PATCH: Применяет частичные модификации к ресурсу. Обычно используется для обновления ресурса с частичными данными.
6️⃣ HEAD: Запрашивает заголовки, которые будут возвращены, как если бы был сделан запрос GET, но без тела ответа.
7️⃣ OPTIONS: Используется для запроса возможностей и параметров коммуникации для указанного ресурса.
8️⃣ TRACE: Используется для тестирования соединения по маршруту к ресурсу. Он выполняет циклический обход маршрутизации, который включает в себя передачу запроса через все узлы маршрута.
Это основные методы HTTP, но также существуют и другие, менее используемые. Понимание этих методов важно при разработке веб-приложений и работы с веб-серверами.
➡️ Примеры ответов
➡️ Список всех вопросов на Python Developer
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍4🤔1