Python вопросы с собеседований
24.8K subscribers
510 photos
16 videos
17 files
407 links
Вопросы с собеседований по Python

@workakkk - админ

@machinelearning_interview - вопросы с собесдований по Ml

@pro_python_code - Python

@data_analysis_ml - анализ данных на Python

@itchannels_telegram - 🔥 главное в ит

РКН: clck.ru/3FmrFd
Download Telegram
🔥 Подборка каналов для Дата сайентиста

⭐️ Нейронные сети
@vistehno - chatgpt ведет блог, решает любые задачи и отвечает на любые ваши вопросы.
@aigen - сети для генерации картинок. видео, музыки и многого другого.
@neural – погружение в нейросети.

🖥 Machine learning
@ai_ml – погружение в нейросети, ai, Chatgpt, midjourney, машинное обучение.
@datasc - дата сайнс обучение самой востребованной профессии.
@machinelearning_ru – машинное обучении на русском от новичка до профессионала.
@machinelearning_interview – подготовка к собеседованию.
@datascienceiot – бесплатные книги Machine learning
@ArtificialIntelligencedl – канал о искусственном интеллекте

@machinee_learning – чат о машинном обучении
@datascienceml_jobs - работа ds, ml
@Machinelearning_Jobs - чат работы мл

🖥 SQL базы данных

@sqlhub - Повышение эффективности кода с грамотным использованием бд.
@chat_sql - чат изучения бд.

🖥 Python

@pythonl - главный канал самого популярного языка программирования.
@pro_python_code – учим python с ментором.
@python_job_interview – подготовка к Python собеседованию.
@python_testit - проверочные тесты на python
@pythonlbooks - современные книги Python
@python_djangojobs - работа для Python программистов
@python_django_work - чат обсуждения вакансий

🖥 Javascript / front

@react_tg - - 40,14% разработчиков сайтов использовали React в 2022 году - это самая популярная библиотека для создания сайтов.
@javascript -канал для JS и FrontEnd разработчиков. Лучшие практики и примеры кода. Туториалы и фишки JS
@Js Tests - каверзные тесты JS
@hashdev - погружение в web разработку.
@javascriptjobjs - отборные вакансии и работа FrontEnd.
@jsspeak - чат поиска FrontEnd работы.

🖥 Java
@javatg - выучить Java с senior разработчиком по профессиональной методике.
@javachats - чат для ответов на вопросы по Java
@java_library - библиотека книг Java
@android_its - Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит

👣 Golang
@Golang_google - восхитительный язык от Google, мощный и перспективный.
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@golangtests - интересные тесты и задачи GO
@golangl - чат изучающих Go
@GolangJobsit - отборные вакансии и работа GO
@golang_jobsgo - чат для ищущих работу.
@golang_books - полезные книги Golang
@golang_speak - обсуждение языка Go

🖥 Linux
@linux -топ фишки, гайды, уроки по работе  с Linux.
@linux chat - чат linux для обучения и помощи.
@linux_read - бесплатные книги linux

👷‍♂️ IT работа

@hr_itwork -кураторский список актуальных ит-ваканнсии

🤡It memes
@memes_prog - ит-мемы

⚙️ Rust
@rust_code - Rust избавлен от болевых точек, которые есть во многих современных яп
@rust_chats - чат rust

#️⃣ c# c++
C# - объединяет лучшие идеи современных языков программирования
@csharp_cplus чат
С++ - Универсальность. Возможно, этот главный плюс C++.

📓 Книги

@programming_books_it - большая библиотека. программиста
@datascienceiot -ds книги
@pythonlbooks - python библиотека.
@golang_books - книги Golang
@frontendbooksit - front книги
@progersit - ит-шпаргалки
@linux_read - Linux books
@java_library - Java books

🖥 Github
@github_code - лучшие проекты с github
@bigdatai - инструменты по работе с данными

🖥 Devops
Devops - специалист общего профиля, которому нужны обширные знания в области разработки.

📢 English for coders

@english_forprogrammers - Английский для программистов
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Задача

У вас есть девять цифр: 1, 2, …, 9. Именно в таком порядке. Вы можете вставлять между ними знаки «+», «-» или ничего. У вас будут получаться выражения вида 123+45-6+7+89. Найдите все из них, которые равны 100.

def all_combinations(a):
if len(a) <= 1:
yield a
else:
head = ''
tail = list(a)
while len(tail) > 0:
head += tail.pop(0)
for s in all_combinations(tail):
yield [head] + s

def all_signs(n):
if n == 0:
yield ()
else:
for tail in all_signs(n-1):
for s in '+-':
yield (s,) + tail

def perform_operations(nums, signs):
nums = list(map(int, nums))
result = nums.pop(0)
n = 1
for s in signs:
if s == '+':
result += nums.pop(0)
if s == '-':
result -= nums.pop(0)
n += 1
return result

for numbers in all_combinations(tuple(map(str, range(1, 10)))):
#print(numbers)
for signs in all_signs(len(numbers) - 1):
#print(signs)
summ = perform_operations(numbers, signs)
if summ == 100:
print(
''.join(map(
lambda x: ''.join(x),
zip(numbers, signs)))
+ numbers[-1])

Три функции:

- all_combinations — итератор, который выдает все числа для операций (в терминах задачи: вставляет пустые места);
- all_signs — выдаёт все возможные сочетания знаков + и - заданной длинны (для единообразия, это тоже итератор с рекурсией);
- perform_operations — выполняет операции.

Здесь просится решение, избавленное от if-ов и кодирования операций с помощью символов.

👉 Это не оптимальное решение. Пишите свое решение в комментариях👇


@python_job_interview
📌 Тестовое задание по python

Мы уже создавали матрицу спирали, теперь создадим полноценный проект.
Необходимо реализовать Python-библиотеку, которая осуществляет получение квадратной матрицы (NxN) с удалённого сервера и возвращает её пользователю в виде List[int]. Этот список должен содержать результат обхода полученной матрицы по спирали: против часовой стрелки, начиная с левого верхнего угла (см. test case ниже).

Пример исходной матрицы:

+-----+-----+-----+-----+
| 10 | 20 | 30 | 40 |
+-----+-----+-----+-----+
| 50 | 60 | 70 | 80 |
+-----+-----+-----+-----+
| 90 | 100 | 110 | 120 |
+-----+-----+-----+-----+
| 130 | 140 | 150 | 160 |
+-----+-----+-----+-----+



Матрица гарантированно содержит целые неотрицательные числа. Форматирование границ иными символами не предполагается.

Требования к выполнению и оформлению
Библиотека содержит функцию со следующим интерфейсом:

async def get_matrix(url: str) -> List[int]:
...
Функция единственным аргументом получает URL для загрузки матрицы с сервера по протоколу HTTP(S).

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

Взаимодействие с сервером должно быть реализовано асинхронно - посредством aiohttp, httpx или другого компонента на asyncio.

Библиотека должна корректно обрабатывать ошибки сервера и сетевые ошибки (5xx, Connection Timeout, Connection Refused, ...).

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

Решение задачи необходимо разместить на одном из публичных git-хостингов (GitHub, GitLab, Bitbucket). Можно также выслать решение в виде архива (zip, tar). Загружать библиотеку в PyPi или другие репозитории не требуется.

Проверка решения
Для самостоятельной проверки можно использовать следующий test case:

SOURCE_URL = 'https://raw.githubusercontent.com/avito-tech/python-trainee-assignment/main/matrix.txt'
TRAVERSAL = [
10, 50, 90, 130,
140, 150, 160, 120,
80, 40, 30, 20,
60, 100, 110, 70,
]


def test_get_matrix():
assert asyncio.run(get_matrix(SOURCE_URL)) == TRAVERSAL


Загружайте свои решения и отправляйте ссылки в комментарии👇

@python_job_interview
Каким будет результат выполнения кода?
Anonymous Quiz
24%
True a
3%
a True
7%
a
14%
True
18%
True True
3%
None
14%
Error
18%
Узнать ответ
📌 Дана последовательность, в которой находятся рандомные числа в произвольном порядке, в ней находятся только парные элементы.

Пример: 2 1 5 5 2 1

К ним добавляют элемент в произольное место
Например: 2 3 1 5 5 2 1

Найти этот уникальный элемент используя только один цикл
=========================================
(сложность программ - линейная)

import random
import numpy as np


def merge(lst1, lst2):
yield from lst1
yield from lst2

def shuffle_list(n: int):
lst = np.arange(1, n)
np.random.shuffle(lst)
return lst

def random_insert(lst, item):
lst.insert(random.randrange(len(lst)+1), int(item))

def find_item(lst: list):
init_lst = []
for item in lst:
if lst.count(item) == 1:
init_lst.append(item)
return init_lst


n = int(input("n > "))
a_list = shuffle_list(n)
b_list = shuffle_list(n)
c_list = list(merge(a_list, b_list))
e = input("e > ")
random_insert(c_list, e)
print(find_item(c_list))


Это громоздкое решение. Пишите свое решение в комментариях👇

@python_job_interview
🖥 Зашифруйте текст «To be, or not to be, that is the question!» алгоритмом Цезаря с сдвигом вправо на 1717 символов.

Ответ

s = 'To be, or not to be, that is the question!'
new_s = ''
eng_lower_alphabet = 'abcdefghijklmnopqrstuvwxyz'
eng_upper_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

for i in range(len(s)):
if s[i].isupper():
ind = eng_upper_alphabet.find(s[i])
while not ind + 17 < len(eng_upper_alphabet):
eng_upper_alphabet += eng_upper_alphabet
new_s += eng_upper_alphabet[ind + 17]
elif s[i].islower():
ind = eng_lower_alphabet.find(s[i])
while not ind + 17 < len(eng_lower_alphabet):
eng_lower_alphabet += eng_lower_alphabet
new_s += eng_lower_alphabet[ind + 17]
else:
new_s += s[i]
print(new_s)

Kf sv, fi efk kf sv, kyrk zj kyv hlvjkzfe!

#junior

Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задание

Напиши программу для очистки и нормализации первой главы 'Моби Дика', находящегося в файле moby.txt.

Все символы должны относиться к одному регистру.
Удалить все знаки препинания.
Записать слова по одному на строку во второй файл с именем moby_clean.txt
Подсказка:

> trantab = str.maketrans({'i': '1', 'e': None})
> print(trantab)

> s = "this is string example....wow!!!"
> print(s.translate(trantab))

> intab = "aeiou"
> outtab = "12345"
> trantab = str.maketrans(intab, outtab)
> print(trantab)

> s = "this is string example....wow!!!"
> print(s.translate(trantab))

> trantab = str.maketrans("", "", "sw")
> print(trantab)

> s = "this is string example....wow!!!"
> print(s.translate(trantab))


Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Почему Python не работает с системами счисления, основания которых превышают 36?

Потому что Python не "знает" цифр больше 35. Первые десять берутся из обычной десятичной: 0...9, следующие 26 — буквы латиницы a...z. Так исторически сложилось ещё полвека назад. А какой символ по вашему он должен использовать для цифры 36?

Кcтати, а разве бывает позиционная система счисления с основанием 0? Почему её Python разрешает?

0 используется как специальное значение, означающее автоматическое определение основания системы счисления по формату строки. int("10", 0) == 10, int("0x10", 0) == 16, int("0b10", 0) == 2.

Если же основание системы счисления не указано, то считается равным 10.

Чтобы работать с числами в системе счисления больше 36, можно воспользоваться библиотекой intlib.

from intlib import Int

n = 12345
base = 37
n_base_37 = Int(n).to_base(base)


Также в intlib есть метод from_base(), который можно использовать для перевода числа из другой системы счисления в 10-ую:

from intlib import Int

n_base_37 = "a1b2c3d4e5"
base = 37
n = Int(n_base_37, base=base)


@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Для чего нужны предупреждения (warnings) и как создать собственное

Предупреждения обычно выводятся на экран в ситуациях, когда не гарантируется ошибочное поведение и программа, как правило, может продолжать работу, однако пользователя следует уведомить о чём-либо. Базовым классом для предупреждений является Warning, который наследуется от Exception. Базовым классом-наследником Warning для пользовательских предупреждений является UserWarning.

Для чего нужен модуль warning

В модуле warning собраны функции для работы с предупреждениями. Основной является функция warn, которая принимает один обязательный параметр message, который может быть либо строкой-сообщением, либо экземпляром класса или подкласса Warning (в таком случае параметр category устанавливается автоматически) и два опциональных параметра: category (по умолчанию – UserWarning) – класс предупреждения и stacklevel (по умолчанию – 1) – уровень вложенности функций, начиная с которого необходимо выводить содержимое стека вызовов (полезно, например, для функций-обёрток для вывода предупреждений, где следует задать stacklevel=2, чтобы предупреждение относилось к месту вызова данной функции, а не самой функции).

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Задачи на Python с использованием dfs + bfs

Дана двоичная матрица размера n x n, где 1 представляет сушу, а 0 представляет воду.

Остров — это 4-направленно связанная группа 1, не связанная ни с какими другими 1. В сетке ровно два острова.

Вы можете изменить 0 на 1, чтобы соединить два острова в один остров.

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

1. Для начала я предлагаю найти 1-ый остров в матрице, с помощью обхода в глубину (dfs), если мы нашли элемент 1-го острова, тогда меняем значение в двумерной матрице на 2. Для экономии времени мы будем заранее заполнять очередь для будущего обхода в ширину (bfs).

n = len(grid)
queue = []

def dfs(x, y):
if x > 0 or x >= n or 0 > y or y >= n or grid[x][y] != 1:
return
grid[x][y] = 2
queue.append([x, y, 0])
dfs(x - 1, y)
dfs(x + 1, y)
dfs(x, y - 1)
dfs(x, y + 1)


# Перебираем двумерный массив, пока не найдем первый элемент суши
flag = False
for i in range(n):
for j in range(n):
if grid[i][j]:
dfs(i, j)
flag = True
break
if flag:
break

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

# Чтобы убрать больше количество условных операторов
# я буду использовать цикл for, в котором я буду перебирать
# все возможные варианты дальнейшего пути

dirct = [(0, 1), (0, -1), (1, 0), (-1, 0)]
while len(queue) != 0:
# step - расстояние до 2-го острова
x, y, step = queue[0][0], queue[0][1], queue[0][2]
queue.pop(0)
for dx, dy in dirct:
x1, y1 = x + dx, y + dy
if 0 > x1 or x1 >= n or 0 > y1 or y1 >= n:
continue
if grid[x1][y1] == 1:
return step # ответ на задачу
if grid[x1][y1] == 0:
grid[x1][y1] = 2
queue.append([x1, y1, step + 1])

Весь код:

class Solution(object):
def shortestBridge(self, grid):
n = len(grid)
queue = []
def dfs(x, y):
if 0 > x or x >= n or 0 > y or y >= n or grid[x][y] != 1:
return
grid[x][y] = 2
queue.append([x, y, 0])
dfs(x - 1, y)
dfs(x, y - 1)
dfs(x + 1, y)
dfs(x, y + 1)

flag = False
for i in range(n):
for j in range(n):
if grid[i][j]:
dfs(i, j)
flag = True
break
if flag:
break
dirct = [(0, 1), (1, 0), (-1, 0), (0, -1)]
while len(queue) != 0:
x, y, step = queue[0][0], queue[0][1], queue[0][2]
queue.pop(0)
for dx, dy in dirct:
x1, y1 = x + dx, y + dy
if 0 > x1 or x1 >= n or 0 > y1 or y1 >= n:
continue
if grid[x1][y1] == 1:
return step
if grid[x1][y1] == 0:
grid[x1][y1] = 2
queue.append([x1, y1, step + 1])


@python_job_interview
⚡️ Задачи на Python

Дана переменная, в которой хранится информация о затратах и доходе рекламных кампаний по различным источникам. Необходимо дополнить исходную структуру показателем ROI по формуле: (revenue / cost - 1) * 100

Пример работы программы:

results = {
'vk': {'revenue': 103, 'cost': 98},
'yandex': {'revenue': 179, 'cost': 153},
'ok': {'revenue': 103, 'cost': 110},
'adwords': {'revenue': 35, 'cost': 34},
'twitter': {'revenue': 11, 'cost': 24},
}


Результат:

{'adwords': {'revenue': 35, 'cost': 34, 'ROI': 2.94},
'ok': {'revenue': 103, 'cost': 110, 'ROI': -6.36},
'twitter': {'revenue': 11, 'cost': 24, 'ROI': -54.17},
'vk': {'revenue': 103, 'cost': 98, 'ROI': 5.1},
'yandex': {'revenue': 179, 'cost': 153, 'ROI': 16.99}}


Пишите свое решение в комментариях👇

@python_job_interview
🖥 Эта задача взята с Avito Weekend Offer для аналитиков

Вам дан набор чисел в виде списка Python. Необходимо найти медиану этого числового ряда.

Задание
Напишите функцию FindMedian, которая будет возвращать одно число - медианное значение.

Функция FindMedian принимает на вход arr - исходный список с числами.

Пример:


arr = [1, 5, 2, 3, 6]
Ответ: 3
Пример:


arr = [100, 5, 2, 4, 3, 6]
Ответ: 4.5


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

Дополнительная информация
Обратите внимание, что шаблон решения представлен в виде (на примере языка Python):


class Answer:
def function(self, arg1, arg2):
# напишите свой код ниже

return res
Здесь function - функция, которую вам нужно написать (от задачи к задаче ее имя меняется), а arg1, arg2 - аргументы этой функции.

Чтобы решить задачу, напишите свой код между комментарием и выражением return ....


print(Answer().function(arg1, arg2))
Если вам нужно импортировать какой-то модуль, указывайте модуль до class Answer. Например:


import mymodule

class Answer:
...
Полный пример:


# импортируем модуль
import collections

class Answer:
def problemSolve(self, n, m):
# напишите свой код ниже
...
return res

# промежуточно смотрим результат
print(Answer().problemSolve(n=2, m=3))


Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Декоратор для замера времени

Напишите декоратор TimeDecorator, который будет замерять время выполнения декорированной функции.

Исходная функция должна возвращать результат, а декоратор должен просто выводить строку "Затрачено N секунд" на экран.

Пример:

def func(...):
...
print('Я закончила работать!')

func()
# Затрачено 0.5 секунд
# Я закончила работать!


Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Декоратор для контроля уникальности аргументов

Напишите декоратор RepeatDecorator, который проверяет, запускалась ли ранее обернутая функция с заданными позиционными аргументами. Если такие аргументы уже подавались на вход данной функции, то нужно вывести на экран сообщение: «Функция с такими аргументами уже запускалась!».

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

Пример:


func1(1, 2)
> Ничего не выводится
func1(2, 1)
> Ничего не выводится
func1(3, 1)
> Ничего не выводится
func1(1, 2)
# Функция с такими аргументами уже запускалась!

func2(1, 2)
> Ничего не выводится, т.к. функция другая
func2(1, 2)
# Функция с такими аргументами уже запускалась!


Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Задача

В шеренгу друг за другом стоят n человек, рост i-го из них равен ai условных единиц. Вы тоже собираетесь встать в эту шеренгу, при чем вам хочется встать на такую позицию p, чтобы f(p) = [количество людей левее вас того же роста, что и вы] умножить на [количество людей правее вас ростом, не равным росту вас] было максимально. Для этого вы можете встать в начало шеренги, в её конец, или между любыми 2мя соседними людьми. К сожалению вы не можете точно вспомнить ваш рост, у вас есть только m предположений о том, каким он может быть, и для каждого из них вы хотели бы знать оптимальную позицию, на которую вам стоило бы встать.

Решение:

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

equal = [0 for i in range(len(m))]
notequal = [len(list(filter(lambda x: x != m[i], n))) for i in range(len(m))]
valsave = [0 for i in range(len(m))]
possave = [0 for i in range(len(m))]

for i in range(len(n)):
for x in range(len(m)):
if n[i] == m[x]:
equal[x] += 1
if n[i] != m[x]:
notequal[x] -= 1

val = equal[x] * notequal[x]
if val > valsave[x]:
valsave[x] = val
possave[x] = i+1
print(possave)


Пишите свое решение в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Задача количество последовательных вхождений

Вам дана строка s. Предположим, что некоторый символ x встречается последовательно n раз в строке. Напишите функцию occurence(), которая принимает строку s и заменяет последовательные вхождения символа x на (n, x). Результат выведите на экран.

Примечание: все символы строки s являются целыми числами от 0 до 9.

Пример:

Входные данные:
s = '1222311'
Вывод:
(1, 1) (3, 2) (1, 3) (2, 1)

Пояснение: вначале 1 встречается только один раз. Меняем на (1, 1). Затем, 2 появляется три раза и заменяется на (3, 2) и так далее.

Важно: не забудьте пробелы между скобками.

Пишите свое решение в комментариях👇

@python_job_interview
Каким будет результат выполнения этого кода?
Anonymous Quiz
6%
0.5
2%
2
34%
3
58%
Error
🖥 Вы видите только следующий кусок кода. Что с ним не так? И для чего такой код нужен?

if __debug__:
assert False, ("error")


Пишите свой ответ в комментариях👇

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM