Python Core Part II [407] Flashcards

1
Q

В чем разница между методами и конструкторами?

A

В Python конструктор - это метод, который вызывается при создании экземпляра (инстанцировании) класса. Он имеет имя __init__ и может принимать параметры. Конструктор используется для инициализации объекта, задания начальных значений атрибутов объекта, и выполнения других операций, необходимых при создании объекта.

Методы, с другой стороны, являются функциями, которые могут выполнять определенные операции с объектом, изменять его состояние или возвращать результат. Они определяются внутри класса и могут вызываться на экземпляре объекта этого класса.

Таким образом, разница между конструкторами и методами заключается в том, что конструктор вызывается при создании экземпляра класса и используется для инициализации объекта, а методы вызываются на экземпляре класса и могут выполнять операции с объектом или возвращать результат.

Пример класса с конструктором и методом:
```py
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def introduce(self):
    print(f"My name is {self.name} and I am {self.age} years old.")

Создать экземпляр класса Person и вызвать метод introduce()
person = Person(“Alice”, 25)
person.introduce()
~~~
Этот код создаст экземпляр класса Person с именем Alice и возрастом 25, а затем вызовет метод introduce(), который напечатает строку “My name is Alice and I am 25 years old.”

Методы:
+ Имя метода может быть любым.
+ По отношению к одному объекту один метод может быть вызван для ‘n’ членов строк
+ Методы используются для представления бизнес-логики для выполнения операций.

Конструктор:
+ Конструктор будет выполняться автоматически всякий раз, когда мы создаем объект.
+ Применительно к одному объекту один конструктор может быть выполнен только один раз
+ Конструкторы используются для определения и инициализации нестатической переменной.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что такое инкапсуляция?

A

Инкапсуляция - это принцип объектно-ориентированного программирования, который позволяет скрыть внутреннюю реализацию класса от пользователя и защитить данные класса от прямого доступа.

В Python инкапсуляция реализуется с помощью использования двойных подчеркиваний перед именами атрибутов или методов класса, которые должны быть скрыты. Одинарное подчеркивание говорит о том, что атрибут не должен быть использован за пределами класса, но его можно получить. Двойное подчеркивание делает атрибут или метод частным (private).

Например, вот пример класса, который использует инкапсуляцию:
```py
class Person:
def __init__(self, name, age):
self.__name = name # приватный атрибут, имя
self.__age = age # приватный атрибут, возраст

def get_name(self):
    return self.\_\_name

def get_age(self):
    return self.\_\_age

def set_name(self, name):
    self.\_\_name = name

def set_age(self, age):
    self.\_\_age = age ~~~ В этом примере класс Person имеет приватные атрибуты \_\_name и \_\_age, которые могут быть получены или изменены только через публичные get и set методы. Любая попытка прямого доступа к этим атрибутам извне класса приведет к ошибке.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Выполнение команд DML через программы Python?

A

Можно выполнять команды DML (Data Manipulation Language) в программе, используя различные библиотеки, такие как Psycopg2 для баз данных PostgreSQL или sqlite3 для баз данных SQLite. Эти библиотеки обеспечивают соединение с базой данных и методы для выполнения запросов к ней, включая запросы SELECT, INSERT, UPDATE и DELETE. Вот пример использования Psycopg2 для выполнения запроса INSERT в базу данных PostgreSQL:
```py
import psycopg2

conn = psycopg2.connect(“dbname=mydatabase user=myuser”)
cur = conn.cursor()
cur.execute(“INSERT INTO mytable (column1, column2, column3) VALUES (%s, %s, %s)”, (value1, value2, value3))
conn.commit()
~~~
А вот пример использования sqlite3 для выполнения запроса SELECT в базе данных SQLite:
```py
import sqlite3

conn = sqlite3.connect(‘example.db’)
cur = conn.cursor()
cur.execute(‘SELECT * FROM mytable’)
results = cur.fetchall()
~~~
Обратите внимание, что необходимо заменить mydatabase, myuser, mytable и т.д. на соответствующие значения для вашей базы данных.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое жизненный цикл потоков?

A

Обычно, вы создаете поток, создаётся объект типа Thread или его наследник. После создания потока, вы можете запустить его методом start(), который вызывает метод run() в новом потоке. Когда метод run() завершается, поток переходит в состояние terminated и его жизненный цикл завершается.

Жизненный цикл потоков (thread lifecycle) в Python описывает состояния, на которые может переходить поток от момента его создания до завершения работы. Основные состояния потока в Python включают:

+ Создание (creation): Поток создается, но еще не запущен.

+ Готовность (ready): Поток готов к выполнению, но еще не начал свою работу (ожидает времени для выполнения).

+ Выполнение (running): Поток начинает выполнять свою работу.

+ Ожидание (waiting): Поток ожидает какого-то условия для возобновления своей работы (например, ожидание события).

+ Блокировка (blocked): Поток блокирован и ожидает освобождения ресурсов (например, блокировка при попытке получения GIL).

+ Завершение (termination): Поток выполнил свою работу и завершил свою работу.

Методы, которые могут изменить состояние потока, включают в себя start(), sleep(), join(), wait(), и notify(). Кроме того, модуль threading позволяет использовать более продвинутые механизмы управления потоками, такие как блокировки и семафоры.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое планирование?

A

Планирование (или планирование задач) в Python - это процесс автоматизации запуска скриптов или выполнения функций в определенное время или по расписанию. Встроенный модуль Python для этого называется sched, и он позволяет создавать простые планировщики задач, чтобы выполнять функции с указанным интервалом времени. Например:
```py
import time
import sched

создаем объект класса sched.scheduler
s = sched.scheduler(time.time, time.sleep)

определяем функцию, которую хотим выполнить
def print_msg(msg):
print(“Сообщение:”, msg)

планируем выполнение функции через 5 секунд
s.enter(5, 1, print_msg, argument=(“Привет”,))

запускаем планировщик задач
s.run()
~~~

Этот код планирует выполнение функции print_msg() через 5 секунд, и после этого функция выводит сообщение “Сообщение: Привет”. Вы можете изменить задержку и функцию, которую хотите выполнить, в зависимости от ваших потребностей. Кроме sched, есть также более продвинутые сторонние библиотеки для планирования задач, например Celery и APScheduler.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Цикл for реализован на языке python следующим образом:

A

```py
for element in iterable:
iter-obj=iter(iterable)
while true:
try:
element=next(iter_obj)
except(slop iteration)
break
~~~

Цикл For принимает данный объект, преобразует этот объект в форму итерируемого объекта и получает один за другим элемент из итерируемого объекта.

При получении элемента по значению из итерируемого объекта, если возникает исключение остановки итерации, тогда для цикла внутренне обрабатывается это исключение

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Для чего нужен OS Module? Приведите примеры.

A

Модуль OS - это модуль в Python, который предоставляет множество функций для работы с операционной системой. Он позволяет выполнять такие действия, как создание, удаление и переименование файлов и папок, получение информации о файлах и папках, работа с переменными окружения и многое другое.

Вот несколько примеров использования модуля OS:

+ Получение текущей директории
```py
import os

current_directory = os.getcwd()
print(“Current directory:”, current_directory)
~~~
+ Создание новой папки
```py
import os

new_folder = os.path.join(os.getcwd(), “new_folder”)
os.mkdir(new_folder)
print(“New folder created!”)
~~~
+ Получение списка файлов в директории
```py
import os

directory = os.getcwd()
file_list = os.listdir(directory)
print(“Files in”, directory, “:”, file_list)
~~~
+ Удаление файла

```py
import os

file_path_to_delete = “path/to/file.txt”
os.remove(file_path_to_delete)
~~~
+ Переименование файла
```py
import os

old_file_name = “old_name.txt”
new_file_name = “new_name.txt”

os.rename(old_file_name, new_file_name)
~~~
+ Запуск внешней программы:
```py
import os

os.system(“notepad.exe”)

\+ Проверка существования файла или директории:
```py
import os
if os.path.exists('path/to/file_or_dir'):
    print('File or dir exists')
else:
    print('File or dir does not exist')

+ Обход всех файлов в директории и ее поддиректориях:
```py
import os
for root, dirs, files in os.walk(‘/path/to/dir’):
for file in files:
file_path = os.path.join(root, file)
print(file_path)

~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое приложения Python?

A

Python — чрезвычайно универсальный язык программирования с широким спектром практических приложений. Вот некоторые примеры:

+ Веб-разработка: Python — популярный выбор для сред веб-разработки, таких как Django и Flask.

+ Наука о данных: Python имеет множество библиотек и инструментов, которые позволяют ученым данных эффективно анализировать, визуализировать и манипулировать данными. Популярные библиотеки включают Pandas, NumPy и Matplotlib.

+ Машинное обучение и искусственный интеллект: Python стал ведущим языком разработки ИИ с такими популярными платформами, как TensorFlow, PyTorch и Keras.

+ Научные вычисления: Python имеет множество библиотек для научных вычислений, таких как SciPy, которые используются учеными для моделирования и анализа сложных систем.

+ Разработка игр: Python имеет библиотеки и фреймворки для разработки игр, такие как Pygame.

+ Настольные приложения с графическим интерфейсом: Python можно использовать для разработки кроссплатформенных настольных приложений с такими библиотеками, как PyQt и wxPython.

+ Сетевое программирование: стандартная библиотека Python включает модули для программирования сокетов и протоколов, таких как HTTP и FTP.

+ Образование: Python широко используется во многих учебных заведениях для обучения методам решения проблем и концепциям программирования.

В целом, Python используется в самых разных приложениях, и его популярность обусловлена ​​простотой использования, гибкостью и универсальностью языка программирования.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Как интерпретируется Python?

A

Язык Python является интерпретируемым языком. Программа Python запускается непосредственно из исходного кода. Он преобразует исходный код, написанный программистом, в промежуточный язык, который снова переводится на машинный язык, который должен быть выполнен.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Какие инструменты помогают находить ошибки или проводить статический анализ?

A

Для нахождения ошибок и проведения статического анализа в Python существует ряд инструментов. Некоторые из них:

+ PyChecker — это инструмент статического анализа, который обнаруживает ошибки в исходном коде Python и предупреждает о стиле и сложности ошибки.

+ Pylint - это популярный инструмент статического анализа кода Python, который может проверять на соответствие PEP 8, выдавать предупреждения о неиспользуемом коде, проверять типы и т.д.

+ Flake8 - это инструмент, объединяющий Pylint, McCabe и PyFlakes, который может использоваться для проведения проверки стиля кода и анализа ошибок.

+ PyCharm - это интегрированная среда разработки Python, которая предоставляет инструменты для проведения статического анализа кода, включая проверку на соответствие PEP 8, поиск ошибок и оптимизации кода.

+ mypy - это инструмент статической проверки типов для Python, который позволяет обнаруживать ошибки ввода-вывода, предоставляя подробную информацию о типах данных в вашем коде.

+ Bandit - это инструмент безопасности, который может использоваться для поиска уязвимостей в коде Python.

+ Prospector - это инструмент, который проводит статический анализ Python-кода и выводит информацию о качестве кода, стиле кода, нормах отступов и т.д.

+ PyLintBear - это инструмент планирования и прогнозирования ошибок Python, разработанный на основе Pylint, который может поставляться с конфигурируемыми медведями, которые можно использовать для поиска и исправления ошибок.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое pass в Python?

A

В Python pass - это оператор-заглушка, который ничего не делает. Его можно использовать в тех местах, где синтаксически требуется оператор, но никакого действия выполнять не нужно. pass часто используется вместо пустых блоков кода в конструкциях if/else, циклах, функциях, классах, чтобы пока сохранить структуру кода, не реализуя еще какую-то логику. Пример:
```py
if x == 1:
pass # временно заглушка
else:
print(“not 1”)
~~~
В таком примере pass не выполняет никаких действий и не вносит изменений в программу, он просто позволяет коду работать без ошибок. Однако, его можно заменить на любой другой оператор, когда потребуется реализовать какую-то логику внутри этого блока кода.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Что такое итераторы в Python?

A

Итератор в Python - это объект, который позволяет проходить по элементам коллекции или последовательности данных, такой как список, кортеж или словарь, и получать доступ к каждому элементу. Он работает по принципу получения следующего элемента, пока элементы не закончатся. Итераторы реализуют методы __iter__() и __next__(), который возвращает следующий элемент последовательности при каждом вызове.

Пример использования итератора в Python:
```py
my_list = [1, 2, 3]
my_iter = iter(my_list)
print(next(my_iter)) # выводит 1
print(next(my_iter)) # выводит 2
print(next(my_iter)) # выводит 3
~~~
В Python существует множество встроенных итерируемых объектов, таких как range и строки, а также можно создавать пользовательские итераторы, используя классы и реализуя методы __iter__() и __next__(). Итераторы позволяют проходить по коллекции данных без хранения всех элементов в памяти, что полезно при работе с большими объемами данных или потоками данных.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Что такое slicing в Python?

A

Slicing - это механизм выбора подстроки из последовательности, например, строки, списка или кортежа (list, tuple). Он основывается на использовании квадратных скобок и двоеточий [], которые могут принимать три параметра [start:stop:step], что делает возможным выбор только определенного диапазона элементов.

Основные правила slicing в Python:

start - индекс символа начала выборки (включая его). Если не указан, значит выборка начинается с самого начала.

stop - индекс символа окончания выборки (не включая его). Если не указан, выборка продолжается до конца последовательности.

step - опциональный параметр для указания шага изменения индексов.

Примеры использования:

py
str = "Hello world"
print(str[0:5])  # выведет "Hello"
print(str[6:])   # выведет "world"
~~~
py
list = [1, 2, 3, 4, 5]
print(list[1:3]) # выведет [2, 3]
print(list[::2]) # выведет [1, 3, 5]
~~~
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что такое генераторы в Python?

A

Генераторы - это функции, которые могут приостанавливать своё выполнение (с помощью ключевого слова yield) и возвращать промежуточный результат. Вместо того, чтобы возвращать результат целиком как обычная функция, генераторы возвращают итератор, который может быть использован для последовательного получения промежуточных результатов. Это делает генераторы мощными инструментами для работы с большими наборами данных, поскольку они позволяют работать с данными по мере их поступления, а не ждать завершения обработки всего набора.

Вот пример генератора, который генерирует все квадраты чисел от 1 до n включительно:
```py
def squares(n):
for i in range(1, n+1):
yield i*i

for x in squares(5):
print(x)
~~~
Этот код выведет:

```py
1
4
9
16
25
~~~
Оператор yield здесь приостанавливает выполнение функции, возвращая очередной квадрат числа, после чего функция продолжает выполнение с того же места, где остановилась на предыдущей итерации цикла. Каждый раз, когда функция доходит до ключевого слова yield, она приостанавлвает своё выполнение, возвращая промежуточный результат в основную программу. При следующем вызове функции она продолжает работу с точки, где остановилась на предыдущей итерации цикла, и так далее, пока не достигнет конца функции.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое итератор?

A

Итератор - это объект в Python, который может быть пройден (или перебран) в цикле for. Итераторы очень похожи на коллекции: они также могут содержать набор элементов. Однако, в отличие от коллекций, итераторы не могут быть проиндексированы или скопированы напрямую. Вместо этого, они используют метод __next__() для возврата следующего элемента последовательности. Когда все элементы итератора были перебраны, вызов метода __next__() вызывает исключение StopIteration.

Например, рассмотрим следующий код, который создает итератор my_iter, проходит по его элементам и выводит их на экран:

py
my_list = [1, 2, 3]
my_iter = iter(my_list)
while True:
    try:
        # Получить следующий элемент из итератора
        element = next(my_iter)
        print(element)
    except StopIteration:
        # Если все элементы были перебраны, выйти из цикла
        break
~~~
Вывод:
py
1
2
3
~~~
Здесь мы используем функцию iter() для создания итератора из списка my_list и метод next() для получения следующего элемента из итератора. Когда все элементы были перебраны, метод next() вызывает исключение StopIteration, и мы выходим из цикла while.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Объясните генераторы и итераторы в python?

A
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Как вы можете скопировать объект в Python?

A

Можно скопировать объект, используя конструкторы копирования или методы копирования, такие как copy() или deepcopy() модуля copy, или используя операцию среза. Например, для создания поверхностной копии объекта можно использовать срез:

py
original_list = [1, 2, 3]
new_list = original_list[:]
~~~
Для создания глубокой копии объекта можно использовать функцию deepcopy():
py
import copy

original_dict = {‘a’: [1, 2, 3], ‘b’: {‘c’: 4}}
new_dict = copy.deepcopy(original_dict)
~~~
Это создаст новый словарь new_dict, который будет глубоко скопирован с original_dict.

Часто используется метод .copy() для поверхностного копирования, который создает новый объект, содержащий ссылки на те же элементы, что и исходный объект:
```py
original_dict = {‘a’: [1, 2, 3], ‘b’: {‘c’: 4}}
new_dict = original_dict.copy()
~~~
Это приведет к созданию нового словаря new_dict, который будет содержать ссылки на те же элементы, что и original_dict.

Также можно использовать конструкторы копирования для создания новых объектов с теми же значениями. Например, для создания новой копии списка можно использовать следующий код:
```py
original_list = [1, 2, 3]
new_list = list(original_list)
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Как преобразовать число в строку?

A

Для преобразования числа в строку можно использовать функцию str(). Например:

py
x = 10
s = str(x)
print(s) # выводит строку '10'
~~~
Также, при использовании строковых операций с числами, Python автоматически производит преобразование числа в строку. Например:
py
x = 10
s = ‘Number: ‘ + str(x)
print(s) # выводит строку ‘Number: 10’
~~~
Если необходимо преобразовать строку в число, то можно использовать функцию int(). Например:
```py
s = ‘10’
x = int(s)
print(x) # выводит число 10
~~~
Но следует учитывать, что если строка не содержит числовых символов, вызов int() приведет к ошибке.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Что такое модуль и пакет в Python?

A

Что такое модуль и пакет в Python?

Модуль - это файл, содержащий код с определенным функционалом, который можно загрузить и использовать в других программах.

Пакет - это способ организации модулей вместе в одном месте. Пакеты могут содержать другие пакеты, а также модули.

Для создания пакета необходимо создать директорию с именем пакета, содержащую файл __init__.py. Файл __init__.py может быть пустым, либо содержать инициализирующий код для пакета. Модули внутри пакета могут быть импортированы с помощью конструкции import package.module. Это удобный способ организации больших проектов на Python и позволяет легко импортировать и использовать код из других частей программы.

Использование пакетов и модулей в Python упрощает организацию и поддержку кода, так как позволяет разбить приложение на небольшие и понятные блоки, которые можно разрабатывать отдельно, тестировать и поддерживать.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Расскажите, каковы правила для локальных и глобальных переменных в Python?

A

+ Локальные переменные в функции видны только внутри этой функции. Они не могут быть использованы вне функции или в другой функции.

py
def my_function():
    my_var = 42
    print(my_var)
my_function() # Выведет 42
print(my_var) # Ошибка, my_var не определена.
~~~
\+ Глобальные переменные определяются за пределами функции и могут быть использованы в любой части программы, включая функции.
py
my_global_var = 42
def my_function():
print(my_global_var)
my_function() # Выведет 42
print(my_global_var) # Выведет 42
~~~

+ Объявление переменной в функции как global делает эту переменную видимой для всех функций и главной программы.

py
def my_function():
    global my_var
    my_var = 42
my_function() # my_var будет доступна вне функции
print(my_var) # Выведет 42
py
+ Если переменная не была определена внутри функции, Python будет искать ее во внешней области видимости и, если найдет, будет использовать эту переменную внутри функции. Если переменная не будет найдена, это приведет к ошибке.
~~~
my_var = 42
def my_function():
print(my_var)
my_function() # Выведет 42
~~~
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Как вы можете использовать глобальные переменные в модулях?

A

В модулях Python глобальные переменные могут быть объявлены с помощью ключевого слова global. Это позволяет функциям в модуле изменять значение глобальных переменных, определенных в этом же модуле.

Например, если у вас есть модуль mod.py, содержащий глобальную переменную counter и функцию increment_counter, которая увеличивает значение счетчика на 1, то вы можете использовать global для того, чтобы эта функция могла изменить значение глобальной переменной:
```py
# mod.py
counter = 0

def increment_counter():
global counter
counter += 1
~~~
Теперь, если импортировать модуль в другой файл и вызвать функцию increment_counter, это приведет к увеличению значения счетчика на 1:
```py
# main.py
import mod

print(mod.counter) # 0
mod.increment_counter()
print(mod.counter) # 1
~~~
Также можно использовать имена модулей в качестве пространств имен для глобальных переменных, которые могут быть использованы в других файлах.
```py
# mod.py
app_count = 0

def increment_counter():
global app_count
app_count += 1

main.py
import mod

print(mod.app_count) # 0
mod.increment_counter()
print(mod.app_count) # 1
~~~
Внимание, что использование глобальных переменных может быть опасно, если они используются неправильно, поэтому лучше использовать их в ограниченном объеме и с осторожностью.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Объясните, как удалить файл в Python?

A

Чтобы удалить файл в Python, можно использовать метод os.remove() из модуля os.
```py
import os
os.remove(‘filename.txt’) # замените filename.txt на имя вашего файла
~~~
Однако, убедитесь, что у вас есть необходимые разрешения на удаление файла.

Если вам нужно также удалить пустую директорию, то вы можете использовать os.rmdir(). Если директория не пуста, вы должны использовать shutil.rmtree() чтобы удалить её вместе с содержимым.
```py
import os
import shutil

удаление директории если она пустая
os.rmdir(‘directory_name’) # замените directory_name на имя вашей директории

удаление директории со всем содержимым
shutil.rmtree(‘directory_name’) # замените directory_name на имя вашей директории
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

Использование оператора // в Python?

A

Оператор // в языке программирования Python используется для целочисленного деления (то есть возвращает только целую часть результата деления). Например:
```py
»> 5 // 2
2
»> 7 // 3
2
~~~
В обоих случаях результат деления округляется в меньшую сторону до ближайшего целого числа, так как до этого вычисления происходит простое целочисленное деление. Этот оператор поможет вам получить только целую часть результата деления, без остатка, что может быть полезно в некоторых случаях.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Q

Назовите пять преимуществ использования Python?

A

+ Простота и читаемость кода, благодаря удобному синтаксису.

+ Кроссплатформенность, что позволяет запускать программы на различных операционных системах без изменения кода.

+ Большое количество библиотек, которые покрывают множество областей, от научных вычислений до веб-разработки.

+ Интерактивный режим, который позволяет быстро прототипировать и отлаживать код.

+ Сильная поддержка сообщества, которое разрабатывает и поддерживает множество бесплатных инструментов и библиотек.

+ Возможность использования Python во многих областях, включая научные и исследовательские проекты, веб-разработку, машинное обучение и автоматизацию задач.

+ Высокая производительность, благодаря оптимизированным интерпретаторам, промежуточным языкам и JIT-компиляторам.

+ Хорошая масштабируемость и возможность создания больших и сложных проектов.

+ Поддержка различных парадигм программирования, включая объектно-ориентированное, функциональное и процедурное программирование.

+ Большое количество обучающих ресурсов и курсов, которые помогают быстро и эффективно изучать язык.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
25
Q

Укажите, в чем разница между Django, Pyramid и Flask?

A

Django, Pyramid и Flask - это все web-фреймворки для Python, предназначенные для разработки веб-приложений. Некоторые из основных различий между ними:

+ Django - наиболее полнофункциональный из этих фреймворков, с множеством встроенных возможностей, таких как ORM, система аутентификации и авторизации, админ-панель и т.д. Он предназначен для создания сложных web-приложений и подходит для больших команд разработчиков.

+ Pyramid - более легковесный фреймворк, не имеет встроенных возможностей, таких как ORM или админ-панель, это позволяет разработчикам самостоятельно настраивать и интегрировать необходимые инструменты. Pyramid - это хороший выбор для проектов с нестандартными требованиями и высокой степенью индивидуализации.

+ Flask - самый легковесный из этих трех фреймворков. Flask - это минимальный фреймворк, который может быть использован для создания простых веб-приложений. Flask обеспечивает только базовый функционал, и вам нужно установить и настроить все необходимые инструменты самостоятельно. Flask хорошо подходит для простых проектов, которые не требуют многих функций и имеющих ограниченное время на разработку.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
26
Q

Объясните, как вы можете свести к минимуму простои сервера Memcached при разработке Python?

A

Memcached это бесплатная система кэширования данных в памяти. Она используется для ускорения доступа к данным, которые часто запрашиваются из базы данных или других источников. Memcached хранит данные в оперативной памяти, что позволяет быстро получать к ним доступ и уменьшать количество запросов к базе данных, что в свою очередь ускоряет работу приложений. Memcached работает в формате клиент-сервер, где клиенты отправляют запросы на чтение или запись данных, а серверы хранят и обрабатывают эти запросы. Memcached широко используется веб-приложениями для ускорения доступа к часто используемым данным, таким как HTML-страницы, изображения, результаты запросов к базе данных и т.д.

Для минимизации простоя сервера Memcached при разработке на Python можно использовать библиотеку pymemcache, которая обеспечивает клиент для взаимодействия с Memcached.

Чтобы избежать повторной загрузки данных из базы данных или другого источника, кэшированные данные можно добавить в сервер Memcached и получить их оттуда при последующих запросах. Для этого нужно установить соединение с сервером Memcached по IP-адресу и порту, и затем использовать методы get и set объекта, чтобы получить или установить данные:
```py
from pymemcache.client import base

create a client instance to connect to the Memcached server
client = base.Client((‘localhost’, 11211)) # replace with your server’s IP and port

set data in cache
client.set(key, value, expire_time_in_seconds)

get data from cache
data = client.get(key)
~~~
Здесь key - строковый ключ для сохранения данных, value - данные, которые должны быть сохранены, и expire_time_in_seconds - время в секундах, через которое данные должны быть удалены из кэша.

Использование кэширования помогает уменьшить нагрузку на сервер и ускорить обработку запросов в приложении.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
27
Q

Объясните, что такое эффект Dogpile? Как можно предотвратить этот эффект?

A

Эффект Dogpile (дрожание кучи) - это ситуация, когда множество запросов кэшу приложения истекают практически одновременно. При этом каждый запрос, который не прошел проверку на наличие в кэше, приводит к обращению к базе данных или другому источнику данных, чтобы получить нужные данные. Это может привести к перегрузке базы данных и снижению производительности приложения.

Чтобы предотвратить эффект Dogpile, можно использовать технику “мьютекс” или “замок”. В этом подходе каждый запрос блокирует доступ к данным, пока не завершится процесс обновления кэша. Таким образом, множество параллельных запросов к кэшу преобразуется в последовательные блокирующие запросы, что позволяет предотвратить загрузку базы данных и сократить время ожидания ответа пользователей.

В Python для реализации этого подхода можно использовать библиотеку dogpile.cache, которая включает в себя реализацию этой техники и предоставляет удобный API для работы с кэшем.

Чтобы предотвратить эффект Dogpile, можно использовать механизмы, такие как мьютексы, чтобы только один поток запроса запрашивал данные с бэкенда, пока другие потоки просто ждут, пока данные не будут доступны в кэше.

Вот пример, как можно предотвратить эффект Dogpile в Python с помощью мьютексов:
```py
import threading

def get_data(key):
# Проверить кеш
data = CACHE.get(key)
if data is not None:
return data

# Получите блокировку и снова проверьте кеш
with LOCK:
    data = CACHE.get(key)
    if data is not None:
        return data

    # Если данные по-прежнему недоступны, извлеките их из бэкэнда.
    data = fetch_data_from_backend(key)
    CACHE[key] = data
return data ~~~ В этом примере используется глобальный словарь CACHE для хранения данных и мьютекс LOCK, который удерживается для одновременного доступа к критической секции кода. При первом обращении поток ждет, пока функция fetch_data_from_backend() не вернет данные. Дальше, другие потоки могут получить данные из кэша, пока данные не устареют.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
28
Q

Объясните, почему Memcached не следует использовать в вашем проекте Python?

A

Memcached не всегда является наилучшим выбором для проектов Python. Он может иметь сложности с масштабируемостью, особенно когда кэшируемые данные не помещаются в оперативную память. Кроме того, его использование может привести к проблемам с устареванием данных, если они не обновляются или не удаляются из кэша вовремя.

Если вы не уверены, что Memcached подходит для вашего проекта Python, рекомендуется тщательно рассмотреть альтернативные варианты кэширования данных, такие как Redis или Couchbase, и выбрать тот, который лучше всего соответствует вашир требованиям и потребностям.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
29
Q

У вас есть несколько серверов Memcache под управлением Python, на которых один из серверов memcacher выходит из строя, и у него есть ваши данные, будет ли он когда-нибудь пытаться получить ключевые данные с этого одного из вышедших из строя серверов?

A

По умолчанию Memcached настроен так, чтобы не пытаться получить данные с неработающих серверов. Когда один из серверов Memcached выходит из строя, задача администратора заключается в том, чтобы удалить этот сервер из кольцевой конфигурации, чтобы данные на этом сервере больше не использовались. Обычно это делается с помощью утилиты для управления Memcached, такой как Memcached Manager или Memcached Control. После удаления неработающего сервера из группы все запросы на ключи будут перенаправлены на оставшиеся работающие серверы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
30
Q

Объясните, как можно минимизировать отключения Memcached сервера в вашей разработке на Python

A

Чтобы свести к минимуму время простоя сервера Memcached в проекте разработки Python, вы можете выполнить следующие шаги:

+ Используйте клиентскую библиотеку, например python-memcached или pymemcache, для подключения к серверу Memcached из кода Python. Эти библиотеки обрабатывают управление соединениями и позволяют легко выполнять операции с кешем.
+ Реализуйте в коде механизм повторных попыток для обработки ошибок подключения. Это можно сделать, перехватив исключения, выдаваемые клиентской библиотекой, когда ей не удается подключиться, и повторив операцию после ожидания в течение некоторого времени с помощью функции time.sleep().
+ Используйте балансировщик нагрузки, такой как HAProxy или Nginx, для распределения нагрузки между несколькими серверами Memcached. Таким образом, если один сервер выходит из строя, другие могут продолжать обрабатывать запросы и обеспечивать бесперебойную работу пользователей.
+ Отслеживайте состояние серверов Memcached с помощью таких инструментов, как Nagios или Zabbix, и настраивайте оповещения, чтобы уведомлять вас о сбое сервера. Это позволит вам принять незамедлительные меры и минимизировать время простоя.

Выполняя эти шаги, вы можете гарантировать, что сервер Memcached останется в рабочем состоянии, обеспечивая быстрый кэш для вашего приложения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
31
Q

Для чего используется функция List Comprehension в Python?

A

Функция List Comprehension используется для создания новых списков на основе других списков и применения функций к каждому элементу списка. Она представляет собой компактный и выразительный способ создания списков. Вместо того чтобы использовать цикл for для создания нового списка, можно использовать синтаксис в квадратных скобках с указанием выражения, которое нужно применить к каждому элементу списка.

К примеру, следующий код создает список квадратов чисел от 0 до 9, используя цикл for:

py
squares = []
for x in range(10):
    squares.append(x**2)
~~~
Это же самое можно сделать с помощью List Comprehension в одну строку:
py
squares = [x**2 for x in range(10)]
~~~
Также можно добавлять условия в выражение, используя ключевое слово if:
```py
evens = [x for x in range(10) if x % 2 == 0]
~~~
Это создаст список четных чисел от 0 до 9. List Comprehension может быть использована для решения многих задач в Python, когда требуется создать новый список на основе существующего.

Например, создание списка из всех слов с нечетной длиной:
```py
words = [“apple”, “banana”, “orange”, “grapefruit”, “kiwi”]
odd_length_words = [word for word in words if len(word) % 2 != 0]
~~~
Теперь переменная odd_length_words будет содержать список слов с нечетной длиной: [‘apple’, ‘orange’].

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
32
Q

Что такое лямбда-выражения, генераторы списков и выражения-генераторы?

A

Лямбда-выражения, генераторы списков и выражения-генераторы - это особенности языка Python, которые позволяют сократить объем кода и улучшить его читаемость.

+ Лямбда-выражения (lambda expressions) - это анонимные функции, которые можно создавать на лету и использовать в качестве аргументов функций или присваивать переменным. Они особенно полезны для преобразования данных, например в функции map() или filter(). Пример лямбда-выражения:

py
square = lambda x: x**2
print(square(3)) # выводит 9
~~~
\+ Генераторы списков (list comprehensions) - это способ создания списков на основе других списков или итерируемых объектов в более компактной форме с помощью выражений в квадратных скобках. Они позволяют избавиться от необходимости создавать временные переменные и использовать циклы for. Пример генератора списков:
py
squares = [x2 for x in range(10)]
print(squares) # выводит [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
~~~
+ Выражения-генераторы (generator expressions) - это аналог генераторов списков, но они создают итераторы вместо списков. Выражения-генераторы особенно полезны для работы с большими наборами данных, поскольку они позволяют создавать структуры данных “на лету” и не занимать много места в памяти. Пример выражения-генератора:
```py
squares = (x
2 for x in range(10))
for square in squares
~~~
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
33
Q

Что выведет последнее утверждение ниже?

A

```py
flist = []
for i in range(3):
flist.append(lambda: i)

[f() for f in flist] # что это распечатает?
~~~
В любом замыкании в Python переменные связаны по имени. Таким образом, приведенная выше строка кода выведет следующее:
[2, 2, 2]
Предположительно не то, что задумал автор приведенного выше кода?

Обходной путь — либо создать отдельную функцию, либо передать аргументы по имени; например:

```py
flist = []
for i in range(3):
flist.append(lambda i = i : i)

[f() for f in flist]
[0, 1, 2]
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
34
Q

Python интерпретируется или компилируется?

A

Как отмечалось в статье «Почему так много питонов?», это, честно говоря, вопрос с подвохом, поскольку он искажен. Python сам по себе является не чем иным, как определением интерфейса (как и любая спецификация языка), для которого существует несколько реализаций. Соответственно, вопрос о том, интерпретируется ли «Python» или компилируется, не относится к самому языку Python; скорее, это относится к каждой конкретной реализации спецификации Python.

Еще больше усложняет ответ на этот вопрос тот факт, что в случае с CPython (наиболее распространенной реализацией Python) ответ на самом деле «вроде того и другого». В частности, в CPython код сначала компилируется, а затем интерпретируется. Точнее, он не компилируется в собственный машинный код, а скорее в байт-код. Хотя машинный код, безусловно, быстрее, байт-код более переносим и безопасен. Затем байт-код интерпретируется в случае CPython (или интерпретируется и компилируется в оптимизированный машинный код во время выполнения в случае PyPy).

Python является интерпретируемым языком программирования, что означает, что код Python выполняется интерпретатором строка за строкой, а не компилируется в машинный код перед запуском. Когда вы запускаете скрипт Python, интерпретатор Python читает ваш код, переводит его в байт-код и затем выполняет этот байт-код. Если вам нужно, чтобы ваш код был быстрее, вы можете использовать JIT (Just-in-Time) компиляцию с помощью PyPy, что позволяет ускорить выполнение кода более чем в несколько раз.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
35
Q

Какие существуют альтернативные реализации CPython? Когда и почему вы можете их использовать?

A

Существует несколько альтернативных реализаций CPython, которые могут иметь преимущества в некоторых сценариях использования:

+ Jython - версия Python, которая работает на платформе JVM (Java Virtual Machine). Это позволяет использовать библиотеки Java в Python-коде и наоборот.

+ IronPython - версия Python, которая работает на платформе .NET. Это позволяет использовать библиотеки .NET в Python-коде и наоборот.

+ PyPy - JIT-компилирующая версия Python, которая может работать значительно быстрее чем CPython в некоторых случаях, благодаря оптимизации исполнения Python-кода.

+ Stackless Python - версия Python, которая не использует стек вызовов, что позволяет создавать многопоточные приложения с меньшими накладными расходами.

+ MicroPython - реализация Python, которая оптимизирована для запуска на устройствах с ограниченными ресурсами. MicroPython позволяет запускать Python код на микроконтроллерах и встраиваемых устройствах.

Каждая из этих реализаций может иметь свои преимущества в зависимости от конкретного сценария использования. Например, если вам нужен быстрый запуск Python-кода, PyPy может быть лучшим выбором, а если вы хотите использовать Java- или .NET-библиотеки в Python-приложении, Jython или IronPython могут быть более подходящими.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
36
Q

Что такое unittest в Python? Каков ваш подход к модульному тестированию в Python?

A

unittest — это стандартный модуль тестирования в Python, который позволяет создавать модульные тесты и запускать их.
В unittest входят следующие члены:
>
- FunctionTestCase
- SkipTest
- TestCase
- TestLoader
- TestResult
- TestSuite
- TextTestResult
- TextTestRunner
- defaultTestLoader
- expectedFailure
- findTestCases
- getTestCaseNames
- installHandler
- main
- makeSuite
- registerResult
- removeHandler
- removeResult
- skip
- skipIf
- skipUnless

Мой подход к модульному тестированию в Python включает написание тестов на каждую функцию или метод в моем коде, и проверка их работы на различных входных данных. Я также стараюсь использовать библиотеку mock для имитации входных данных и других объектов, которые могут влиять на работу кода. Модульное тестирование помогает мне обнаружить и устранить ошибки в коде, а также улучшить его качество и надежность.

В целом, мой подход заключается в том, чтобы покрыть как можно больше кода тестами, чтобы быть уверенным в правильности работы приложения и быстрой обнаружении ошибок.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
37
Q

Как бы вы выполнили модульное тестирование своего кода Python?

A

Для модульного тестирования Python-кода вы можете использовать встроенный модуль unittest или более простой pytest. Я бы примерно следовал следующей методологии:

+ Определить функцию, которую вы хотите протестировать.

+ Написать тесты для этой функции, каждый тест должен проверять один аспект поведения функции.

+ Запустить все тесты и убедиться, что они все прошли успешно.

Например, если бы у меня была функция add_numbers, которая принимает два числа и возвращает их сумму, мой тестовый случай может выглядеть так:
```py
def add_numbers(x, y):
return x + y

def test_add_numbers():
assert add_numbers(2, 3) == 5
assert add_numbers(-1, 1) == 0
assert add_numbers(0, 0) == 0

if __name__ == ‘__main__’:
test_add_numbers()
print(‘All tests passed’)
~~~
Вы можете запустить эту программу, чтобы проверить, что все тесты проходят. Кроме того, более точные отчеты о тестировании можно вывести, используя pytest.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
38
Q

Как протестировать программу или компонент Python

A

Вы можете использовать встроенный модуль unittest в Python для написания и запуска тестов для вашего кода. Вот пример использования unittest:
```py
import unittest

def add_numbers(a, b):
return a + b

class TestAddNumbers(unittest.TestCase):

def test_add_positive_numbers(self):
    self.assertEqual(add_numbers(2, 3), 5)

def test_add_negative_numbers(self):
    self.assertEqual(add_numbers(-2, -3), -5)

def test_add_mixed_numbers(self):
    self.assertEqual(add_numbers(-2, 3), 1)

if __name__ == ‘__main__’:
unittest.main()
~~~
Обратите внимание, что вам нужно создать класс, наследуемый от unittest.TestCase, и определить тестовые функции, которые должны начинаться со слова “test”. В тестовых функциях вы можете использовать методы assert, такие как assertEqual или assertRaises, чтобы проверить, что ваш код работает корректно в разных сценариях использования.

Вы можете запустить этот тест, запустив этот скрипт из командной строки. Но вы также можете использовать интегрированную среду разработки, такую как PyCharm, которая может запускать тесты и показывать результаты в пользовательском интерфейсе.

Еще одним популярным инструментом для тестирования Python-кода является фреймворк pytest. Вы можете установить его с помощью pip и использовать следующим образом:
```py
import pytest

def add_numbers(a, b):
return a + b

def test_add_positive_numbers():
assert add_numbers(2, 3) == 5

def test_add_negative_numbers():
assert add_numbers(-2, -3) == -5

def test_add_mixed_numbers():
assert add_numbers(-2, 3) == 1
~~~

-
Python поставляется с двумя средами тестирования:
Тестовый модуль документации находит примеры в строках документации для модуля и запускает их, сравнивая вывод с ожидаемым выводом, указанным в строке документации.

Модуль unittest представляет собой более сложную среду тестирования, созданную по образцу сред тестирования Java и Smalltalk.

Для тестирования полезно написать программу так, чтобы ее можно было легко протестировать, используя хороший модульный дизайн. Ваша программа должна иметь почти всю функциональность, инкапсулированную либо в функции, либо в методы класса. Иногда это приводит к удивительному и восхитительному эффекту ускорения работы программы, поскольку доступ к локальным переменным выполняется быстрее, чем доступ к глобальным.

Кроме того, программа должна избегать зависимости от изменения глобальных переменных, так как это значительно усложняет тестирование.
«Глобальная основная логика» вашей программы может быть такой простой, как:
```py
если __name__==”__main__”:
main_logic()
~~~
в нижней части основного модуля вашей программы.
Как только ваша программа будет организована как удобный набор функций и поведений классов, вы должны написать тестовые функции, которые проверяют поведение.

Набор тестов может быть связан с каждым модулем, который автоматизирует последовательность тестов.

Вы можете сделать кодирование намного более приятным, написав свои тестовые функции параллельно с «рабочим кодом», так как это позволяет легко находить ошибки и даже недостатки дизайна раньше.

«Модули поддержки», которые не предназначены для использования в качестве основного модуля программы, могут включать самопроверку модуля.
```py
если __name__ == “__main__”:
self_test()
~~~

Даже программы, которые взаимодействуют со сложными внешними интерфейсами, могут быть протестированы, когда внешние интерфейсы недоступны, с использованием «поддельных» интерфейсов, реализованных в Python.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
39
Q

Что такое Flask и его преимущества?

A

Flask - это микрофреймворк для веб-приложений на языке Python. Он предоставляет простую и легковесную архитектуру для создания веб-приложений и API.

Некоторые из преимуществ Flask:

+ Простота использования и легковесность - Flask предоставляет минимальный набор инструментов для создания веб-приложений, что делает его очень простым в использовании и быстрым в изучении.

+ Гибкость в настройке - Flask позволяет настроить почти каждый аспект приложения на ваше усмотрение, что позволяет создавать высокопроизводительные приложения с минимальными затратами.

+ Расширяемость - Flask имеет большое количество расширений, которые облегчают реализацию различных функциональных возможностей, таких как аутентификация, работа с базами данных, управление формами, тестирование и т.д.

+ Удобство документации - Flask имеет документацию высокого качества и множество практических руководств, что делает его идеальным выбором для начинающих.

+ Широкое сообщество - Flask имеет широкое сообщество разработчиков, которые создают множество библиотек и расширений и делятся своим опытом в интернете, что упрощает работу с фреймворком и ускоряет процесс разработки.

В целом, Flask - отличный выбор для тех, кто ищет простоту, гибкость и высокую производительность в своих веб-приложениях на языке Python

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
40
Q

Укажите, что такое Flask-WTF и каковы их особенности?

A

Flask-WTF - это расширение Flask для работы с web-формами, которое предоставляет инструменты для создания и валидации форм на основе HTML. Он облегчает процесс создания форм, упрощает обработку вводимых данных и обеспечивает защиту от атак типа CSRF (межсайтовая подделка запросов) и XSS (межсайтовые скрипты).

Особенности Flask-WTF:

+ Предоставляет инструменты для создания и валидации форм на основе HTML.

+ Упрощает процесс обработки данных, вводимых пользователем.

+ Обеспечивает защиту форм от атак CSRF и XSS.

+ Расширяемый и кастомизируемый набор методов формирования данных.

+ Макросы для быстрого и удобного добавления форм в шаблон Flask.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
41
Q

Объясните, как обычно работает сценарий Flask?

A

Сценарий Flask - это веб-фреймворк для языка Python, который обычно применяется для создания веб-приложений. Он работает по принципу модели MVC (Model-View-Controller), который разделяет приложение на три части: модель, представление и контроллер.

Модель представляет собой объекты данных, представление — пользовательский интерфейс, а контроллер — управляет бизнес-логикой приложения и связывает модель и представление.

В сценарии Flask вы создаете экземпляр класса Flask и регистрируете в нем маршруты (routes). Маршруты представляют URL-адреса и связанные с ними функции, которые обрабатывают запросы. Функции могут возвращать HTML-страницы, JSON-данные или другие форматы, в зависимости от типа запроса.

Например, вот простой пример Flask-приложения:
```py
from flask import Flask

app = Flask(__name__)

@app.route(‘/’)
def index():
return ‘Hello, World!’

if __name__ == ‘__main__’:
app.run()
~~~
Здесь экземпляр класса Flask создается с указанием имени приложения, и создается конечная точка ‘/’ с помощью декоратора @app.route. Функция index будет вызываться при обращении к данной конечной точке, и вернет простое текстовое сообщение ‘Hello, World!’. Затем запускается приложение с помощью метода run().

Обычно для работы с запросами в Flask используется объект request, который содержит информацию о запросе, например, переданные параметры и т.д. Например, вот так можно получить значение параметра ‘name’, переданного при обращении к конечной точке ‘/hello’:
```py
from flask import Flask, request

app = Flask(__name__)

@app.route(‘/hello’)
def hello():
name = request.args.get(‘name’)
return f’Hello, {name}!’

if __name__ == ‘__main__’:
app.run()
~~~
Здесь метод args.get() используется для получения значения параметра ‘name’, переданного в GET-запросе.

Это только самые базовые концепции Flask , дополнительные возможности включают работу с БД, различные методы запросов и многое другое.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
42
Q

Объясните, как вы можете получить доступ к сеансам в Flask?

A

В Flask сессии хранятся на стороне сервера, а не в браузере клиента. Чтобы получить доступ к сессии в Flask, вам нужно импортировать объект session из модуля Flask и использовать его для установки и извлечения значений из сессии. Здесь пример, который демонстрирует, как установить значение в сессии и извлечь его из нее:
```py
from flask import Flask, session, redirect, url_for, request

app = Flask(__name__)
app.secret_key = ‘some_secret_key’

@app.route(‘/set_session’)
def set_session():
session[‘username’] = ‘John’
return ‘Session value set’

@app.route(‘/get_session’)
def get_session():
username = session.get(‘username’)
if username:
return ‘Hello, {}’.format(username)
else:
return ‘No session value set’

if __name__ == ‘__main__’:
app.run()
~~~
В этом примере мы устанавливаем значение ‘John’ для ключа ‘username’ в сессии при обращении к маршруту /set_session и выводим это значение при обращении к маршруту /get_session. Заметьте, что мы установили секретный ключ app.secret_key, который используется Flask для подписи куков сессии, чтобы обеспечить безопасность.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
43
Q

Является ли Flask моделью MVC, и если да, то приведите пример, показывающий шаблон MVC для вашего приложения?

A

Да, Flask можно рассматривать как модель MVC (Model-View-Controller) в своей архитектуре. Пример шаблона MVC для Flask-приложения может выглядеть примерно так:

Модель (Model): модуль Flask-приложения, отвечающий за обработку данных и логику приложения. Например, это может быть модуль, который взаимодействует с базой данных и обрабатывает запросы.

Представление (View): модуль Flask-приложения, отвечающий за отображение данных на экране, как правило с помощью Jinja-шаблонов. Например, это может быть модуль, который рендерит HTML-страницы для пользователя.

Контроллер (Controller): модуль Flask-приложения, отвечающий за обработку HTTP-запросов и связь между моделью и представлением. Например, это может быть модуль, который определяет маршруты и обработчики запросов.

Пример:
```py
from flask import Flask, render_template, request
app = Flask(__name__)

модель
def get_data_from_database():
# код для получения данных из базы данных
return data

представление
@app.route(‘/’)
def index():
data = get_data_from_database()
return render_template(‘index.html’, data=data)

контроллер
@app.route(‘/submit’, methods=[‘POST’])
def submit():
# код для обработки данных, полученных из формы
data = request.form[‘data’]
# сохранение данных в базу данных
return redirect(‘/’)
~~~
В этом примере функция get_data_from_database является моделью, функция index является представлением, а функция submit - контроллером. Шаблон для отображения данных определен в файле index.html.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
44
Q

Объясните подключение к базе данных в Python Flask?

A

Для подключения к базе данных в Flask можно использовать библиотеку SQLAlchemy. Вот пример кода, демонстрирующий подключение к базе данных SQLite:
```py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///example.db’
db = SQLAlchemy(app)

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)

@app.route(‘/’)
def hello_world():
return ‘Hello, World!’

if __name__ == ‘__main__’:
app.run()
~~~
В этом примере мы создаем объект приложения Flask, затем устанавливаем настройку SQLALCHEMY_DATABASE_URI, которая определяет, какую базу данных использовать (в этом случае мы используем SQLite). Мы также создаем экземпляр класса SQLAlchemy, который мы будем использовать для работы с базой данных.

Затем мы создаем модель базы данных User, которая содержит имя пользователя. Обратите внимание, что эта модель является подклассом db.Model, который является частью SQLAlchemy. Это означает, что SQLAlchemy сможет выполнить миграции базы данных и создать таблицу для этой модели.

Наконец, мы запускаем приложение Flask и можем использовать модель пользователя, чтобы сохранять данные в базе данных.

Это был пример простого подключения к базе данных SQLite в Flask, но SQLAlchemy также поддерживает другие базы данных, такие как PostgreSQL, MySQL и другие.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
45
Q

Как вы будете сортировать результаты учеников, оценки которых вам неизвестны, на основе их номеров?

A

Используя сортировку пузырьком.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
46
Q

Как вы будете проверять утечку памяти в Linux?

A

Для проверки утечки памяти в Linux можно использовать утилиту Valgrind. Она предназначена для отладки программ, написанных на C, C++ и других языках, и позволяет обнаруживать утечки памяти, ошибки использования указателей и другие проблемы. Для использования Valgrind в Python необходимо установить пакет memcheck-3.4.1 (или более новую версию) и запустить интерпретатор Python с помощью утилиты Valgrind. Например:
```bash
valgrind –tool=memcheck –leak-check=yes python myscript.py
~~~
Это запустит скрипт myscript.py под управлением Valgrind и выведет отчет о возможных утечках памяти и других проблемах.

Также можно использовать модуль Python tracemalloc, который позволяет отслеживать использование памяти в Python и выводить отладочную информацию. Пример использования:
```py
import tracemalloc
tracemalloc.start() # начало трассировки памяти

ваш код

snapshot = tracemalloc.take_snapshot() # текущее состояние памяти
top_stats = snapshot.statistics(‘lineno’)

print(“[ Top 10 ]”)
for stat in top_stats[:10]:
print(stat)
~~~
Это выведет топ-10 участков кода с наибольшим использованием памяти. Однако, обратите внимание, что использование tracemalloc может снизить производительность программы и требует дополнительной обработки кода.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
47
Q

Как вы можете вернуть несколько значений из функции.

A

В Python, вы можете вернуть несколько значений из функции, используя кортежи или списки. Пример с кортежем:

def get_user_info(user_id):
    # запрос к базе данных
    user_name = "John"
    user_age  = 30
    user_gender = "Male"
    return user_name, user_age, user_gender

вызываем функцию и сохраняем результат в несколько переменных
name, age, gender = get_user_info(123)
print(name, age, gender)

В этом примере функция get_user_info возвращает кортеж из трех значений, который затем распаковывается в name, age и gender. Аналогичный пример с использованием списка:

def get_user_info(user_id):
    # запрос к базе данных
    user_name = "John"
    user_age  = 30
    user_gender = "Male"
    return [user_name, user_age, user_gender]

вызываем функцию и сохраняем результат в список
user_info = get_user_info(123)
print(user_info)

Здесь функция get_user_info возвращает список, который затем можно обработать как обычный список в коде.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
48
Q

Как быстрее всего поменять местами значения, связанные с двумя переменными?

A

Для обмена значениями двух переменных в Python есть несколько способов. Один из наиболее быстрых способов - использовать множественное присваивание. Пример:
```py
a = 1
b = 2

обмен значениями
a, b = b, a

print(a) # 2
print(b) # 1
~~~
В этом примере, значение переменной a присваивается переменной b, а значение переменной b присваивается переменной a, при этом оба значения меняются местами.

Еще один способ - использовать временную переменную. Пример:
```py
a = 1
b = 2

обмен значениями
temp = a
a = b
b = temp

print(a) # 2
print(b) # 1
~~~
В этом примере, значение переменной a сохраняется во временную переменную, затем значение переменной b присваивается переменной a, а сохраненное значение переменной a присваивается переменной b.

Первый способ с использованием множественного присваивания обычно более предпочтителен, так как он более краткий и понятный.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
49
Q

В чем важность подсчета ссылок?

A

В Python все объекты создаются динамически в куче (heap) и у каждого объекта есть счетчик ссылок на него. Когда счетчик ссылок на объект становится равным нулю, объект удаляется автоматически из памяти. Поэтому правильное подсчет ссылок на объекты в Python является критически важным компонентом управления памятью в Python.

Если ссылка на объект не удалена, то объект остается в памяти, занимая ресурсы и может вызывать утечки памяти. С другой стороны, если ссылка на объект удалена преждевременно, то объект может быть удален неправильно и это может вызвать неожиданные ошибки в программе.

Таким образом, правильное управление ссылками на объекты является важным аспектом проектирования и написания Python программ. В Python можно использовать модуль sys для отладки и вывода информации о текущем использовании памяти программой.

В Python подсчет ссылок на объекты важен для работы сборщика мусора, который автоматически освобождает память, занимаемую неиспользуемыми объектами. Сборщик мусора в Python использует счетчик ссылок для определения, когда объект может быть безопасно удален из памяти. Если на объект не остается ссылок, это означает, что он больше не нужен в программе и может быть удален. Счетчик ссылок также используется для определения экземпляра объекта, на который ссылается переменная. Если одна переменная ссылается на объект, и другая переменная ссылается на тот же объект, то обе переменные ссылается на один и тот же объект, то есть оба объекта имеют одинаковый идентификатор (id). В целом, понимание работы счетчика ссылок в Python важно для понимания механизма управления памятью в языке, и может помочь в создании эффективных и безопасных программ.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
50
Q

Возвращают ли функции что-то, даже если нет оператора return?

A

Да, в Python функции всегда возвращают какое-то значение, даже если внутри них нет оператора return или оператор return без значения. Если оператор return отсутствует, то функция вернет значение None, что может быть использовано в качестве дефолтного значением в тех случаях, когда функция должна вернуть значение, но не имеет конкретных результатов для возврата.

Например:
```py
def greet(name):
print(f”Hello, {name}!”)

result = greet(“John”)
print(result) # output: None
~~~
Здесь функция greet не имеет оператора return, поэтому результат ее вызова будет равен None.

Однако, стоит учитывать, что если функция вызвана в рамках выражения (например, передана в качестве аргумента в другую функцию), то в этом случае результат ее выполнения будет использован в соответствующем выражении:
```py
def add(a, b):
return a + b

result = add(2, 3) * 5
print(result) # output: 25
~~~
Здесь функция add возвращает результат сложения аргументов, и этот результат умножается на 5, что дает значение 25.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
51
Q

Как перевернуть список?

A

Чтобы перевернуть список в Python, вы можете использовать метод reverse(), который изменяет порядок элементов в списке на противоположный. Например:
```py
my_list = [1, 2, 3, 4, 5]
my_list.reverse()
print(my_list) #Это выведет [5, 4, 3, 2, 1].
~~~

Если же вы хотите получить новый список, содержащий элементы в обратном порядке, вы можете использовать функцию reversed(), которая возвращает итератор, перебирающий элементы списка в обратном порядке. Например:
```py
my_list = [1, 2, 3, 4, 5]
reversed_list = list(reversed(my_list))
print(reversed_list) #Это выведет [5, 4, 3, 2, 1].
~~~

Обратите внимание, что функция reversed() не изменяет оригинальный список.

Ещё один способ создать новый список с элементами в обратном порядке - использовать срез с отрицательным шагом. Например:
```py
my_list = [1, 2, 3, 4, 5]
reversed_list = my_list[::-1]
print(reversed_list) # Это также выведет [5, 4, 3, 2, 1].

~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
52
Q

Как бы вы объединили два отсортированных списка?

A

В Python вы можете объединить два отсортированных списка с помощью алгоритма слияния (merge). Этот алгоритм работает следующим образом:

Создайте новый пустой список и инициализируйте два указателя (index) на начало каждого списка.

Сравните значения, на которые указывают указатели, наименьшее из них добавьте в новый список и передвиньте соответствующий указатель на следующую позицию в соответствующем списке.

Повторяйте пункт 2 до тех пор, пока один из указателей не достигнет конца списка.

Добавьте оставшиеся элементы из другого списка в конец нового списка.

Вот пример кода на Python, который объединяет два отсортированных списка:
```py
def merge_sorted_lists(lst1, lst2):
result = []
i = 0
j = 0
while i < len(lst1) and j < len(lst2):
if lst1[i] < lst2[j]:
result.append(lst1[i])
i += 1
else:
result.append(lst2[j])
j += 1
result += lst1[i:]
result += lst2[j:]
return result

Пример:
lst1 = [1, 3, 5, 7]
lst2 = [2, 4, 6, 8]
merged = merge_sorted_lists(lst1, lst2)
print(merged) # [1, 2, 3, 4, 5, 6, 7, 8]
~~~
Здесь мы создаем новый пустой список result и два указателя i и j, которые указывают на начало каждого списка. Затем мы сравниваем элементы, на которые указывают указатели, добавляем меньший из них в result и передвигаем соответствующий указатель

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
53
Q

Как бы вы считали строки в файле?

A

Для чтения строк из файла в Python, вы можете использовать метод readline() для чтения одной строки или метод readlines() для чтения всех строк и сохранения их в списке. Вот пример использования метода readline():
```py
with open(‘file.txt’, ‘r’) as file:
line = file.readline()
while line:
print(line.strip())
line = file.readline()
~~~
Этот код открывает файл file.txt в режиме чтения и использует метод readline() для чтения первой строки. Затем он входит в цикл while, который продолжается до тех пор, пока readline() не вернет пустую строку. В теле цикла он выводит текущую строку, очищая ее от лишних символов с помощью метода strip(), и затем использует readline() для чтения следующей строки.

Вы также можете использовать расширенный синтаксис оператора with. Этот синтаксис обеспечивает автоматическую очистку файла после того, как он больше не нужен, что здесь достигается при помощи дополнительного блока with.

Если вам нужно обработать каждую строку как отдельную единицу, вы можете использовать for-цикл следующим образом:
```py
with open(‘file.txt’, ‘r’) as file:
for line in file:
print(line.strip())
~~~
Этот код имеет тот же эффект, что и предыдущий пример: он выводит все строки файла, одну за другой, очищая каждую строку от лишних пробелов и символов перевода строки с помощью метода strip().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
54
Q

Какие стандартные библиотеки Python?

A

Python имеет большое количество стандартных библиотек, охватывающих широкий спектр функций. Вот некоторые из основных стандартных библиотек Python:
+ datetime для управления датами и временем
+ math для математических операций
+ random для генерации случайных чисел
+ re для регулярных выражений
+ json для кодирования и декодирования данных JSON.
+ csv для работы с файлами CSV
+ os для функций, связанных с операционной системой
+ sys для системных параметров и функций
+ urllib для выполнения HTTP-запросов
+ sqlite3 для работы с базами данных SQLite
+ pickle для сериализации и десериализации объектов Python

В Python есть еще много стандартных библиотек, охватывающих широкий спектр функций. Кроме того, для Python доступно множество сторонних библиотек, которые можно установить с помощью менеджеров пакетов, таких как pip или conda.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
55
Q

Что такое размер целого числа в Python?

A

В Python размер целого числа зависит от используемой платформы, так как используется целочисленное представление в дополнительном коде. В большинстве современных платформ размер целых чисел равен 4 байтам (32 битам) или 8 байтам (64 бита), но в теории может быть самым разным. Однако для работы с очень большими целыми числами их можно представлять в виде строк, используя модуль Decimal, например. Кроме того, в Python есть другие типы данных для работы с числами, такие как float и Decimal, если требуется большая точность вычислений.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
56
Q

Что такое форматы сериализации в Python?

A

Форматы сериализации - это способы преобразования объектов Python в байтовые потоки, которые могут быть сохранены в файл или переданы по сети для последующего использования. Некоторые из наиболее распространенных форматов сериализации в Python включают JSON, Pickle, YAML, XML и Avro.

+ JSON (JavaScript Object Notation) - это текстовый формат обмена данными, основанный на синтаксисе объектов JavaScript. В Python есть встроенный модуль json, который позволяет сериализовать объекты Python в JSON и обратно.

+ Pickle - это протокол Python для сериализации и десериализации объектов Python. Pickle может сериализовать практически любой объект Python, включая списки, словари, кортежи и объекты пользовательских классов.

+ YAML (YAML Ain’t Markup Language) - это текстовый формат сериализации данных, который является человекочитаемым и удобным для редактирования вручную. В Python есть модуль PyYAML, который позволяет сериализовать объекты Python в YAML и обратно.

+ XML (Extensible Markup Language) - это формат сериализации данных, который использует синтаксис разметки для хранения данных в текстовых файлах. В Python есть несколько модулей для работы с XML, в том числе ElementTree, lxml и xml.etree.ElementTree.

+ Avro - это двоичный протокол сериализации данных, который позволяет определить схему данных и генерировать код для работы с ней на разных языках. В Python есть модуль fastavro, который позволяет сериализовать и десериализовать данные в формате Avro.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
57
Q

Как Python управляет памятью?

A

Python использует автоматическое управление памятью, что означает, что вы не должны явно управлять выделением и освобождением памяти при работе с объектами. Вместо этого, Python использует сборщик мусора для автоматического освобождения неиспользуемой памяти.

Python применяет схему подсчета ссылок для определения того, какие объекты в настоящее время используются приложением, и автоматически освобождает память, когда объекты больше не нужны. При удалении объекта Python уменьшает количество ссылок на него, и когда количество ссылок достигает нуля, Python автоматически освобождает память, занятую объектом.

Если вы хотите управлять памятью в программе на Python, вы можете использовать модуль gc (garbage collector), который предоставляет некоторые функции для управления поведением сборщика мусора.

Например, для отключения сборки мусора в Python вы можете использовать следующий код:
```py
import gc
gc.disable()
~~~
Обычно в Python нет необходимости явно управлять памятью, и рекомендуется разрабатывать приложения без непосредственного воздействия на работу сборщика мусора.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
58
Q

Является ли кортеж изменяемым или неизменным?

A

Кортеж (tuple) в Python является неизменяемым (immutable) объектом, что означает, что после создания его нельзя изменить, добавить или удалить элементы. Однако, если кортеж содержит изменяемые объекты, например, список (list), то эти объекты могут быть изменены. Но сам кортеж останется неизменным, то есть его размер (количество элементов) и порядок элементов не изменятся. Это отличает кортеж от списка, который является изменяемым объектом.
```py
my_tuple = (1, 2, 3)
print(my_tuple) # (1, 2, 3)

my_tuple[1] = 4 # TypeError: объект ‘tuple’ не поддерживает назначение элементов

my_tuple_with_list = (1, [2, 3])
my_tuple_with_list[1][0] = 4 # возможно, поскольку список внутри кортежа является изменяемым
print(my_tuple_with_list) # (1, [4, 3])
~~~

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
59
Q

Расскажите мне какие-нибудь структуры данных в Python?

A

Структуры данных в Python включают в себя различные виды, такие как списки, словари, множества, кортежи и т.д.

+ Списки (list) являются наиболее распространенным типом структуры данных в Python. Они представляют собой упорядоченную коллекцию объектов. Списки могут содержать объекты любого типа, включая другие списки. Чтобы объявить список, можно использовать квадратные скобки:

py
my_list = [1, 2, 3, "four", 5.0]
~~~
\+ Словари (dictionary) - это также очень распространенный вид структуры данных в Python. Словарь представляет собой неупорядоченную коллекцию объектов, в которой каждый объект имеет ключ, связанный с ним. Ключи должны быть уникальными, а значения могут быть объектами любого типа. Для создания словаря можно использовать фигурные скобки:
py
my_dict = {“one”: 1, “two”: 2, “three”: 3}
~~~
+ Множества (set) - это еще один тип структуры данных, представляющий собой неупорядоченную коллекцию уникальных элементов. Множество можно создать с помощью функции set() или фигурных скобок:
py
my_set = set([1, 2, 3, 4, 5])
~~~
\+ Кортежи (tuple) - это структура данных, представляющая собой неизменяемый список. Они содержат объекты любого типа, включая другие кортежи, и объявляются с помощью круглых скобок:
py
my_tuple = (1, 2, 3, “four”, 5.)
~~~
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
60
Q

Почему python вместо scala на spark, если у scala лучше производительность?

A

Вопрос о выборе Python вместо Scala для Spark - это сложный вопрос, который зависит от конкретной ситуации и потребностей. В общем случае, Scala может демонстрировать более высокую производительность, чем Python, поскольку это статически типизированный язык с компиляцией в байт-код JVM. Однако использование Python с Apache Spark также имеет свои преимущества, такие как возможность работы с библиотеками на Python и более широким сообществом пользователей. Кроме того, Python имеет более простой синтаксис и легче доступен для начинающих разработчиков. Таким образом, выбор между Python и Scala для Spark зависит от конкретной задачи, приоритетов проекта и опыта команды разработчиков.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
61
Q

Как получить доступ к файлу на Linux-сервере с помощью Python?

A

Для получения доступа к файлу на Linux-сервере с помощью Python можно использовать модуль paramiko. Этот модуль позволяет создавать SSH-соединения с удаленными серверами и выполнять на них команды, включая работу с файлами.

Вот простой пример, который показывает, как прочитать содержимое файла с помощью модуля paramiko:
```py
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(‘hostname’, username=’username’, password=’password’)
stdin, stdout, stderr = ssh.exec_command(‘cat /path/to/file.txt’)
print(stdout.read().decode())
ssh.close()
~~~
В этом примере мы создаем SSH-соединение с удаленным сервером, указываем имя пользователя и пароль, и выполняем команду ‘cat /path/to/file.txt’, которая выводит содержимое файла на экран. Затем мы просто выводим результат в консоль.

Кроме того, вы можете использовать SCP (Secure Copy), чтобы скопировать файл с сервера на локальную машину:
```py
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(‘hostname’, username=’username’, password=’password’)

scp = ssh.open_sftp()
scp.get(‘/path/to/remote/file’, ‘/path/to/local/file’)
scp.close()

ssh.close()
~~~
В этом примере мы подключаемся к удаленному серверу, создаем объект SCP, запрашиваем файл и копируем его на локальную машину.

Оба примера использования модуля paramiko требуют установки этого модуля на вашей системе:
```bash
pip install paramiko
~~~

62
Q

Что такое List Comprehension? Показать на примере

A

List comprehension в Python - это синтаксическая конструкция, которая позволяет создавать новый список на основе элементов существующего списка или другого итерируемого объекта с использованием более компактного и выразительного синтаксиса.

Пример:

Создание списка, содержащего квадраты чисел от 0 до 9 с помощью цикла for:

py
squares = []
for i in range(10):
    squares.append(i**2)
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
~~~
То же самое с использованием list comprehension:
py
squares = [i**2 for i in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
~~~
В данном случае, мы создаем новый список, применяя операцию возведения в квадрат к каждому элементу диапазона от 0 до 9.

Можно также добавить условие фильтрации элементов, например, чтобы создать список квадратов только для четных чисел:
```py
squares = [i**2 for i in range(10) if i % 2 == 0]
print(squares) # [0, 4, 16, 36, 64]
~~~
В этом примере, мы добавляем условие if i % 2 == 0, чтобы список squares содержал квадраты только четных чисел.

63
Q

Как выполнить java-код?

A

Выполнение Java-кода в Python может быть достигнуто с помощью использования библиотеки JPype. Эта библиотека позволяет вызывать Java-методы из Python и наоборот.

Сначала нужно установить JPype. Вы можете установить его, используя pip:
```bash
pip install JPype1
~~~
Затем на Java-стороне вам нужно создать Java-класс, который вы хотите вызвать из Python

В Python-скрипте вы можете создать экземпляр Java-класса jpype.JClass(className) и вызвать его методы, используя стандартный синтаксис вызова методов в JPype.

Вот небольшой пример:
```java
Java-код MyClass.java

public class MyClass {
public static String hello(String name) {
return “Hello “ + name + “ from Java!”;
}
}
~~~
Python-код
```py
import jpype

Загрузка JVM
jpype.startJVM(jpype.getDefaultJVMPath())

Создание экземпляра класса MyClass
MyClass = jpype.JClass(‘MyClass’)
msg = MyClass.hello(‘you’)

Вывод сообщения на экран
print(msg)

Остановка JVM
jpype.shutdownJVM()
~~~
Этот код загрузит класс MyClass из Java-кода, создаст его экземпляр и вызовет статический метод hello(). Результат будет выведен на экран.

64
Q

Как найти PID процесса и как узнать, сколько ресурсов занимает процесс в Linux?

A

В Linux можно найти идентификатор процесса (PID) с помощью утилиты ps. Вы можете использовать команду ps aux | grep process_name для поиска процесса по его имени и показа его PID. Например:
```bash
ps aux | grep firefox
~~~
Это покажет все запущенные процессы Firefox, их PID и другую информацию.

Вы также можете использовать утилиту top, чтобы увидеть запущенные процессы и их PID. Команда top покажет текущую нагрузку на систему и список всех процессов, запущенных в данный момент. Она также отображает информацию о каждом процессе, включая его PID, процент использования процессора и использование памяти.

Чтобы узнать, сколько ресурсов занимает процесс, вы можете использовать утилиту ps. Команда ps отображает информацию о процессах, включая использование памяти. Вы можете использовать команду ps -p pid -o %cpu,%mem для показа процессорного и памятевого использования определенного процесса. Например:
```bash
ps -p 1234 -o %cpu,%mem
~~~
Это вернет процент использования процессора и памяти для процесса с PID 1234.

Если вы хотите увидеть более подробную информацию о процессах, вы можете использовать команду top. В top вы можете сортировать процессы по использованию процессора или памяти, чтобы найти наиболее интенсивно использующий ресурсы процесс.

65
Q

Какие иструменты для приема данных в Python?

A

В Python доступно несколько инструментов для приема данных, в том числе:
+ Pandas: популярная библиотека обработки и анализа данных на Python, которая включает в себя множество функций для приема данных из разных источников
+ Petl: Python ETL — это базовый инструмент, который предлагает стандартную функциональность ETL для импорта данных из разных источников (таких как csv 1, excel и т. д.).
+ Bonobo: легкая структура ETL, предназначенная для быстрого создания конвейеров для обработки данных.
+ Beautiful Soup: библиотека для парсинга веб-страниц на Python, которую можно использовать для извлечения данных из файлов HTML и XML.
+ Airflow: платформа для программного создания, планирования и мониторинга рабочих процессов. Фабрика данных
+ Azure: облачная служба интеграции данных, которая позволяет создавать, планировать и управлять конвейерами данных.

Эти инструменты предоставляют ряд функций и возможностей для приема данных из разных источников и их преобразования по мере необходимости.

66
Q

Как Python выполняет код?

A

Python выполняет код в несколько этапов. Когда вы запускаете скрипт Python или вводите код в интерактивной оболочке, он проходит через следующие этапы:

+ Лексический анализ: разбивает исходный код на лексемы или токены (ключевые слова, операторы, идентификаторы и т.д.).

+ Синтаксический анализ: анализирует последовательность лексем и создает дерево синтаксических связей, называемое деревом разбора.

+ Компиляция: проходит по дереву разбора и создает байт-код.

+ Выполнение: интерпретатор Python читает байт-код, и выполняет соответствующие операции.

Также Python выполняет процесс интерпретации кода динамически, что означает, что тип переменной определяется во время выполнения кода, а не во время компиляции, как, например, в языке C.

67
Q

Что такое привязки, т. е. что означает привязка значения к переменной?

A

В Python привязка — это связь между переменной, также известной как имя, и объектом, также известным как значение. Когда мы создаем новую переменную, мы создаем новое имя, которое привязывается к определенному объекту в памяти. Затем мы можем использовать это имя для ссылки на объект и выполнения с ним действий. Когда мы присваиваем значение переменной в Python, мы привязываем эту переменную к объекту, который представляет значение. Это означает, что имя переменной теперь указывает на объект в памяти, который содержит значение. С этого момента, если мы используем переменную, мы фактически ссылаемся на значение, хранящееся в объекте, на который она указывает.

68
Q

Как вы создаете список?

A

Вы можете создать список (list), используя квадратные скобки [] и разделяя элементы запятыми. Ниже приведены несколько примеров:
```py
# Создание пустого списка
my_list = []

Создание списка со значениями
my_list = [1, 2, 3, “four”, 5.0]

Создание списка из переменных
a = 10
b = 20
c = 30
my_list = [a, b, c]

Создание вложенного списка
nested_list = [[1,2,3], [4,5,6], [7,8,9]]
~~~
Вы также можете создавать список с помощью генератора списка или добавлять элементы в список с помощью метода append(). Вот несколько примеров:
```py
# Создание списка с помощью генератора списка
my_list = [x**2 for x in range(1, 6)]
# [1, 4, 9, 16, 25]

Создание списка с использованием метода append()
my_list = []
my_list.append(10)
my_list.append(20)
my_list.append(30)
# [10, 20, 30]
~~~

69
Q

Как вы создаете словарь?

A

Cловари (dict) могут быть созданы с помощью фигурных скобок {} или с использованием ключевого слова dict(). Вот несколько примеров:
```py
# Создание словаря с помощью фигурных скобок {}
my_dict = {“key1”: “value1”, “key2”: “value2”}

Создание пустого словаря с фигурными скобками {}
my_empty_dict = {}

Создание словаря с использованием ключевого слова dict()
my_dict_2 = dict(key1=”value1”, key2=”value2”)

Создание пустого словаря с использованием ключевого слова dict()
my_empty_dict_2 = dict()
~~~
Можно также использовать циклы for для заполнения словаря:

py
# Создание словаря с использованием цикла for
my_dict = {}
for i in range(5):
    my_dict[i] = i * i
~~~
Можно также использовать comprehension для создания словаря:
py
# Создание словаря с использованием comprehension
my_dict = {i: i * i for i in range(5)}
~~~
70
Q

Что такое list comprehension? Почему бы вам использовать один?

A

List comprehension - это конструкция в языке Python, которая позволяет создавать новые списки с помощью более компактного и выразительного синтаксиса, чем при использовании циклов for и while.

В общем виде, синтаксис list comprehension выглядит следующим образом:

new_list = [expression for item in iterable if condition]

где:

+ expression - это выражение, которое применяется к каждому элементу входного списка (iterable), чтобы создать соответствующий элемент в выходном списке (new_list).

+ item - это переменная, которая принимает каждый элемент входного списка (iterable).

+ iterable - это исходный список, из которого нужно извлечь элементы для нового списка.

+ condition (не обязательно) - это условие, которое должно быть истинным для каждого элемента входного списка (iterable), чтобы он был включен в выходной список (new_list).

Ниже приведен пример, показывающий, как можно использовать list comprehension для создания нового списка, содержащего квадраты четных чисел:
```py
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
squares_of_evens = [x**2 for x in numbers if x % 2 == 0]
print(squares_of_evens) # Output: [4, 16, 36, 64, 100]
~~~
Преимущества использования list comprehension заключаются в том , что она делает код более кратким, читаемым и выразительным. Она также может увеличить производительность, особенно при работе с большими наборами данных, поскольку выполняется в один проход без необходимости создавать промежуточные значения.

71
Q

Что такое генератор? Для чего это можно использовать?

A

Генераторы в Python - это функции, которые имеют возможность временно приостанавливать свое выполнение, возвращать промежуточный результат и затем возобновлять выполнение с того же места, где оно было приостановлено. Они используют ключевое слово yield для возврата значений. Таким образом, генератор в Python позволяет производить тяжелые вычисления “на лету”, без необходимости загрузки в память всех данных сразу.

Генераторы могут использоваться для создания последовательностей значений, которые могут быть достаточно большими для того, чтобы не помещаться в память. Они также могут использоваться для создания бесконечных последовательностей или для обработки больших объемов данных.

Пример использования генератора для создания последовательности чисел:
```py
def generator(n):
i = 0
while i < n:
yield i
i += 1

Пример использования генератора
for i in generator(5):
print(i)
~~~
Этот код будет выводить числа от 0 до 4.

Благодаря генераторам, нет необходимости загружать все числа в последовательности сразу, что может быть очень полезным при работе с большими объемами данных.

72
Q

Что такое наследование?

A

Наследование - это механизм, который позволяет классу наследовать атрибуты и методы другого класса. В Python каждый класс наследует некоторые методы от своего базового класса (названного родительским классом или суперклассом), таких как __init__() метод, который определяет, как создать объект класса. В дочернем классе вы можете переопределять методы, унаследованные от родительского класса, или добавлять новые атрибуты и методы. Наследование позволяет переиспользовать код и создавать иерархии классов для описания связей между объектами.

Вот пример класса, который наследует атрибуты и методы другого класса:
```py
class Animal:
def __init__(self, name):
self.name = name

def make_sound(self):
    pass

class Dog(Animal):
def make_sound(self):
return “woof!”
~~~
Dog является дочерним классом Animal, поэтому он автоматически наследует __init__() метод. Dog также переопределяет make_sound() метод, который был унаследован от Animal. Теперь мы можем создать объект Dog и вызвать его методы:
```py
my_dog = Dog(“Rufus”)
print(my_dog.name) # выводит “Rufus”
print(my_dog.make_sound()) # выводит “woof!”
~~~
Это пример простого наследования в Python. Наследование может быть глубоким и включать множество уровней иерархии классов.

73
Q

Что произойдет, если у вас есть ошибка в операторе __init__ ?

A

Если в операторе __init__ класса произойдет ошибка, то при создании экземпляра класса будет вызвано исключение TypeError. Это происходит потому что при вызове __init__ происходит инициализация объекта класса, и если эта инициализация завершается ошибкой, экземпляр класса не будет создан.

Пример:
```py
class MyClass:
def __init__(self, x):
self.value = 10 / x

obj = MyClass(0)
~~~
Этот код вызовет исключение ZeroDivisionError, так как происходит деление на ноль в операторе __init__. Если мы исправим код и передадим ненулевое значение аргумента x, то экземпляр класса создастся успешно.

74
Q

Что произойдет в питоне, если вы попытаетесь делить на ноль?

A

В Python при делении на 0 возникает исключение ZeroDivisionError. Например, если попробовать сделать 5 / 0, код выдаст ошибку:

ZeroDivisionError: division by zero
Чтобы избежать ошибки, можно использовать конструкцию try/except для обработки исключения:
```py
try:
x = 5 / 0
except ZeroDivisionError:
print(“Деление на ноль невозможно.”)
~~~
Этот код будет выводить сообщение “Деление на ноль невозможно.” в случае, если происходит деление на 0.

Использование этой конструкции особенно важно, если делитель задается пользователем и может быть равен 0 - это избавляет от нежелательного прерывания выполнения программы.

75
Q

Чем переменные экземпляра отличаются от переменных класса?

A

Переменные экземпляра отличаются от переменных класса тем, что они хранят данные, уникальные для каждого экземпляра класса. Переменные класса, также называемые переменными-членами, хранят данные, общие для всех экземпляров класса.

В Python переменные экземпляра объявляются внутри метода __init__, например:
```py
class MyClass:
def __init__(self, name):
self.name = name
~~~
Здесь переменная name является переменной экземпляра, так как она хранит уникальное значение для каждого объекта класса MyClass.

Переменные класса объявляются внутри класса, но вне методов. Они доступны через имя класса, а не через имя экземпляра. Например:
```py
class MyClass:
class_var = 0
~~~
Здесь переменная class_var является переменной класса и будет общей для всех объектов класса MyClass.

Для доступа к переменным экземпляра используется оператор точки ., а для доступа к переменным класса - имя класса, например:
```py
my_object = MyClass(‘test’)
print(my_object.name) # обращение к переменной экземпляра
print(MyClass.class_var) # обращение к переменной класса
~~~

76
Q

Объясните разницу между Map и Reduce и Filter?

A

Функции map(), reduce() и filter() относятся к так называемым встроенным функциям высшего порядка и используются для обработки коллекций данных, таких как списки или кортежи. Вот их краткое описание:

+ map() принимает функцию и коллекцию и возвращает новую коллекцию, где каждый элемент исходной коллекции заменен результатом применения переданной функции к этому элементу. Пример:

py
a = [1, 2, 3, 4, 5]
squared = map(lambda x: x**2, a)
print(list(squared)) # [1, 4, 9, 16, 25]
~~~
\+ reduce() принимает функцию и коллекцию и возвращает результат последовательного применения этой функции ко всем элементам коллекции до получения единственного значения. Пример:
py
import functools
a = [1, 2, 3, 4, 5]
product = functools.reduce(lambda x, y: x*y, a)
print(product) # 120
~~~
+ filter() принимает функцию и коллекцию и возвращает новую коллекцию, содержащую только те элементы исходной коллекции, которые удовлетворяют условию, определенному переданной функцией. Пример:
```py
a = [1, 2, 3, 4, 5]
even = filter(lambda x: x % 2 == 0, a)
print(list(even)) # [2, 4]
~~~
Таким образом, Map и Filter принимают коллекцию и возвращают новую коллекцию, в то время как Reduce принимает коллекцию и возвращает одно значение, полученное последовательным применением функции к элементам коллекции.
77
Q

Что такое Генераторы?

A

использование

Генераторы (generators) - это функции, которые используются для создания итераторов. Они позволяют генерировать значения на лету, вместо того, чтобы хранить все значения в памяти сразу, что может быть полезно при работе с большими объемами данных.

Генераторы создаются с помощью ключевого слова yield. Когда функция с yield вызывается, она возвращает объект-генератор, который может быть проитерирован с помощью цикла for или функции next(), вызывая тело функции до тех пор, пока не будет достигнуто выражение yield.

Пример генератора, который возвращает список квадратов чисел от 1 до 10:
```py
def squares():
for i in range(1, 11):
yield i**2

for square in squares():
print(square)
~~~
Также можно использовать генераторы в качестве аргументов функций, например, sum() или list():
```py
def squares():
for i in range(1, 11):
yield i**2

print(sum(squares())) # 385
print(list(squares())) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
~~~

78
Q

Что такое Итераторы?

A

Итератор - это объект, который генерирует последовательность элементов. Итератор является объектом, который можно проитерировать, то есть пройти по нему в цикле for. Когда вызывается функция iter() на итерируемом объекте, она создает и возвращает итератор.

Чтобы создать собственный итератор в Python, нужно определить специальные методы __iter__() и __next__(). Метод __iter__() должен возвращать сам объект итератора, а метод __next__() должен возвращать следующий элемент последовательности или возбуждать исключение StopIteration, если элементов больше нет.

Вот пример, как использовать итератор для прохода по списку:
```py
my_list = [1, 2, 3]
my_iterator = iter(my_list)

print(next(my_iterator)) # 1
print(next(my_iterator)) # 2
print(next(my_iterator)) # 3
~~~
Вызовы функции next() в последней строке генерируют элементы списка последовательно.

79
Q

Можно ли использовать генератор для создания итераторов? Приведите пример.

A

Да, возможно использовать генератор для создания итераторов в Python. Вот пример такого использования:
```py
def my_generator(n):
for i in range(n):
yield i * i

class MyIterator:
def __init__(self, n):
self.generator = my_generator(n)

def \_\_next\_\_(self):
    return next(self.generator)

def \_\_iter\_\_(self):
    return self

использование
my_iterator = MyIterator(5)
for i in my_iterator:
print(i)
~~~
В этом примере генератор my_generator используется для итерирования n раз и возврата квадрата индекса i. Затем создается итератор MyIterator, который использует этот генератор. Класс MyIterator определяет методы __next__ для получения следующего элемента и __iter__ для возврата самого себя в качестве итератора.

При использовании генератора в качестве основы для итератора вы можете избежать необходимости явно определять методы __next__ и __iter__ в классе итератора. Более того, использование генераторов позволяет сократить объем кода, делая его более читаемым и поддерживаемым.

80
Q

Можно ли использовать итераторы для создания генератора?

A

Да, итераторы могут быть использованы для создания генераторов. Генератор - это специальный тип итератора, который обычно создается с помощью ключевых слов yield или yield from. Пример:
```py
def my_generator():
for i in range(10):
yield i

gen = my_generator()
for i in gen:
print(i)
~~~

Этот код создает функцию-генератор my_generator, которая итерируется по диапазону от 0 до 9 и возвращает каждое значение с помощью yield. Затем он создает экземпляр генератора и использует его в цикле for, чтобы вывести каждое значение.

Генераторы создаются с помощью функций и возвращают итераторы, которые могут быть использованы для итерации по значениям возвращаемым генератором.

Таким образом, итераторы и генераторы - это связанные понятия в Python, и вы можете использовать итераторы для создания генераторов.

81
Q

Что такое итераторы и генераторы?

A

Итератор - это объект, который позволяет итерироваться (проходить) по другому объекту (например, коллекции) и получать его значения по одному. Для создания итератора нужно реализовать методы __iter__() и __next__() в соответствующем классе.

Генератор - это специальная форма итератора, которая может быть создана с помощью ключевого слова yield. Генераторы позволяют создавать последовательности значений без необходимости хранения всех значений в памяти одновременно, что делает их полезными для работы с большими данными, такими как файлы или потоки сетевого ввода-вывода.

Вот примеры создания итератора и генератора:
```py
# Пример итератора
class MyIterator:
def __init__(self, iterable):
self.index = 0
self.iterable = iterable

def \_\_iter\_\_(self):
    return self

def \_\_next\_\_(self):
    if self.index >= len(self.iterable):
        raise StopIteration
    value = self.iterable[self.index]
    self.index += 1
    return value

Пример генератора
def my_generator(iterable):
for item in iterable:
yield item
~~~
Эти примеры можно использовать следующим образом:
```py
# Использование итератора
my_list = [1, 2, 3]
my_iterator = MyIterator(my_list)
for item in my_iterator:
print(item)

Использование генератора
my_list = [1, 2, 3]
my_generator = my_generator(my_list)
for item in my_generator:
print(item)
~~~
В первом примере мы создали класс MyIterator, который реализует методы __iter__() и __next__(). Во втором примере мы определили функцию, используя ключевое слово yield.

82
Q

Что такое Method Resolution Order?

A

python Что такое Method Resolution Order (MRO)?
Method Resolution Order (MRO) — это порядок, в котором интерпретатор ищет методы при множественном наследовании. MRO описывает, как Python разрешает методы, вызываемые по наследству. Он определяет порядок, в котором функции и методы с одинаковыми именами в базовых классах располагаются при поиске.

По умолчанию Python использует алгоритм C3 линеаризации, чтобы вычислить MRO. Этот алгоритм гарантирует, что при следовании MRO будут учитываться все исходные порядки, сохраняя при этом их локальный порядок.

MRO является важной концепцией множественного наследования в Python, и его понимание необходимо для эффективного использования этого языка.

83
Q

В чем разница между методами append() и extend()?

A

Метод append() используется в Python для добавления нового элемента в конец списка. Например:

py
mylist = [1, 2, 3]
mylist.append(4)
print(mylist) # [1, 2, 3, 4]
~~~
С другой стороны, метод extend() используется для объединения двух списков. Он добавляет каждый элемент второго списка в конец первого списка. Например:
py
mylist1 = [1, 2, 3]
mylist2 = [4, 5, 6]
mylist1.extend(mylist2)
print(mylist1) # [1, 2, 3, 4, 5, 6]
~~~
Можно также использовать оператор + для объединения двух списков:
```py
my_list = [1, 2, 3]
other_list = [4, 5, 6]
new_list = my_list + other_list
print(new_list) # [1, 2, 3, 4, 5, 6]
~~~
Таким образом, разница между методами append() и extend() заключается в том, что append() добавляет новый элемент в конец списка, а extend() добавляет содержимое другого списка в конец первого списка.
84
Q

Как вы можете реализовать функциональное программирование и зачем?

A

Вы можете реализовать функциональное программирование с помощью функций высшего порядка, замыканий и списковых включений. Функциональное программирование обычно используется для создания устойчивых и легко поддерживаемых программ, поскольку функции имеют строго определенные входные и выходные параметры и не имеют побочных эффектов, таких как изменения глобальных переменных или изменения состояния объектов.

Зачем использовать функциональное программирование? Функциональный подход может помочь решить некоторые проблемы в программировании, такие как управление состоянием и улучшение модульности и повторного использования кода. Он также может ускорить процесс разработки благодаря своей простоте и высокому уровню абстракции.

Например, вот как можно использовать функциональный подход в Python:
```py
# Функция высшего порядка возвращает функцию, которая умножает число на заданный множитель
def multiply_by(multiplier):
def multiply(number):
return number * multiplier
return multiply

Создание объекта функции, который умножает число на 5
multiply_by_five = multiply_by(5)

Использование функции для умножения числа на 5
result = multiply_by_five(3) # Результат: 15
~~~
Здесь функция multiply_by() является функцией высшего порядка, которая принимает множитель и возвращает функцию multiply(), которая умножает число на множитель. Создание объекта функции multiply_by_five позволяет использовать ее для умножения любого числа на 5.

85
Q

Объясните ctypes и зачем их использовать?

A

Модуль ctypes в Python позволяет работать с библиотеками на C и использовать их функции и переменные в Python-скриптах. Он используется для доступа к существующим библиотекам на C и для создания оболочек Python для таких библиотек.

С помощью ctypes можно использовать функции на C в Python, написав соответствующий прототип функции и указав, что она расположена в данной библиотеке. Также можно работать с переменными на C в Python, передавая указатель на переменную и определяя её тип.

Преимущества использования ctypes заключаются в том, что это стандартный модуль Python и он не требует установки дополнительных библиотек. Он также позволяет использовать преимущества быстродействия кода на C.

86
Q

Что такое множественное наследование и когда его следует использовать?

A

Множественное наследование - это когда класс наследуется от нескольких базовых классов. Это означает, что класс-потомок получает свойства и методы от всех своих базовых классов.

Пример использования множественного наследования в Python:
```py
class A:
def method_a(self):
print(“Method A”)

class B:
def method_b(self):
print(“Method B”)

class C(A, B):
def method_c(self):
print(“Method C”)

obj_c = C()
obj_c.method_a() # Output: Method A
obj_c.method_b() # Output: Method B
obj_c.method_c() # Output: Method C
~~~
В этом примере классы A и B являются базовыми классами для класса C. Класс C получает свойства и методы от классов A и B, и может использовать их в своих собственных методах.

Множественное наследование может быть полезно, когда вам нужно использовать свойства и методы из разных классов, чтобы создать новый класс с уникальным поведением. Однако, когда используется множественное наследование, может возникать проблема “алмазного наследования”, когда два базовых класса оба имеют одноименный метод, что может привести к неоднозначности и ошибкам в коде.

Если такая проблема возникает, то рекомендуется пользоваться композицией вместо множественного наследования. Композиция - это когда вы создаете класс, включающий в себя другие классы в качестве своих атрибутов. Для примера, класс может иметь атрибут объекта класса вместо наследования от этого класса.

87
Q

Что такое метакласс?

A

Метакласс в Python - это класс, который определяет поведение других классов. Когда мы определяем класс, интерпретатор Python использует метакласс (по умолчанию - type) для создания этого класса. Метаклассы позволяют изменять поведение классов и их экземпляров, а также добавлять свои собственные методы и атрибуты.

Вот пример метакласса, который добавляет метод custom_method() в класс MyClass:
```py
class MyMeta(type):
def __new__(cls, name, bases, dct):
dct[‘custom_method’] = lambda self: print(‘Hello, world!’)
return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=MyMeta):
pass

obj = MyClass()
obj.custom_method() # output: Hello, world!
~~~
В этом примере MyMeta является метаклассом , который добавляет метод custom_method() в класс MyClass. Затем мы создаем экземпляр MyClass и вызываем добавленный метод на этом экземпляре, выводя строку “Hello, world!”.

Еще один пример использования метаклассов - это создание синглтона, когда мы хотим, чтобы у нас был только один экземпляр класса:
```py
class Singleton(type):
_instances = {}

def \_\_call\_\_(cls, *args, **kwargs):
    if cls not in cls._instances:
        cls._instances[cls] = super().\_\_call\_\_(*args, **kwargs)
    return cls._instances[cls]

class MyClass(metaclass=Singleton):
pass

a = MyClass()
b = MyClass()

print(a is b) # output: True
~~~
В этом примере Singleton является метаклассом , который гарантирует, что у нас будет только один экземпляр класса MyClass благодаря словарю _instances. Когда мы создаем

88
Q

Что такое свойства и в чем смысл?

A

В Python свойства — это способ управления доступом к атрибутам класса. Они позволяют вам определять методы получения и установки, которые вызываются автоматически при доступе к атрибуту или его изменении. Смысл использования свойств состоит в том, чтобы обеспечить контролируемый доступ к данным класса и их изменение.

Свойства могут помочь вам предотвратить ошибки, обеспечить соблюдение ограничений и добавить дополнительную проверку или вычисление в процесс доступа или изменения атрибута.

Например, вы можете использовать свойство, чтобы убедиться, что атрибут класса всегда положительный, или чтобы гарантировать, что строковый атрибут всегда пишется с заглавной буквы. Используя свойства для принудительного применения таких ограничений, вы можете упростить свой код и снизить вероятность ошибок программирования.

89
Q

Что такое строка Юникода?

A

Строка юникода в Python - это объект строки, который использует стандарт Юникода для представления символов. Это позволяет работать с текстом, содержащим символы различных языков, кодировок и символьных наборов.

Строки в Python по умолчанию используют кодировку Unicode, и знание этого стандарта является необходимым для эффективной работы с текстом в Python.

В Python 3 все текстовые строки (тип str) представляются в Unicode, а в Python 2 для работы с Unicode необходимо использовать отдельный тип unicode.

Для работы со строками в Unicode в Python используются различные функции и методы, такие как кодирование и декодирование строк, получение символов по их кодам в юникоде и многое другое.

90
Q

Что делает оператор yield?

A

Оператор yield в Python используется для создания генераторов — объектов, которые лениво генерируют последовательность значений. Он приостанавливает выполнение функции-генератора и возвращает значение, как будто функция завершена. Тем не менее, контекст выполнения сохраняется, и при следующем вызове функции выполнение продолжится с того же места, где оно было остановлено, а не с начала. Кроме того, функция-генератор может получать значения от вызывающей программы при помощи оператора send(value). Пример:
```py
def generate_numbers(start, end):
while start <= end:
yield start
start += 1

numbers = generate_numbers(1, 5)
for number in numbers:
print(number)
~~~
Этот код создаст генератор, который будет выдавать числа от 1 до 5 включительно. Как только в цикле for будет запрошено следующее значение, выполнение функции-генератора продолжится с того момента, где оно было приостановлено.

91
Q

Что такое полиморфизм и когда его использовать?

A

Полиморфизм в объектно-ориентированном программировании (ООП) - это возможность обработки объектов разных классов с помощью общих методов. В Python полиморфизм можно реализовать с помощью множественного наследования и переопределения методов родительских классов в дочерних классах. Это позволяет использовать один и тот же метод с разными объектами разных классов.

Вот несколько примеров полиморфизма в Python:

+ Метод len(), который можно использовать для получения длины любой последовательности, например, списка или строки:

py
my_list = [1, 2, 3, 4, 5]
my_string = "Hello, world!"
print(len(my_list))     # выводит 5
print(len(my_string))   # выводит 13
~~~
\+ Метод +, который может использоваться для объединения разных типов объектов, например, строк и чисел:
py
my_string = “Hello, “
my_name = “John”
my_number = 42
print(my_string + my_name) # выводит “Hello, John”
print(my_number + 10) # выводит 52
~~~
+ Функция isinstance(), которая позволяет проверять, принадлежит ли объект определенному классу. Например:
```py
my_list = [1, 2, 3, 4, 5]
if isinstance(my_list, list):
print(“This is a list”)
~~~
Это объясняет, что такое полиморфизм и как его использовать в Python.
92
Q

Как вы упаковываете код Python?

A

Существует несколько способов упаковки кода Python, включая использование модулей, сборщиков и инструментов для создания исполняемых файлов. Ниже перечислены некоторые из них:

+ Использование модулей: вы можете создать модуль, содержащий свой код, и импортировать его в другие программы. Это позволяет вам организовать свой код в более логические блоки и повторно использовать его в других проектах.

+ Использование сборщиков: существуют различные сборщики для Python, которые позволяют объединить весь ваш код и его зависимости в один пакет, который можно легко установить и использовать на других компьютерах. Некоторые из наиболее популярных сборщиков включают в себя setuptools, py2exe и PyInstaller.

+ Создание исполняемого файла: Вы можете использовать инструменты, такие как Nuitka или cx_Freeze для создания исполняемого файла, который позволяет запустить вашу программу без необходимости установки Python на компьютере пользователя.

+ Использование контейнеров: вы можете использовать контейнеры, такие как Docker, для упаковки вашего Python-приложения вместе с его зависимостями и запуска его на любой платформе, где работает Docker.

Выбор конкретного метода упаковки зависит от ваших потребностей и требований вашего проекта.

93
Q

Компилируется ли Python? Если да, то как, если нет, то как.

A

Python - это интерпретируемый язык программирования, что означает, что код Python не компилируется в машинный язык, а вместо этого выполняется непосредственно интерпретатором Python во время исполнения программы.

Однако существует несколько инструментов, которые могут быть использованы для создания исполняемых файлов из кода Python, например, PyInstaller и cx_Freeze. Эти инструменты упаковывают код Python и все его зависимости в один исполняемый файл, который можно запустить на целевой платформе без необходимости установки интерпретатора Python на этой платформе.

Таким образом, можно сказать, что Python не компилируется, но может быть упакован в исполняемый файл с помощью сторонних инструментов.

94
Q

Что означает \_\_some-variable\_\_ ?

A

Двойное подчеркивание перед и после имени переменной в Python называется “dunder” (Double underscore) и используется для специальных методов и атрибутов, которые могут быть вызваны автоматически. Например, __init__ - это специальный метод, который вызывается при создании экземпляра класса. Другие примеры включают __str__, __len__, __call__, __iter__, и так далее.

Также могут использоваться “dunder” атрибуты, такие как __name__, __module__, __doc__, __file__, __dict__, __class__, __all__ и другие, которые предоставляют информацию о модуле, классе, функции или другом объекте.

Значение, которое присваивается такой переменной, зависит от контекста использования. Например, __name__ - это специальный атрибут, который содержит имя текущего модуля.

Обычно используйте двойное подчеркивание только для специальных методов и атрибутов, которые имеют специальный смысл в языке Python, и не используйте такие имена для своих собственных переменных, чтобы избежать конфликтов и неожиданного поведения

95
Q

Должен ли я импортировать весь модуль?

A

Можно импортировать только нужные функции из модуля, используя синтаксис from module import function. Например, для импорта только функции sqrt из модуля math, необходимо написать:

py
from math import sqrt
~~~
Если вам нужно использовать несколько функций из модуля, можно перечислить их через запятую:
py
from math import sqrt, sin, cos
~~~
Если вы хотите импортировать весь модуль, можно использовать синтаксис import module. Это импортирует весь модуль и дает доступ ко всем его элементам через пространство имен модуля. Например, для импорта модуля math:
py
import math
~~~
Затем, чтобы использовать его функции, нужно указывать имя модуля перед именем функции:
py
x = math.sqrt(25)
~~~
Можно также использовать псевдоним для модуля, чтобы сделать имя более коротким. Например:
```py
import math as m
x = m.sqrt(25)
~~~
Параметр “as” позволяет задать псевдоним для импортированного модуля. В данном случае, был задан псевдоним m, вместо полного имени модуля math.
96
Q

Что означает dynamicly/duck тип?

A

В языках программирования термины «динамически типизированный» и «утиный тип» часто используются взаимозаменяемо для описания системы типов, в которой переменным не присваивается конкретный тип во время компиляции, а тип определяется во время выполнения на основе присвоенного значения. к переменной. Другими словами, тип переменной может динамически изменяться во время выполнения программы. Это отличается от статически типизированных языков, которые требуют, чтобы переменные были явно объявлены с определенным типом во время компиляции, и тип не может быть изменен во время выполнения. Термин «утиная типизация» специально подчеркивает идею о том, что если объект ведет себя как определенный тип (или «ходит как утка и крякает как утка»), то его можно рассматривать как этот тип, независимо от его фактического типа. Это означает, что код можно оптимизировать для совместимости со многими различными типами объектов, если эти объекты поддерживают те же операции, что и тип. что код ожидает.

Python — это язык с динамической типизацией, который использует утиную типизацию 12, что означает, что тип переменной определяется во время выполнения на основе значения, которое она содержит, а объекты рассматриваются как принадлежащие к определенному типу на основе их поведения, а не их фактического типа. .

97
Q

Когда я не буду использовать Python?

A

Python — это универсальный язык, который можно использовать в самых разных областях. Однако есть определенные ситуации, когда Python может быть не лучшим выбором. Вот несколько сценариев, в которых вы можете рассмотреть возможность использования другого языка:

+ Высокопроизводительные вычисления. Хотя Python известен своей простотой использования и удобочитаемостью, он может быть не лучшим выбором для высокопроизводительных вычислений, таких как научные вычисления или машинное обучение. В этих случаях лучшим вариантом могут быть такие языки, как C++ или Julia.

+ Разработка мобильных приложений. Хотя с помощью Python можно разрабатывать мобильные приложения, это не самый популярный язык для этой области. Вместо этого более популярны такие языки, как Java (для Android) или Swift (для iOS).

+ Системы реального времени: Python — это интерпретируемый язык, а это означает, что его выполнение обычно медленнее, чем в скомпилированных языках. Это может быть недостатком, если вы разрабатываете системы реального времени, которые требуют очень быстрых и точных ответов.

+ Низкий уровень программирования: если вам нужно взаимодействовать с оборудованием или писать низкоуровневый код, такой как драйверы устройств, Python может быть не лучшим выбором. Вместо этого для этих задач лучше подходят такие языки, как C или Rust.

+ Браузерные приложения. Хотя Python можно использовать в веб-разработке, он не так хорошо подходит для браузерных приложений, как такие языки, как JavaScript, который является основным языком Интернета.

Обратите внимание, что это всего лишь несколько сценариев, в которых Python может быть не лучшим выбором, и могут быть другие факторы, характерные для вашего проекта, которые делают другой язык более подходящим.

98
Q

Что такое DRY, как я могу применить его через ООП или FP?

A

DRY - это принцип разработки, который означает “Don’t Repeat Yourself” (не повторяйся). В контексте программирования, DRY означает, что любой фрагмент кода должен иметь только один источник истины, и он должен быть легко доступен и изменяем. Это уменьшает количество дублирующегося кода и упрощает процесс сопровождения и изменения кода.

Через ООП или ФП, можно применять принцип DRY следующим образом:

ООП: используйте наследование, полиморфизм и абстракцию для организации кода. Вынесите общие методы и свойства в родительские классы, а для каждого подкласса определите только те функции, которые отличают его от других.

ФП: используйте функции высшего порядка, замыкания и лямбда-выражения. Выносите общие функции в модули или библиотеки, и переиспользуйте их при необходимости.

Вот пример того, как ООП можно использовать для применения принципов DRY:
```py
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def introduce(self):
    print(f"My name is {self.name} and I am {self.age} years old.")

class Student(Person):
def __init__(self, name, age, major):
super().__init__(name, age)
self.major = major

def introduce(self):
    super().introduce()
    print(f"I am majoring in {self.major}.")

class Teacher(Person):
def __init__(self, name, age, department):
super().__init__(name, age)
self.department = department

def introduce(self):
    super().introduce()
    print(f"I teach in the {self.department} department.")

~~~
Класс Person содержит общие атрибуты и поведение для всех людей в системе. Классы Student и Teacher наследуют от Person и добавляют свои определенные атрибуты и поведение. Таким образом, мы избегаем дублирования кода таких атрибутов, как имя и возраст, или таких методов, как внедрение.

Используя ООП и наследование, мы можем эффективно применять принципы DRY и сделать код более удобным в сопровождении и расширяемым. Точно так же вы можете использовать функции и композицию более высокого порядка в FP для достижения тех же целей.

99
Q

Когда я буду использовать Python?

A

Вы можете использовать Python во многих различных сферах, включая:

+ Научные исследования, включая обработку данных и машинное обучение

+ Создание веб-приложений с использованием фреймворков, таких как Django и Flask

+ Разработка программного обеспечения для администрирования систем и автоматизации задач

+ Создание игр с использованием библиотек, таких как Pygame

+ Разработка десктопных приложений с использованием фреймворков, таких как PyQt и Tkinter

+ Создание скриптов для автоматизации задач и обработки данных.

Кроме того, Python является одним из самых популярных языков программирования и предлагает широкий спектр библиотек и инструментов, делая его полезным для многих проектов.

100
Q

Приведите примеры Python Framework?

A

Некоторые популярные Python фреймворки:

+ Django - это высокоуровневый веб-фреймворк с отличной документацией и многочисленными плагинами. Он используется для создания крупных веб-приложений и имеет набор готовых модулей и инструментов, которые облегчают создание приложения.

+ Flask - это микро-фреймворк, который полностью опирается на ядро Python. Он дает разработчикам свободу выбора инструментов и библиотек, которые они хотят использовать, и не навязывает им предпочтительных способов организации кода.

+ Pyramid - это универсальный фреймворк для создания веб-приложений. Он позволяет создавать приложения любой сложности и может быть использован для различных видов проектов, от маленьких экспериментов до огромных корпоративных приложений.

+ Bottle - это легковесный фреймворк, который сосредоточен на быстрой и простой разработке. С его помощью можно быстро создать простое приложение в несколько строк кода.

+ CherryPy - это фреймворк, который используется для создания сетевых приложений. Он просто в использовании и включает в себя различные возможности, такие как встроенный веб-сервер и поддержку работы с AJAX.

Это лишь несколько примеров Python фреймворков из множества доступных в Python.

101
Q

Как интерпретируется Python.

A

Python обычно считается интерпретируемым языком, что означает, что он не компилируется перед выполнением. Вместо этого интерпретатор Python считывает и компилирует каждую строку кода одну за другой во время выполнения.

Исходный код сначала транслируется в промежуточный байт-код, который затем выполняется виртуальной машиной Python. Этот процесс позволяет легко запускать код Python на нескольких платформах без необходимости использования каких-либо дополнительных инструментов или компиляторов. Тем не менее, в этом процессе присутствует некоторый уровень компиляции.

Интерпретатор Python сначала считывает и оптимизирует код, написанный человеком, в некую промежуточную форму, прежде чем интерпретировать его в машинный код. Кроме того, методы компиляции Just-In-Time (JIT), используемые некоторыми реализациями Python, такими как PyPy, могут компилировать код налету для повышения производительности.

Таким образом, Python — это в первую очередь интерпретируемый язык с некоторой компиляцией, связанной с процессом. Интерпретатор читает код и выполняет необходимые действия. оптимизация и переводы во время выполнения для выполнения программы.

102
Q

Объясните dict().

A

Для создания словаря в Python используется встроенный класс dict. Словарь представляет собой неупорядоченный набор пар ключ-значение, где каждый ключ должен быть уникальным. Ключами могут быть объекты любого неизменяемого типа данных (например, числа, строки, кортежи), а значения могут быть любого типа данных (числа, строки, списки, другие словари и т.д.). Словарь можно создать с помощью литерала {} или встроенной функции dict(). Примеры:
```py
# Создание словаря с помощью литерала
my_dict = {‘key1’: ‘value1’, ‘key2’: ‘value2’, ‘key3’: ‘value3’}

Создание словаря с помощью функции dict()
my_dict = dict(key1=’value1’, key2=’value2’, key3=’value3’)
~~~
Чтение и запись элементов в словарь осуществляется по ключу с помощью оператора []. Примеры:
```py
# Чтение элемента по ключу
value = my_dict[‘key1’]

Запись элемента по ключу
my_dict[‘key4’] = ‘value4’
~~~
Также для работы со словарем в Python есть множество встроенных методов и функций, таких как keys(), values(), items(), get(), pop(), update() и многие другие.

103
Q

Как передавать необязательные или ключевые аргументы.

A

Для передачи необязательных аргументов в Python используются *args и **kwargs.

*args - это список неименованных аргументов, которые могут быть переданы в функцию. Они собираются в кортеж.

**kwargs - это словарь именованных аргументов, которые могут быть переданы в функцию. Имена аргументов и их значения указываются в форме ключевых слов.

Вот пример использования args и **kwargs в Python:
```py
def my_function(
args, **kwargs):
# Работа с неименованными аргументами (args)
for arg in args:
print(arg)

# Работа с именованными аргументами (kwargs)
for key, value in kwargs.items():
    print(f"{key} = {value}")

Вызов функции с неименованными аргументами
my_function(‘Hello’, ‘world’, ‘!’)

Вызов функции с именованными аргументами
my_function(first_name=’John’, last_name=’Doe’, age=30)
~~~
В первом вызове функции передаются неименованные аргументы “Hello”, “world” и “!”.

Во втором вызове функции передаются именованные аргументы first_name, last_name и age.

104
Q

Объясните индексацию и срез.

A

Индексация и срезы в Python позволяют получать доступ к конкретным элементам или подстрокам в строке, списке или другом итерируемом объекте.

Индексация используется для получения одного элемента из объекта с помощью его индекса. Индексация начинается с нуля для первого элемента и увеличивается на единицу для каждого последующего элемента. Чтобы получить элемент с индексом i из объекта obj, вы можете использовать выражение obj[i].

Срезы позволяют получать подстроку или подсписок из объекта. Срезы имеют три параметра: начальный индекс, конечный индекс и шаг. Начальный индекс указывает, с какого индекса начинать, конечный индекс указывает, на каком индексе закончить, а шаг указывает, какие элементы пропустить между начальным и конечным индексами. Вы можете использовать выражение obj[start:end:step], чтобы получить срез объекта от индекса start до индекса end-1 с шагом step.

Примеры:
```py
s = ‘Hello, World!’
print(s[0]) # output: ‘H’
print(s[7]) # output: ‘W’
print(s[-1]) # output: ‘!’
print(s[0:5]) # output: ‘Hello’
print(s[:5]) # output: ‘Hello’
print(s[7:]) # output: ‘World!’
print(s[::2]) # output: ‘Hlo ol!’
~~~

105
Q

Разница между str() и repr().

A

str() и repr() — это встроенные в Python функции, которые можно использовать для получения строковых представлений объекта, но разница между ними заключается в контексте, в котором они используются.

+ str(obj) используется для получения печатного строкового представления объекта, которое обычно предназначено для удобочитаемости. Он обычно используется, когда код пытается вывести что-то на консоль или в файл, или когда он преобразует объект в строку для целей отображения.
+ repr(obj) используется для получения «официального» строкового представления объекта, которое в идеале должно быть действительным кодом Python, который можно использовать для воссоздания объекта. Он обычно используется в сценариях отладки или когда код пытается отобразить строку, представляющую объект таким образом, который более точно отражает его внутреннюю структуру.

Основное различие между str() и repr() заключается в том, что str() возвращает человекочитаемое представление объекта в виде строки, а repr() возвращает представление объекта в виде строки, которое может быть использовано для создания копии объекта или его точного воссоздания.

Обычно используется str() для вывода строки на экран или в файл, а repr() для отладки или вывода информации о типе и значении объекта.

Например:
```py
class Example:
def __init__(self):
self.value = 42
def __repr__(self):
return ‘Example(‘ + str(self.value) + ‘)’
def __str__(self):
return ‘The value is ‘ + str(self.value)

e = Example()

print(str(e)) # “The value is 42”
print(repr(e)) # “Example(42)”
~~~
В этом примере мы определили класс Example, имеющий реализацию методов __str__() и __repr__(). Вызов str(e) возвращает “The value is 42”, тогда как repr(e) возвращает “Example(42)”.

Если метод __str__() не определен в классе, то будет использоваться метод __repr__(). Если метод __repr__() не определен, будет выводиться строковое представление по умолчанию для данного класса, которое не всегда будет информативным.

Например, если определить класс без методов __str__() и __repr__():
```py
class Example2:
def __init__(self):
self.value = 42

e = Example2()

print(str(e)) # “<__main__.Example2 object at 0x7f8aadd16c10>”
print(repr(e)) # “<__main__.Example2 object at 0x7f8aadd16c10>”
~~~

106
Q

Что такое динамическая типизация?

A

Динамическая типизация - это свойство языка Python, которое позволяет изменять тип переменной во время выполнения программы. То есть, в отличие от языков Java или C++, где тип переменной определяется в момент ее объявления и не может быть изменен в процессе выполнения программы, в Python тип переменной может быть изменен на любой другой тип в любой момент времени.

Например, вы можете объявить переменную x как целое число (int) и затем изменить ее на строку (str), если это необходимо:

py
x = 5
x = "Hello"
~~~
Для определения типа переменной в Python можно использовать функцию type():
py
x = 5
print(type(x)) # <class ‘int’>

x = “Hello”
print(type(x)) # <class ‘str’>
~~~
Это свойство динамической типизации Python позволяет писать более гибкий и более экономичный код, так как не требуется жесткое определение типов для каждой переменной в программе.

107
Q

Обоснуйте это утверждение: в Python все является объектом?

A

В Python все, включая переменные, функции, модули, даже базовые типы данных (например, числа, строки, списки и т.д.), являются объектами. Это означает, что они имеют определенный тип, атрибуты и методы, которые можно вызывать на этих объектах. Python является объектно-ориентированным языком программирования, где объекты используются для представления всех структур данных и функциональных возможностей языка. Таким образом, все в Python является объектом, что позволяет гибко использовать их в программировании.

108
Q

Что такое промежуточное программное обеспечение?

A

В Python промежуточное программное обеспечение — это класс или функция, которая перехватывает, обрабатывает или изменяет HTTP-запрос или ответ до того, как он будет отправлен или получен веб-приложением. ПО промежуточного слоя может выполнять множество задач, таких как ведение журнала, проверка подлинности, ограничение скорости или изменение заголовков ответа. В популярных веб-фреймворках Python, таких как Django или Flask, промежуточное ПО реализовано в виде серии классов, которые регистрируются в приложении и выполняются в определенном порядке при получении запроса. Это позволяет объединять ПО промежуточного слоя в цепочку для выполнения сложных операций или изменения запроса или ответа по мере его прохождения через цикл запроса/ответа приложения. Промежуточное ПО — это мощный инструмент для настройки поведения веб-приложений, который можно использовать для реализации широкого спектра функций.

109
Q

Какая польза от enumerate() в Python?

A

Функция enumerate() в Python применяется для итерирования по последовательности (например, списку) и возвращения пары значений: индекса текущего элемента и самого элемента. Это позволяет упростить код для итерации по элементам, особенно если вам нужно сохранить не только значение элемента, но также его индекс в последовательности.

Преимущество использования enumerate() заключается в том, что вы не нуждаетесь в дополнительной переменной для отслеживания индексов элементов в списке. Вместо этого вы можете использовать enumerate() для одновременного перебора элементов и соответствующих индексов. Это может существенно сократить количество написанного кода

Например:
```py
my_list = [‘apple’, ‘banana’, ‘orange’]
for index, value in enumerate(my_list):
print(f’The value {value} is at index {index}’)
Это выведет следующее:

The value apple is at index 0
The value banana is at index 1
The value orange is at index 2
~~~
Таким образом, enumerate() упрощает сопоставление значений и соответствующих индексов в последовательности, что делает код более читаемым и понятным.

110
Q

Что такое сжатие списка/словаря.

A

Сжатие списков и словарей — это функция синтаксиса Python, которая позволяет создавать списки и словари в сжатой и удобочитаемой форме.

Сжатие списков позволяет создавать новый список путем фильтрации и преобразования данного итерируемого объекта. Вот пример сжатие списка, который создает новый список чисел в квадрате из существующего списка:
```py
numbers = [1, 2, 3, 4, 5]
squared_numbers = [num**2 for num in numbers]
~~~

Сжатие словаря работает аналогично, но позволяет вам создать новый словарь из итерируемого объекта, указав пары ключ-значение. Вот пример понимания словаря, который создает новый словарь ключей и значений в верхнем регистре:

```py
original_dict = {‘apple’: ‘red’, ‘banana’: ‘yellow’, ‘grape’: ‘purple’}
new_dict = {key.upper(): value.upper() for key, value in original_dict.items()}
~~~
В обоих случаях код значительно короче и читабельнее, чем при использовании традиционных циклов for для создания того же вывода. В целом, сжатие списков и словарей — это мощные инструменты, которые позволяют создавать краткий и удобочитаемый код Python.

111
Q

Как сделать массив в Python?

A

Чтобы создать список (массив) в Python, вы можете использовать квадратные скобки и разделять элементы запятыми. Примеры:

Создание пустого списка:

py
my_list = []
~~~
Создание списка с несколькими элементами:
py
my_list = [1, 2, 3, “строка”, True]
~~~
Вы можете получить доступ к элементам списка по их индексу, начиная с 0. Пример:
py
my_list = [1, 2, 3, "строка", True]
print(my_list[3])  # выводит "строка"
~~~
Также вы можете изменять элементы списка по их индексу:
py
my_list = [1, 2, 3, “строка”, True]
my_list[1] = 5
print(my_list) # выводит [1, 5, 3, “строка”, True]
~~~
112
Q

Как генерировать случайные числа?

A

Для генерации случайных чисел можно использовать модуль random. Есть несколько функций для генерации случайных чисел:

+ random.random() - генерирует случайное число от 0 до 1.

+ random.randint(a, b) - генерирует случайное целое число в диапазоне от a до b включительно.

+ random.uniform(a, b) - генерирует случайное число с плавающей точкой в диапазоне от a до b.

+ random.choice(sequence) - выбирает случайный элемент из заданной последовательности.

Для использования модуля random нужно его импортировать с помощью команды import random. Вот примеры использования:
```py
import random

Генерирование случайного целого числа в диапазоне от 0 до 100
random_number = random.randint(0, 100)
print(random_number)

Генерирование случайного числа с плавающей точкой в диапазоне от 0 до 1
random_float = random.random()
print(random_float)

Выбор случайного элемента из списка
my_list = [“apple”, “banana”, “cherry”]
random_element = random.choice(my_list)
print(random_element)
~~~

113
Q

Как обрабатывать исключения?

A

Исключения обрабатываются с помощью конструкции try - except. Вы можете поместить блок кода, который может вызвать ошибку (исключение), в конструкцию try. В блок except вы можете поместить код, который должен быть выполнен, если произошло исключение.
```py
try:
# некоторый код, который может вызвать исключение
except SomeException:
# код для обработки исключения
except AnotherException:
# код для обработки другого исключения
else:
# код, который будет выполняться, если в блоке try не возникло никаких исключений
finally:
# код, который будет выполняться несмотря ни на что
~~~
except может иметь несколько блоков, чтобы обрабатывать различные типы исключений. Вы также можете добавить блок else, который будет выполнен только в том случае, если исключение не было вызвано. Блок finally содержит код, который будет выполнен независимо от того, произошло исключение или нет.

Вот исходный код, который показывает пример использования конструкции try - except:
```py
try:
x = int(input(“Введите число: “))
y = 1 / x
except ZeroDivisionError:
print(“На ноль делить нельзя!”)
except ValueError:
print(“Вы ввели не число!”)
else:
print(“Результат: “, y)
finally:
print(“Конец программы”)
~~~
В этом примере, если пользователь вводит 0 в качестве значения, мы получим сообщение “На ноль делить нельзя!”, а если он вводит нечисловое значение, мы получим сообщение “Вы ввели не число!”. Если пользователь вводит числовое значение, которое не равно 0, мы получаем результат деления и выводим его вместе с сообщением “Результат: “. Наконец, блок finally всегда выполняется и выводит “Конец программы”.

114
Q

Иерархия исключений Python?

A

В Python все исключения являются экземплярами класса, производного от класса BaseException. В Python есть встроенная иерархия исключений, которая позволяет вам перехватывать определенные типы исключений. Вот неполный список некоторых классов исключений в Python, перечисленных в соответствии с их иерархией наследования:
~~~
BaseException
+– SystemExit
+– KeyboardInterrupt
+– Exception
+– StopIteration
+– ArithmeticError
| +– ZeroDivisionError
+– AssertionError
+– AttributeError
+– BufferError
+– EOFError
+– ImportError
+– LookupError
| +– IndexError
| +– KeyError
+– NameError
| +– UnboundLocalError
+– OSError
| +– FileNotFoundError
+– ReferenceError
+– RuntimeError
| +– NotImplementedError
+– SyntaxError
+– IndentationError
+– TabError

Это не исчерпывающий список всех встроенных классов исключений, но он охватывает некоторые важные. При обработке исключений с помощью блока try-except можно перехватить несколько исключений, указав кортеж классов исключений после ключевого слова exclude. Например:

```py
try:
    # некоторый код, который может вызывать различные исключения
except (ValueError, TypeError):
    # обрабатывать ValueError или TypeError
except OSError as e:
    # обрабатывать OSError, используя ключевое слово as, чтобы получить экземпляр исключения
except:
    # обрабатывать любое другое исключение

Вы также можете создавать свои собственные классы исключений, создавая подклассы любого существующего класса исключений или самого класса BaseException.

115
Q

Когда использовать list/tuple/set/dict?

A

list, tuple, set и dict — все это структуры данных в Python, которые служат разным целям. Вот несколько общих рекомендаций о том, когда использовать каждый из них:
+ Используйте список, если у вас есть коллекция заказанных элементов, которые вам может потребоваться изменить или переупорядочить. Списки изменяемы, то есть вы можете добавлять или удалять элементы и изменять их значения.
+ Используйте кортеж, если у вас есть коллекция упорядоченных элементов, которые вы не хотите изменять. Кортежи неизменяемы, то есть вы не можете изменить их значения после их создания.
+ Используйте набор, когда у вас есть коллекция элементов, и вы хотите удалить дубликаты или выполнить над ними операции над наборами (пересечение, объединение, различие). Наборы изменяемы, как и списки.
+ Используйте словарь, когда у вас есть коллекция пар ключ-значение и вы хотите быстро найти значение на основе его ключа. Словари изменяемы, как и списки.

Это всего лишь общие рекомендации, и вам может потребоваться выбрать структуру данных на основе конкретных требования вашей программы. Кроме того, в Python есть и другие структуры данных (такие как deque и NamedTuple), которые в некоторых случаях могут оказаться более подходящими.

116
Q

Что такое virtualenv?

A

Virtualenv - это инструмент для создания изолированных Python-окружений, где каждое из окружений может иметь свои собственные установленные пакеты и зависимости. Это позволяет вам использовать различные версии Python и библиотек в разных проектах, не взаимодействуя друг с другом, и также создавать “чистые” окружения, где не установлены стандартные библиотеки, чтобы избежать конфликтов зависимостей. Вы можете активировать виртуальное окружение с помощью команды в командной строке, и когда оно активно, ваше приложение будет использовать только пакеты, установленные в данный момент в этом окружении.

117
Q

Оператор with и его использование.

A

Оператор with в Python используется для работы с контекстными менеджерами, которые обеспечивают выполнение операций до и после выполнения блока кода. Контекстный менеджер представляет собой объект с методами __enter__ и __exit__, которые определяют выполнение операций при входе и выходе из блока кода.

Основной синтаксис оператора with выглядит следующим образом:
```py
with <expr> as <var>:
<block>
~~~
Здесь <expr> представляет собой выражение, возвращающее объект контекстного менеджера, <var> - переменную для хранения объекта менеджера, <block> - блок кода, в котром будет использоваться объект контекстного менеджера.</block></var></expr></block></var></expr>

Пример использования with для работы с файлом:
```py
with open(‘file.txt’, ‘r’) as f:
data = f.read()
# сделать что-то с данными
~~~
Здесь оператор with используется для автоматического закрытия файла после завершения чтения данных из него.

Кроме работы с файлами, оператор with также может быть использован для работы с сетевыми соединениями, блокировками для многопоточных приложений и другими объектами, поддерживающими протокол контекстного менеджера.

118
Q

Что такое class и что такое self.

A

Class - это структура данных, которая описывает состояние объекта и поведение объекта. Self - это способ обозначить экземпляр класса, который передается в методы класса и позволяет методам работать с состоянием этого экземпляра. Когда метод вызывается для экземпляра, Python автоматически передает этот экземпляр в качестве первого аргумента метода с использованием специального имени “self”. Это позволяет методу получить доступ к переменным и методам этого экземпляра.

Например, в следующем примере кода определен класс Person, который имеет переменную экземпляра ‘name’ и метод для вывода имени:
```py
class Person:
def __init__(self, name):
self.name = name

def say_hello(self):
    print("Hello, my name is", self.name) ~~~ Для создания экземпляра класса необходимо вызвать конструктор класса с требуемыми аргументами. Например: ```py person = Person("Alice") person.say_hello() # Output: Hello, my name is Alice ~~~ В этом примере кода переменная self используется для доступа к имени человека и вывода его на экран в методе say_hello().
119
Q

Объясните isinstance()

A

Функция isinstance() используется для проверки принадлежности объекта к определенному типу данных. Она принимает два аргумента: объект, который нужно проверить, и тип данных, к которому нужно проверить его принадлежность. Возвращает True, если объект принадлежит указанному типу, и False в противном случае. Например:
```py
x = 5
print(isinstance(x, int)) # True

y = “hello”
print(isinstance(y, int)) # False
~~~
Это может быть полезно, когда нужно проверить, соответствует ли объект определенному типу данных, прежде чем выполнять операции с ним, которые могут быть не совместимы с этим типом.

120
Q

Что такое статический метод, метод класса и метод экземпляра?

A

В Python есть три типа методов: методы экземпляра, методы класса и статические методы. Вот их описание:

+ Методы экземпляра: Это обычные методы, которые объявляются внутри класса и принимают self как первый параметр. Они могут использовать любые атрибуты экземпляра класса. Пример:

class MyClass:
def my_method(self):
print(“This is an instance method”)

obj = MyClass()
obj.my_method()
+ Методы класса: Это методы, которые объявляются внутри класса, но принимают cls вместо self в качестве первого параметра. Они могут использовать только атрибуты класса. Чтобы объявить метод класса, можно использовать декоратор @classmethod. Пример:

class MyClass:
x = 10

@classmethod
def my_method(cls):
    print("This is a class method")
    print(cls.x)

MyClass.my_method()
+ Статические методы: Это методы, которые объявляются внутри класса, но не принимают self или cls в качестве первого параметра. Они могут использовать только локальные переменные, и не могут изменять атрибуты экземпляра класса. Чтобы объявить статический метод, можно использовать декоратор @staticmethod. Пример:

class MyClass:
@staticmethod
def my_method():
print(“This is a static method”)

MyClass.my_method()

<div>
<b><a>↥ вернуться к началу</a></b><br></br>
<b><a>если вам понравилось поставьте пожалуйста ★ </a></b>
</div>

  1. Объясните map, filter,reduce and lambda.

map(), filter(), reduce() и lambda — все это встроенные в Python функции.
+ map() — это функция, которая применяет заданную функцию к каждому элементу в итерируемом объекте и возвращает новый итерируемый объект с результатами.
+ filter() — это функция, которая создает новую итерацию с элементами из исходной итерации, которые соответствуют определенному условию, заданному функцией. r
+ educe() — это функция, которая применяет заданную функцию к элементам итерации в определенном порядке и возвращает одно значение. Обратите внимание, что в Python 3 вам сначала нужно импортировать сокращение из functools.
+ lambda — это способ определения небольших анонимных функций в Python. Это позволяет вам определить функцию в одной строке, не давая ей имени. Лямбда-функции часто используются с map() и filter() для определения встроенной функции. Вот пример того, как использовать эти функции вместе:
```py
from functools import reduce

numbers = [1, 2, 3, 4, 5]

squares = list(map(lambda x: x**2, numbers))
evens = list(filter(lambda x: x % 2 == 0, numbers))
sum_of_numbers = reduce(lambda x, y: x + y, numbers)

print(squares) # [1, 4, 9, 16, 25]
print(evens) # [2, 4]
print(sum_of_numbers) # 15
~~~
В этом коде map() используется для возведения в квадрат каждого числа в списке, filter() используется для хранения только четных чисел, а reduce() используется для вычисления суммы всех чисел. Сила этих функций в том, что они позволяют выполнять сложные операции с вашими данными, используя краткий и удобочитаемый синтаксис.

121
Q

Разница между классами в новом стиле и классами в старом стиле.

A

В Python разница между классами нового и старого стиля заключается в том, что классы нового стиля наследуются от класса объекта, а классы старого стиля — нет.

Классы нового стиля были введены в Python 2.2 и используются по умолчанию в Python 3.x. У них есть ряд преимуществ по сравнению с классами старого стиля, включая встроенные свойства, такие как __name__, __class__ и __bases__, а также новые функции, такие как дескрипторы, которые позволяют определять геттеры и сеттеры для переменных экземпляра.

Классы нового стиля также поддерживают Порядок разрешения методов (MRO), который определяет порядок, в котором базовые классы ищут конкретный метод или атрибут. С другой стороны, классы старого стиля не имеют этих функций или преимуществ. Первоначально они были разработаны для Python версии 1.5 и в значительной степени устарели в Python 2.2, хотя по-прежнему поддерживаются для обеспечения обратной совместимости. В большинстве случаев рекомендуется использовать классы нового стиля в Python. Чтобы создать класс нового стиля, вы просто нужно наследовать от класса объекта так:
```py
class NewStyleClass(object):
pass

Кроме того, в Python 3.x вы можете опустить часть (объект) и определить класс следующим образом:
```py
class NewStyleClass:
    pass
122
Q

В чем разница между Python и Java?

A

В чем разница между Python и Java?
Основные различия между Python и Java:

+ Типизация: Java - это язык со статической типизацией и компиляцией, а Python - это язык с динамической типизацией и интерпретацией.

+ Структуры данных: Python имеет встроенные высокоуровневые структуры данных, такие как словари и списки, и в целом более экономный синтаксис, чем у Java.

+ Параллелизм: в Python существует проблема Global Interpreter Lock (GIL), которая ограничивает выполнение кода в несколько потоков. В то время как в Java вы можете создавать потоки и выполнять вычисления параллельно.

+ Компиляция: в Java код компилируется в байт-код, который затем выполняется виртуальной машиной Java (JVM), в то время как Python - это язык интерпретируемый.

+ Импорт: в Java оператор import используется для импорта классов, переменных и функций из других пакетов. В Python тоже используется оператор import, однако он также может быть использован для импорта модулей или определенных элементов из них.
+ Java обычно используется для написания крупных приложений, а Python чаще всего используется для написания быстрого прототипирования и научных вычислений.

+ Код на Java обычно дольше и более сложен, чем на Python, потому что Java - более формальный язык с множеством правил и синтаксических требований, тогда как Python часто используется для написания более простых и лаконичных программ.

+ Python часто используется в области машинного обучения и научных вычислений, тогда как Java часто используется в крупных предприятиях и проектах, связанных с серверной разработкой.

Это далеко не все отличия, однако это некоторые из самых основных. Выбор между Python и Java зависит от конкретных задач и потребностей проекта.

123
Q

Что такое контекстный процессор?

A

Контекстные процессоры (context processors) в Django - это функции, которые добавляют глобальные переменные в контекст перед рендерингом шаблона. Эти переменные могут быть использованы в любом шаблоне в приложении, и не нужно передавать их каждый раз при рендеринге каждого шаблона вручную.

Контекстные процессоры в Django имеют доступ к объекту request, который содержит информацию о запросе, и могут использоваться для добавления переменных в контекст на основе этой информации.

Например, контекстный процессор может добавлять текущего пользователя в контекст, что позволит проверять доступности функционала приложения на страницах, доступных только зарегистрированным пользователям.

Вот пример функции-контекстного процессора, которая добавляет текущего пользователя в контекст:
```py
def user_context(request):
return {‘user’: request.user}
~~~
Чтобы использовать этот контекстный процессор в вашем приложении Django, добавьте его в настройки проекта в списке CONTEXT_PROCESSORS.

Например:
```py
# Файл settings.py
# …
TEMPLATES = [
{
‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’,
‘APP_DIRS’: True,
‘OPTIONS’: {
‘context_processors’: [
# …
‘myapp.context_processors.user_context’,
],
},
},
]
~~~
Теперь переменная user будет доступна в любом шаблоне вашего приложения.

124
Q

Что такое exec() и eval()?

A

exec() и eval() — это встроенные функции Python, используемые для динамического выполнения кода. exec() можно использовать для выполнения блока кода, представленного в виде строки или объекта, что позволяет динамически генерировать и выполнять код Python. Например:
exec() и eval() - это функции в Python, которые позволяют выполнять произвольный код в строковом формате.

eval() используется для вычисления выражения из строки и возвращает результат вычислений. Например:

py
x = 5
result = eval('x * 2')
print(result) # Выводит 10
~~~
Функция exec() используется для выполнения строки как программного кода. Например:
py
x = 5
code_string = ‘y = x * 2’
exec(code_string)
print(y) # Выводит 10
~~~
Однако, обе эти функции могут быть опасными, поскольку могут выполнять произвольный код, в том числе и вредоносный. Поэтому, следует использовать их с осторожностью и только при необходимости.
125
Q

Как передать аргумент командной строки.

A

В Python вы можете использовать модуль argparse для обработки аргументов командной строки. Вот простой пример:
```py
import argparse

parser = argparse.ArgumentParser(description=’Описание вашей программы’)
parser.add_argument(‘–foo’, type=int, default=42, help=’Числовой параметр’)
parser.add_argument(‘filename’, help=’Имя файла для обработки’)
args = parser.parse_args()

print(args.foo)
print(args.filename)
~~~
В этом примере мы создаем объект ArgumentParser, добавляем два аргумента и парсим аргументы командной строки, используя метод parse_args(). В результате, args.foo будет иметь значение, которое было передано в качестве параметра –foo, а args.filename - имя файла, переданное без какого-либо префикса.

Вы можете выполнить эту программу, используя командную строку следующим образом:
```py
python myprogram.py –foo 123 somefile.txt
~~~
где myprogram.py - имя вашего файла программы.

Для передачи аргументов при запуске Python-скрипта в Jupyter Notebook, вы можете использовать sys.argv:
```py
import sys

print(“Аргументы командной строки:”)
for arg in sys.argv:
print(arg)
~~~
Вы можете затем вызвать свой скрипт так:
```py
python myprogram.py arg1 arg2 arg3
~~~
где arg1, arg2 и arg3 - аргументы, которые вы хотите передать в ваш скрипт.

126
Q

Что такое yield?

A

yield в Python используется для создания генераторов, которые возвращают значения итерируемого типа. Генератор функция это функция, возвращающая итератор - один раз может использоваться для прохода по последовательности значений, а затем исчезает.

Когда yield используется в функции, она становится генератором. Каждый раз, когда yield достигается в теле генератора, он возвращает значения, указанные после yield, и временно “замораживает” (приостанавливает) функцию до следующей итерации. Кроме того, при каждом вызове генератора создается новый объект класса генератор и возвращаемые значения сохраняются в нем между вызовами.

Вот пример функции-генератора, которая генерирует квадраты чисел:
```py
def squares(n):
for i in range(n):
yield i**2

пример использования
squares_gen = squares(5)
for x in squares_gen:
print(x) # выведет 0 1 4 9 16
~~~
Эта функция возвращает генератор, который генерирует квадраты целых чисел от 0 до n-1. Мы можем вызвать эту функцию, чтобы получить генератор, и затем использовать его как итератор, чтобы перебирать элементы последовательности.

Важно помнить, что при первом вызове генератор не выполняет никакого кода внутри функции, а только создает и возвращает объект генератора. Код внутри функции будет выполнен только после вызова метода __next__() (или с помощью next() в Python 2.x) на генераторном объекте.

127
Q

Что такое ord() и chr()?

A

ord() и chr() - это функции в Python, которые связаны с ASCII кодировкой.

ord() - это функция, которая принимает один символ (строка длиной 1) и возвращает его числовое ASCII значение. Например, ord(‘a’) вернет 97, потому что “a” имеет значение 97 в таблице ASCII.

chr() - это функция, которая принимает одно число и возвращает соответствующий символ ASCII-кода. Например, chr(97) вернет “a”, потому что 97 соответствует символу “a” в таблице ASCII.

Пример:

py
print(ord('a'))
~~~
Это выведет 97, так как символ 'a' имеет код Unicode 97. Функция chr() принимает один аргумент - код символа в десятичной системе и возвращает соответствующий символ Unicode. Пример:
py
print(chr(97))
~~~
Это выведет ‘a’, так как код Unicode 97 соответствует символу ‘a’.
128
Q

Что такое метаклассы?

A

Метаклассы в языке Python - это классы, которые определяют поведение других классов. То есть, они являются классами для классов. Метаклассы используются в Python для создания новых типов объектов и управления созданием новых классов.

Одним из примеров использования метаклассов является создание класса с динамическими атрибутами. При использовании метакласса можно определять атрибуты и методы класса динамически в зависимости от различных условий.

Пример создания метакласса:
```py
class MyMeta(type):
def __new__(cls, name, bases, attrs):
# код для создания нового класса
return super().__new__(cls, name, bases, attrs)

class MyClass(metaclass=MyMeta):
pass
~~~
В данном примере создан метакласс MyMeta, который будет использоваться для создания новых классов. Затем создан класс MyClass с помощью метакласса MyMeta.

Также стоит отметить, что метаклассы в Python могут использоваться для перехвата и изменения поведения существующих методов в классах.

129
Q

Что такое дескриптор?

A

Дескриптор в Python - это объект, который определяет, как атрибуты класса должны быть доступны, устанавливаемы и удалены. Дескрипторы предоставляют программистам более мощный способ управления атрибутами объектов, и они широко используются в различных библиотеках и фреймворках Python.

Дескрипторы предоставляют три метода: __get__, __set__, и __delete__. Метод __get__ вызывается при обращении к атрибуту, __set__ - при попытке установить его значение, а __delete__ - при удалении атрибута.

Когда вы определяете дескриптор, вы можете использовать его как атрибут класса следующим образом:

class MyClass:
my_attribute = MyDescriptor()
Здесь MyClass - это класс, my_attribute - это атрибут, который использует дескриптор MyDescriptor() для определения его поведения.

Пример простого дескриптора:
```py
class Descriptor:
def __get__(self, instance, owner):
print(“Getting the attribute”)
return instance._value

def \_\_set\_\_(self, instance, value):
    print(f"Setting the attribute to {value}")
    instance._value = value

def \_\_delete\_\_(self, instance):
    print("Deleting the attribute")
    del instance._value

class MyClass:
my_attribute = Descriptor()
def __init__(self, value):
self._value = value
~~~
Здесь Descriptor - это класс дескриптора с тремя методами get, set и delete. MyClass - это класс, который использует дескриптор my_attribute.

130
Q

Пространство имен и область видимости?

A

Пространство имен — это сопоставление имен с объектами. Это механизм, позволяющий избежать конфликтов имен в программе путем организации имен с помощью системы уникальных префиксов, называемых пространствами имен. Область видимости — это область кода, в которой доступно конкретное пространство имен. Это область программы, где переменная допустима и к ней можно получить доступ.

Правило LEGB используется в Python для определения порядка поиска в различных областях для разрешения имени. Правило LEGB расшифровывается как Local, Enclosing, Global и Built-in. Когда имя встречается в программе, Python сначала ищет это имя в локальной области, затем ищет во всех окружающих областях, затем ищет в глобальной области и, наконец, ищет во встроенной области.

Таким образом, пространства имен и области действия — это связанные понятия, поскольку пространства имен используются для организации объектов и предотвращения конфликтов имен, а области используются для определения областей в программе, где переменная допустима и доступна. Понимание этих концепций важно при работе с Python, так как это может помочь вам управлять конфликтами имен и писать более эффективный и удобный код.

131
Q

Что такое MRO?

A

MRO (Method Resolution Order) - порядок разрешения методов в Python. Это концепция, используемая при наследовании. Она определяет порядок, в котором методы ищутся в иерархии классов и особенно важна, когда есть дубликаты имен методов в родительских классах. При наследовании классов Python ищет вызываемый метод в текущем классе, затем в его родительском классе и так далее, пока не найдет его или не достигнет вершины иерархии. Вы можете получить доступ к порядку разрешения методов с помощью атрибута __mro__, который доступен на любом классе Python.

132
Q

Когда использовать comprehensions списка и когда избегать comprehensions списка?

A

Comprehensions списков может быть мощной функцией Python для создания новых списков на основе существующих списков, но в некоторых случаях лучше их избегать. Вот несколько рекомендаций:
+ Используйте понимание списка, когда логика короткая и ясная. Если логика, стоящая за пониманием списка, слишком длинная или сложная, лучше вместо этого использовать обычный цикл.
+ Используйте списки, когда результатом является небольшой список. Если вы создаете большой список, использование памяти для понимания списка может быть слишком большим, и вместо этого может быть лучше использовать выражение генератора.
+ Избегайте использования списков только для побочных эффектов. Генераторы списков предназначены для создания нового списка, а не для изменения существующего. Если вас интересуют только побочные эффекты, лучше использовать обычный цикл.

В конечном счете, важно писать ясный, лаконичный и простой в использовании код. понимать. Если понимание списка делает ваш код более читабельным (в отличие от его запутывания), во что бы то ни стало используйте его. Если нет, рассмотрите альтернативный подход.

133
Q

Что такое функции отображения, фильтрации и сокращения?

A

Функции отображения, фильтрации и сокращения (map, filter и reduce) - это встроенные функции высшего порядка в Python, которые обычно используются для преобразования и обработки данных в коллекциях (списках, кортежах и т. д.).

Функция map() принимает функцию и последовательность в качестве аргументов. Она применяет функцию к каждому элементу последовательности и возвращает новую последовательность с результатами.

Функция filter() также принимает функцию и последовательность в качестве аргументов. Она возвращает новую последовательность, содержащую только те элементы из исходной последовательности, для которых функция возвращает True.

Функция reduce() принимает функцию и последовательность в качестве аргументов. Она последовательно применяет функцию к элементам последовательности, сокращая последовательность до единственного значения.

Вот примеры использования этих функций:
```py
# map()
numbers = [1, 2, 3, 4]
squares = list(map(lambda x: x**2, numbers)) # [1, 4, 9, 16]

filter()
numbers = [1, 2, 3, 4]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) # [2, 4]

reduce()
from functools import reduce
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers) # 24
~~~
Здесь мы использовали лямбда-функции в качестве аргументов для функций map() и filter(). Функция reduce() потребовала импорта модуля functools для использования сокращения.

134
Q

Какие типы исключений генерируются в Python?

A

Python генерирует множество встроенных исключений для обработки ошибок во время работы программы. Некоторые из наиболее часто используемых типов исключений в Python:

+ ArithmeticError: базовый класс для исключений, связанных с арифметическими операциями, например ZeroDivisionError.

+ AssertionError: возникает, когда утверждение assert оказывается ложным.

+ EOFError: возникает, когда функция input() достигает конца файла (End Of File).

+ KeyError: возникает, когда запрашиваемый ключ не найден в словаре.

+ NameError - возникает, когда локальная или глобальная переменная не определена.

+ TypeError - возникает, когда операция применяется к объекту несоответствующего типа.

+ ValueError - возникает, когда функции передаются неверные аргументы.

+ ZeroDivisionError - возникает, когда попытка деления на ноль.

+ IOError - возникает, когда происходит ошибка ввода-вывода.

+ IndexError - возникает, когда индекс выходит за пределы допустимого диапазона.

+ KeyError - возникает, когда ключ не найден в словаре.

+ AttributeError - возникает, когда объект не имеет запрашиваемого атрибута.
+ FileNotFoundError: вызывается, когда не удается найти запрашиваемый файл.

+ ImportError: вызывается, когда не удается импортировать модуль.

+ KeyboardInterrupt: вызывается, когда пользователь прерывает выполнение программы, нажав Ctrl + C.

Список исключений в Python не ограничивается только этими. В целом, в Python существует много типов исключений, которые могут возникнуть при выполнении вашей программы. Чтобы обрабатывать исключения в Python, вы можете использовать конструкцию try-except.

135
Q

Как написать свою собственную обработку исключений?

A
136
Q

Разница между input и raw_input?

A

input() и raw_input() - это встроенные функции в Python. В Python 2.x raw_input() используется для чтения пользовательского ввода в виде строки, а input() - для вычисления выражения, введенного пользователем и возвращения его в качестве значения. В Python 3.x версии функция raw_input() была удалена, и input() теперь используется для чтения пользовательского ввода в виде строки. Поэтому, если вы используете Python 3.x, вам следует использовать input().

Пример использования input():
```py
name = input(“What is your name? “)
print(f”Hello, {name}”)
~~~
Здесь input() используется для чтения имени пользователя в виде строки, которая затем выводится на экран с приветствием.

Пример использования raw_input():
```py
name = raw_input(“What is your name? “)
print “Hello, “ + name
~~~
Этот код эквивалентен примеру с input() в Python 3.x. В Python 2.x вы должны использовать raw_input(), чтобы прочитать строку и сохранить ее в переменной name.

137
Q

Почему мы пишем \_\_name\_\_ == "\_\_main\_\_" в скрипте Python?

A

Мы пишем __name__ == “__main__” в скрипте Python чтобы указать интерпретатору, что определенный блок кода должен быть выполнен только в том случае, если файл запущен непосредственно (как главный файл) и не импортирован как модуль в другой файл. Код, который находится в блоке “if name == ‘main’:” будет выполнен только когда модуль запущен как скрипт, и не будет выполнен при импорте в другой модуль.

Для лучшего понимания, рассмотрим следующий пример:
```py
def add_numbers(x, y):
return x + y

if __name__ == “__main__”:
print(add_numbers(5, 7))
~~~
Здесь определение функции add_numbers() не будет выполнено, если файл импортируется как модуль. Однако, если этот файл запущен непосредственно, код в блоке if будет выполнен, и результатом будет выведено число 12.

Этот подход особенно полезен при написании ресурсоемких скриптов или тестовых сценариев, где многократный импорт модуля может привести к долгим задержкам.

138
Q

Почему обработка исключений имеет блок finally?

A

Блок finally в обработке исключений в Python используется для выполнения кода вне зависимости от того, было ли возбуждено исключение или нет. Код в блоке finally будет выполнен даже в случае возникновения исключения и выполнения блока except.

Это может быть полезно, например, для освобождения ресурсов, таких как файлы или сетевые соединения, которые были открыты в блоке try, вне зависимости от того, было или нет возбуждено исключение.

Пример кода:
```py
try:
# some code that might raise an exception
except SomeExceptionType:
# handle the exception
finally:
# code to be executed regardless of whether an exception was raised or not
~~~
Таким образом, блок finally помогает убедиться, то код, ответственный за очистку и управление ресурсами, будет выполнен в любом случае, даже если произойдет исключение.

139
Q

Обеспечивает ли Python многопоточность?

A

Да, Python обеспечивает многопоточность. Однако, из-за особенностей реализации интерпретатора, использование потоков в многопоточном приложении может быть ограничено GIL (Global Interpreter Lock). GIL гарантирует, что только один поток кода Python выполняется в любой момент времени, что может привести к проблемам производительности в некоторых сценариях использования. Для обхода GIL и увеличения производительности в Python часто используют процессы или асинхронность.

Python имеет встроенную библиотеку threading для создания и управления потоками, а также библиотеки multiprocessing и concurrent.futures для создания и управления процессами. Также в Python есть сторонние асинхронные библиотеки, такие как asyncio и trio, которые позволяют создавать и управлять асинхронными задачами и корутинами.

Пример использования модуля threading для запуска функции в отдельном потоке:
```py
import threading

def my_function():
# some code here

Создание нового потока
my_thread = threading.Thread(target=my_function)
# Запуск потока
my_thread.start()
# Ожидание завершения потока (если необходимо)
my_thread.join()
~~~
Этот пример создает новый поток, который запускает функцию my_function. После запуска потока мы можем продолжить выполнять код в главном потоке, пока поток my_thread работает в фоновом режиме. Если нужно дождаться завершения my_thread, мы можем вызвать метод join().

Как уже упоминалось, для параллельной работы нескольких процессов можно использовать модуль multiprocessing.

140
Q

Что вы подразумеваете под неблокирующим вводом-выводом?

A

Неблокирующий ввод-вывод - это техника в программировании, которая позволяет сделать асинхронный ввод-вывод без блокировки передачи управления от текущего потока выполнения до тех пор, пока операция ввода-вывода не будет завершена.

В языке Python неблокирующий ввод-вывод может быть реализован с использованием модуля asyncio, который позволяет создавать асинхронные функции и использовать их для выполнения неблокирующей операции ввода-вывода. Режим асинхронной работы позволяет программе максимально эффективно использовать вычислительные ресурсы и ускорить выполнение задач.

Например, вот как выглядит асинхронный HTTP-запрос с использованием библиотеки aiohttp в Python:
```py
import aiohttp
import asyncio

async def make_request(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
html = await response.text()
return html

loop = asyncio.get_event_loop()
url = “https://www.example.com”
html = loop.run_until_complete(make_request(url))
~~~
Этот код делает асинхронный GET-запрос по указанному URL-адресу, используя библиотеку aiohttp и не блокируя выполнение программы.

141
Q

Что произойдет, если произойдет ошибка, которая не обрабатывается в блоке исключений?

A

Если в блоке try-except не задан обработчик для ошибки, которая может возникнуть в блоке try, то эта ошибка не будет перехвачена и программа завершится с ошибкой, выводя информацию о том, что произошла неперехваченная ошибка. Например, вот такой код приведет к ошибке, так как блок except не покрывает тип ошибки NameError:
```py
try:
print(some_undefined_variable)
except ZeroDivisionError:
print(“Деление на ноль”)
~~~
В этом примере программа завершится с ошибкой NameError: name ‘some_undefined_variable’ is not defined.

142
Q

Как модули используются в программе Python?

A

Модули в Python используются для организации кода в логически связанные блоки и повторного использования кода. Модули могут содержать определения функций, классов и переменных, которые можно импортировать в другие модули или скрипты Python.

Для импортирования модуля в Python используется оператор import. Например, чтобы импортировать модуль math, который содержит математические функции, можно написать следующий код:
```py
import math

x = math.sqrt(4)
print(x)
~~~
Этот код импортирует модуль math и использует функцию sqrt() для вычисления квадратного корня из числа 4.

Вы также можете импортировать только определенные имена из модуля, используя ключевое слово from. Например, можно импортировать только функцию sqrt() из модуля math следующим образом:
```py
from math import sqrt

x = sqrt(4)
print(x)
~~~
Этот код импортирует только функцию sqrt() из модуля math и использует ее для вычисления квадратного корня из числа 4.

Также есть возможность использвать пакеты (packages), которые представляют собой иерархически организованные модули.

143
Q

Как создать функцию Python?

A

Для создания функции в Python используется ключевое слово “def” (от “define”). Ниже приведен пример определения функции в Python:
```py
def my_function():
print(“Hello World!”)
Функция my_function определена без аргументов. Она просто выводит “Hello World!” в консоль. Вы можете вызвать функцию, используя ее имя, например:

my_function()
Это вызовет функцию и выведет сообщение “Hello World!” в консоль. Вы можете передавать аргументы в функцию, используя скобки. Например:

def greet(name):
print(“Hello, “ + name + “!”)

greet(“Alice”)
greet(“Bob”)
Вызовет этот код функцию greet() дважды. Первый раз вызов с аргументом “Alice” выведет “Hello, Alice!” в консоль, второй вызов с аргументом “Bob” выведет “Hello, Bob!”.
~~~

144
Q

Как создается класс Python?

A

Чтобы создать класс в Python, используйте ключевое слово “class”, за которым следует имя класса, после чего идут двоеточие и блок кода, содержащий определения атрибутов и методов класса. Вот пример создания простого класса в Python:
```py
class MyClass:
def __init__(self, value):
self.value = value

def my_method(self):
    print("My value is:", self.value) ~~~ В этом примере мы создаем класс MyClass, который имеет атрибут value и метод my_method. Метод init — это метод-конструктор, который будет выполнен при создании экземпляра класса. Данный метод принимает параметр "value" и присваивает его значению атрибута value. Метод my_method — это простой метод, который выводит на экран значение атрибута value.

Чтобы создать экземпляр класса, просто вызовите класс, как если бы это была функция, передавая необходимые аргументы:
```py
my_instance = MyClass(“Hello, World!”)
my_instance.my_method() # выводит “My value is: Hello, World!”
~~~
Здесь мы создаем экземпляр класса MyClass и присваиваем его переменной my_instance. Затем мы вызываем метод my_method на этом экземпляре, который выводит значение атрибута значение value на экран.

145
Q

Как создается экземпляр класса Python?

A

ля создания экземпляра класса в Python нужно сначала определить класс, а затем вызвать конструктор класса с помощью оператора new. В конструкторе можно задать начальные значения свойств объекта. Пример определения класса и создания экземпляра:
```py
class MyClass:
def __init__(self, prop1, prop2):
self.prop1 = prop1
self.prop2 = prop2

my_object = MyClass(“значение1”, “значение2”)
~~~
В этом примере мы создали класс MyClass с двумя свойствами prop1 и prop2. Затем мы создали новый объект класса MyClass, передав значения “значение1” и “значение2” в качестве аргументов конструктора. Этот объект сохраняется в переменной my_object.

146
Q

Как функция возвращает значения?

A

В Python функция может возвращать одно или несколько значений с помощью оператора return. Значения могут быть любого типа данных, включая целочисленные, строковые, списки, словари и другие объекты Python. Вот примеры:
```py
# Функция возвращает целое число
def add(x, y):
return x + y

Функция возвращает список
def get_names():
names = [‘Alice’, ‘Bob’, ‘Charlie’]
return names

Функция возвращает кортеж
def get_person():
name = ‘Alice’
age = 25
return name, age

Функция возвращает словарь
def get_user():
user = {‘username’: ‘alice’, ‘password’: ‘secret’}
return user
~~~
Чтобы получить значение, возвращаемое функцией, используйте оператор return в сочетании с сохранением возвращаемого значения в переменной. Например:

py
result = add(3, 4)  # result будет равен 7
names = get_names()  # names будет содержать список ['Alice', 'Bob', 'Charlie']
person = get_person()  # person будет содержать кортеж ('Alice', 25)
user = get_user()  # user будет содержать словарь {'username': 'alice', 'password': 'secret'}
~~~
Вы также можете использовать кортеж прямо в операторе присваивания, чтобы распаковать значения, возвращаемые функцией. Например:
py
name, age = get_person() # name будет равен ‘Alice’, age будет равен 25
~~~
147
Q

Что происходит, когда функция не имеет оператора возврата (return)?

A

Если функция в Python не имеет оператора return, то она все равно завершится, как только выполнение кода достигнет конца функции. Однако, в этом случае функция не будет возвращать никакого значения, что может привести к непредсказуемому поведению кода, если результат работы функции используется в другой части программы.

Если функция завершается без оператора return, она возвращает значение None по умолчанию.

Например, функция, которая не имеет оператора return:

py
def no_return():
    print("Эта функция ничего не возвращает")
~~~
Такая функция будет находиться в незавершенном состоянии после ее выполнения. Если результат функции будет использоваться где-либо в программе, это может привести к ошибке:
py
result = no_return()
print(result) # будет выведено None
~~~
Если вы хотите вернуть некоторое значение из функции, убедитесь, что вы используете оператор return с нужным значением.
148
Q

Как создать словарь, сохраняющий порядок пар?

A

В Python есть два варианта для создания словаря, сохраняющего порядок пар ключ-значение: используйте OrderedDict из модуля collections или используйте новый стандарт Python 3.7 и новее, который поддерживает сортированные словари.

Пример использования OrderedDict в Python:
```py
from collections import OrderedDict

d = OrderedDict()
d[‘foo’] = 1
d[‘bar’] = 2
d[‘baz’] = 3

for key, value in d.items():
print(key, value)
~~~
Этот код создает словарь, где ключи сохраняются в порядке их добавления в словарь, и выводит его элементы в том же порядке.

Пример использования сортированного словаря в Python 3.7 и новее:
```py
d = {‘foo’: 1, ‘bar’: 2, ‘baz’: 3}
sorted_d = dict(sorted(d.items()))

for key, value in sorted_d.items():
print(key, value)
~~~
Этот код создает словарь, сортируя его элементы по ключу и выводит каждый элемент словаря в порядке сортировки.

Независимо от выбранного метода, оба словаря могут использоваться так же, как и обычные словари.

149
Q

Можно ли использовать изменяемую структуру данных в качестве ключа в словарях?

A
150
Q

В чем разница между кортежем и списком? Где вы будете использовать кортеж и где вы будете использовать список?

A

В Python кортеж (tuple) и список (list) являются двумя различными типами последовательностей. Основное отличие между ними заключается в следующем:

+ Кортеж является неизменяемым (immutable), что означает, что его элементы не могут быть изменены после того, как он был создан, а список является изменяемым (mutable) и его элементы могут быть изменены.

+ Кортежы обычно используются для хранения набора значений, которые не должны изменяться, в то время как списки используются для хранения изменяемых наборов данных.

Кортежи также имеют несколько других преимуществ:

+ Они занимают меньше места в памяти, чем списки.

+ Кортежи могут использоваться в качестве ключей в словарях, тогда как списки этого сделать не могут.

+ Кортежи могут быть использованы в качестве элементов множества (set), тогда как списки этого не могут.

В целом, если нужен неизменяемый набор данных, то лучше использовать кортеж, а если нужна коллекция, которую можно изменять, то лучше использовать список.

151
Q

Объясните все режимы обработки файлов, поддерживаемые Python?

A

Объясните все режимы обработки файлов, поддерживаемые Python?
Python поддерживает несколько режимов обработки файлов, в зависимости от того, как вы хотите использовать файл.

Режимы обработки файлов в Python:

+ Чтение файла (Read): ‘r’ - открывает файл для чтения (по умолчанию)

+ Запись в файл (Write): ‘w’ - открывает файл для записи. Если файл не существует, он будет создан. Если файл уже существует, он будет перезаписан.

+ Добавление в файл (Append): ‘a’ - открывает файл для записи, но добавляет новые данные в конец файла, вместо перезаписи файла.

+ Режим чтения и записи (‘r+’) - используется для чтения и записи данных в файл. Если файл не существует, создается новый файл.

+ Режим записи и чтения (‘w+’) - используется для записи и чтения данных в файл. Если файл не существует, создается новый файл.

+ Режим добавления и чтения (‘a+’) - используется для добавления и чтения данных в конец файла. Если файл не существует, создается новый файл.

+ Бинарный режим (Binary): ‘b’ - открывает файл в двоичном режиме для чтения или записи данных в двоичном формате.
+ Режим двоичного чтения (rb): используется для чтения двоичных данных, таких как изображения, видео, аудиофайлы, и т.д.
+ Режим двоичной записи (wb): используется для записи двоичных данных, таких как изображения, видео, аудиофайлы, и т.д.
+ ‘t’: открыть файл в режиме текстового формата (по умолчанию).

+ ‘+’: открыть файл для обновления (чтения и записи).
+ ‘x’: открыть файл для записи только в том случае, если его не существует. Если файл уже существует, возникнет исключение.

Все эти режимы обработки файлов могут быть использованы как для текстовых, так и для бинарных файлов. Для текстовых файлов режимом по умолчанию является ‘r’, а для бинарных файлов - ‘rb’.

Например, чтобы открыть файл для чтения в текстовом режиме, вы можете использовать следующий код:

py
f = open('filename.txt', 'r')
~~~
Чтобы открыть файл для записи в двоичном режиме, вы можете использовать следующий код:
py
f = open(‘filename.bin’, ‘wb’)
~~~
Обратите внимание, что после завершения работы с файлом его необходимо закрыть с помощью метода close(), чтобы сохранить данные и освободить ресурсы:
py
f.close()
~~~
Эти же функции можно использовать через контекстный менеджер with, который автоматически закроет файл после завершения блока:
py
with open(‘filename.txt’, ‘r’) as f:
# do something with the file
~~~
Это рекомендуется делать во избежание утечек памяти и других проблем с файлами.
152
Q

Какие параметры следует учитывать для проверки, когда сервер не работает?

A

Если сервер не работает, можно проверить следующие параметры:

+ Состояние сервера: Проверьте, что сервер запущен и работает. Вы можете попробовать запустить сервер с помощью команды запуска и убедиться, что он запускается без ошибок.

+ Системные ресурсы: Проверьте, что сервер имеет достаточно ресурсов, таких как память и процессорное время. Вы можете использовать инструменты мониторинга системы, такие как top или htop, чтобы проверить использование ресурсов.

+ Доступность сети: Проверьте, что сервер доступен через сеть. Вы можете попробовать подключиться к серверу через сеть с помощью утилиты ping или telnet и убедиться, что соединение устанавливается.

+ Журналы: Посмотрите журналы сервера для определения ошибок. Это может помочь выявить проблемы и потенциальные причины сбоев.

+ Брандмауэр: Убедитесь, что брандмауэр на сервере не блокирует никакие входящие или исходящие соединения. Вы можете проверить настройки брандмауэра, чтобы убедиться, что он не блокирует необходимые порты.

Эти параметры могут помочь определить причины сбоев и принять соответствующие меры по восстановлению работы сервера.