Получи случайную криптовалюту за регистрацию!

Python вопросы с собеседований

Логотип телеграм канала @python_job_interview — Python вопросы с собеседований P
Логотип телеграм канала @python_job_interview — Python вопросы с собеседований
Адрес канала: @python_job_interview
Категории: Технологии
Язык: Русский
Количество подписчиков: 10.64K
Описание канала:

Вопросы с собеседований по Python
@workakkk - админ
@machinelearning_interview - вопросы с собесдований по Ml
@pro_python_code - Python
@data_analysis_ml - анализ данных на Python
@itchannels_telegram - 🔥 главное в ит

Рейтинги и Отзывы

2.00

2 отзыва

Оценить канал python_job_interview и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

0

3 звезд

1

2 звезд

0

1 звезд

1


Последние сообщения 2

2022-10-02 12:10:38 Расскажите о сборщике мусора в Python

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

Менеджер памяти

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

Как только один из маленьких объект удаляется — память из под него не переходит операционной системе, Python оставляет её для новых объектов с таким же размером. Если в одном из выделенных блоков памяти не осталось объектов, то Python может высвободить его операционной системе. Как правило, высвобождение блоков случается когда скрипт создает множество временных объектов.

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

Алгоритмы сборки мусора

Стандартный интерпретатор питона (CPython) использует сразу два алгоритма, подсчет ссылок и generational garbage collector (далее GC), более известный как стандартный модуль gc из Python.

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

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

Алгоритм подсчета ссылок

Алгоритм подсчета ссылок это одна из самых простых техник для сборки мусора. Объекты удаляются как только на них больше нет ссылок.

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

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

Примеры, когда количество ссылок увеличивается:
- оператор присваивания
- передача аргументов
- вставка нового объекта в лист (увеличивается количество ссылок для объекта)
конструция вида foo = bar (foo начинается ссылаться на тот же объект, что и bar)

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

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

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

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

Вы всегда можете проверить количество ссылок используя функцию sys.getrefcount.

@python_job_interview
3.0K viewsedited  09:10
Открыть/Комментировать
2022-09-30 09:45:01 Что распечатает код:

def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)

f(2)
f(3,[3,2,1])
f(3)

Ответ

[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
Почему?

Первый вызов функции волне очевиден, цикл добавляет 0, а затем 1 в пустой список. l – имя переменной которая указывает на список, хранящийся в памяти. Второй вызов начинается с создания нового списка, хранящегося в новом блоке памяти. l ссылается на новый список. Затем добавляются 0, 1 и 4 к новому списку. В третьем вызове функции происходит что-то странное. Она использует исходный список, хранящийся в исходной области памяти. Именно поэтому он начинается с 0 и 1.

Протестируйте следующий код, для понимания:

l_mem = []

l = l_mem # первый вызов
for i in range(2):
l.append(i*i)

print(l) # [0, 1]

l = [3,2,1] # второй вызов
for i in range(3):
l.append(i*i)

print(l) # [3, 2, 1, 0, 1, 4]

l = l_mem # третий вызов
for i in range(3):
l.append(i*i)

print(l) # [0, 1, 0, 1, 4]


@python_job_interview
4.1K views06:45
Открыть/Комментировать
2022-09-29 15:07:21 Что такое «монкей патчинг» и когда он уместен?

«Монкей патчинг» меняет поведение объекта или функции после того, как он/она будет определён/а.

import datetime
datetime.datetime.now = lambda: datetime.datetime(2022, 09, 09)

Чаще всего это – довольно плохая идея, предпочтительно такие вещи определять явным способом. Одна из причин применения «монкей патчинга» - тестирование. Пакет mock очень полезен с для этих целей.

Почему это важно?

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

PS: стоит немного почитать о mock если вы ещё не сделали этого. Это довольно полезно.

@python_job_interview
3.9K views12:07
Открыть/Комментировать
2022-09-28 12:21:53 Задача с собеседования | Уровень: #Medium

Условие
:

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

Пример:

find_values([11, 10, 3], [10, 3, 5, 11], [11, 10]) -> [11, 10]
find_values([8, 4, 7, "hi"], [8, "hi"], [4, "hi"]) -> ['hi']
find_values([1, 4, 3], [6, 2, 8], ["4", "hi"]) -> []

Делитесь своим решением в комментариях

#задача_с_собеседования

@python_job_interview
4.3K views09:21
Открыть/Комментировать
2022-09-26 16:39:21 Какая Встроенная база данных поддерживается в Python? Расскажите о работе с ней.

Ответ
«Встроенность» предполагает, что вам не нужно запускать pip install для получения библиотеки. Просто импортируйте ее с помощью:

import sqlite3 as sl

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

con = sl.connect('my-test.db')

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


Создание таблицы
Теперь создадим таблицу:

with con:
con.execute("""
CREATE TABLE USER (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
);
""")

Мы добавили три столбца в таблицу USER. Как видите, SQLite действительно легка и при этом поддерживает все основные функции обычной реляционной СУБД, такие как тип данных, обнуляемый тип, первичный ключ и автоинкремент.

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

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

Предположим, мы хотим вставить сразу несколько записей. Выполним:
sql = 'INSERT INTO USER (id, name, age) values(?, ?, ?)'
data = [
(1, 'Alice', 21),
(2, 'Bob', 22),
(3, 'Chris', 23)
]
Определяем оператор SQL с вопросительными знаками ? в качестве заполнителя. Теперь создадим образцы данных для вставки, а затем вставим их с помощью объекта подключения:

with con:
con.executemany(sql, data)

После запуска кода не появилось никаких предупреждений, значит все прошло успешно.

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

with con:
data = con.execute("SELECT * FROM USER WHERE age <= 22")
for row in data:
print(row)

Читать дальше

@python_job_interview
3.7K views13:39
Открыть/Комментировать
2022-09-25 13:57:47
Опишите сложость исполнения основных операций над словарями

Ответ

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

Указанная ниже сложность справледлива и для defaultdict (вместе с доступными операциями они наследуют от словарей и их сложности). Предполагается, что конструирование нового defaultdict имеет сложность O(1) (что справледливо для часто используемых int(), list(), set()).

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

@python_job_interview
3.4K views10:57
Открыть/Комментировать
2022-09-24 10:37:19
Собеседование Senior Python Developer на $8000

Смотреть видео

@python_job_interview
2.3K views07:37
Открыть/Комментировать
2022-09-23 13:35:12 Как выполняется интерполяция строк?

Без импорта класса Template есть три способа интерполяции строк:

name = 'Chris'

# 1. f strings
print(f'Hello {name}')

# 2. % operator
print('Hey %s %s' % (name, name))

# 3. format
print(
"My name is {}".format((name))
)

@python_job_interview
3.4K views10:35
Открыть/Комментировать
2022-09-23 13:34:07
English for Developers - канал для тех, кто хочет учить технический английский. От создатателей популярного ит-канала Книги программиста.

1. техническая лексика
2. опросы на английском
3. шутки на английском

Подписывайтесь, проходите опросы, читайте полезные прогерские фразы на английском: english_forprogrammers.

1 канал вместо тысячи учебников и курсов
3.3K views10:34
Открыть/Комментировать
2022-09-22 13:49:22
#Вопросы_с_собеседования

Напишите программу, которая возвращает количество гласных букв в строке

Наша программа при помощи регулярного выражения, вычисляет количество гласных (A, E, I, O, U, Y) в строке.

@python_job_interview
3.2K viewsedited  10:49
Открыть/Комментировать