Напиши программу для очистки и нормализации первой главы 'Моби Дика', находящегося в файле 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 не "знает" цифр больше 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
Предупреждения обычно выводятся на экран в ситуациях, когда не гарантируется ошибочное поведение и программа, как правило, может продолжать работу, однако пользователя следует уведомить о чём-либо. Базовым классом для предупреждений является
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-ый остров в матрице, с помощью обхода в глубину
# Перебираем двумерный массив, пока не найдем первый элемент суши
2. С помощью обхода в ширину мы найдем кратчайший путь до 2-го острова, для этого мы заполнили очередь координатами элементов 1-го острова.
# Чтобы убрать больше количество условных операторов
# я буду использовать цикл for, в котором я буду перебирать
# все возможные варианты дальнейшего пути
@python_job_interview
Дана двоичная матрица размера 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 по формуле:
Пример работы программы:
Результат:
Пишите свое решение в комментариях👇
@python_job_interview
Дана переменная, в которой хранится информация о затратах и доходе рекламных кампаний по различным источникам. Необходимо дополнить исходную структуру показателем 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
Вам дан набор чисел в виде списка 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 раз в строке. Напишите функцию
Примечание: все символы строки s являются целыми числами от 0 до 9.
Пример:
Входные данные:
Пояснение: вначале 1 встречается только один раз. Меняем на (1, 1). Затем, 2 появляется три раза и заменяется на (3, 2) и так далее.
Важно: не забудьте пробелы между скобками.
Пишите свое решение в комментариях👇
@python_job_interview
Вам дана строка 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
if __debug__:
assert False, ("error")
Пишите свой ответ в комментариях👇
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
_MangledGlobal__mangled = 23
class MangledGlobal:
def test(self):
return __mangled
>>> MangledGlobal().test()
23
Пишите свой ответ в комментариях👇
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
big_num_1 = 1000
big_num_2 = 1000
small_num_1 = 1
small_num_2 = 1
big_num_1 is big_num_2
small_num_1 is small_num_2
Пишите свой ответ в комментариях👇
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Как подготовиться к собеседованию на позицию Middle Python Developer
Всем привет! Меня зовут Александр, я Python-разработчик в компании VK. За свою карьеру питониста приходилось достаточно часто проходить собеседования, особенно работая на аутсорсе. И я, проходя все эти собеседования, выявил некоторые общие моменты, которыми хочу с вами поделиться.
▪Знания в Питоне
▪Алгоритмы
▪Фреймворки
▪Базы данных
▪Общие советы
📝 Читать дальше
@python_job_interview
Всем привет! Меня зовут Александр, я Python-разработчик в компании VK. За свою карьеру питониста приходилось достаточно часто проходить собеседования, особенно работая на аутсорсе. И я, проходя все эти собеседования, выявил некоторые общие моменты, которыми хочу с вами поделиться.
▪Знания в Питоне
▪Алгоритмы
▪Фреймворки
▪Базы данных
▪Общие советы
📝 Читать дальше
@python_job_interview
Дан родительский класс и дочерний, который наследуется от него
class Parent():
def test(self):
print('inside parent')
class Child(Parent):
def test(self):
print('inside child')
при вызове метода экземпляра дочернего класса с тем же названием вызывается функция из дочернего класса, перезаписываем родительскую
>>> b1 = Child()
>>> b1.test()
inside child
>>>
Вопрос: можно ли сделать так чтобы дочерний метод не перезаписывал родительский, а добавлялся к нему и они выполнялись бы вместе и поочередно (сначала родительский потом дочерний)? Чтобы получилось вот так:
>>> b1.test()
inside parent
inside child
>>>
Ответ
Для этого можно вызвать функцию в родительском классе при помощи
super().
class Parent:
def test(self):
print('inside parent')
class Child(Parent):
def test(self):
super().test()
print('inside child')
b1 = Child()
b1.test()
Вывод:
inside parent
inside child
Подробнее про функцию
super()
можете почитать в документации.#junior
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Если нам необходимо подсчитать количество уникальных значений в списке, можно, например, создать словарь, в котором ключи – это значения списка, а значения – счетчик встречаемости.
%%time
num_counts = {}
for num in a_long_list:
if num in num_counts:
num_counts[num] += 1
else:
num_counts[num] = 1
# Вывод в консоль
# CPU times: user 448 ms, sys: 1.77 ms, total: 450 ms
# Wall time: 450 ms
Однако более эффективный способ для решения этой задачи – использование Counter() из модуля collections. Весь код при этом уместится в одной строчке:
%%time
num_counts2 = Counter(a_long_list)
# Вывод в консоль
# CPU times: user 40.7 ms, sys: 329 μs, total: 41 ms
# Wall time: 41.2 ms
Этот фрагмент будет работать примерно в 10 раз быстрее, чем предыдущий.
У Counter также есть удобный метод most_common, позволяющий получить самые часто встречающиеся значения:
for number, count in num_counts2.most_common(10):
print(number, count)
# Вывод в консоль
29 19831
47 19811
7 19800
36 19794
14 19761
39 19748
32 19747
16 19737
34 19729
33 19729
Одним словом, collections – это замечательный модуль, который должен быть в базовом наборе инструментов любого Python-разработчика. Не поленитесь прочитать наше руководство по применению модуля.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Задаются месяц и год в виде чисел. Нужно определить, есть ли в этом месяце пятница, 13-е
Пример:
has_friday_13(3, 202
3) ➞ True
has_friday_13(10, 2017) ➞ True
has_friday_13(1, 1985) ➞ False
👉 Пишите ваше решение в комментариях👇
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопросы и ответы к интервью для Python Developer
В этом репозитории собраны популярные вопросы по Python и смежным темам: Django, ООП, принципы программирования.
Также в проекте есть вопросы по основам HTML, фронтенд и БД, которые позволят вам повторить важные моменты, на которых зачастую останавливаются интервьюеры:
https://github.com/yakimka/python_interview_questions
#python
@python_job_interview
В этом репозитории собраны популярные вопросы по Python и смежным темам: Django, ООП, принципы программирования.
Также в проекте есть вопросы по основам HTML, фронтенд и БД, которые позволят вам повторить важные моменты, на которых зачастую останавливаются интервьюеры:
https://github.com/yakimka/python_interview_questions
#python
@python_job_interview