Вопросы и ответы с собеседований по Python
Вопросы и ответы с собеседований Python-разработчиков. Типы данных, методы и особенности работы со строками, списками и словарями, предназначение декораторов, концепция наследования, суть генераторов и многое другое.
Что такое переменная?
Переменная в Python — это идентификатор ссылки на объект в памяти. На один и тот же объект в памяти могут указывать (ссылаться) несколько переменных. Как только на область памяти перестают ссылаться переменные, данная область очищается сборщиком мусора.
Какие типы данных есть в Python?
bool - логический тип данных. True или False
bytearray - изменяемая последовательность байтов
bytes - неизменяемая последовательность байтов
complex - комплексные числа
dict - словарь (похож на ассоциативный массив в PHP)
ellipsis - используется для получения среза (определяется или ключевым словом Ellipsis или тремя точками)
float - вещественные числа
frozenset - неизменяемое множество
function - функция
int - целые числа (размер числа ограничен объемом доступной оперативной памяти)
list - список (аналогичен массивам в других языках программирования)
module - модуль
NoneType - пустой объект, объект без значения (точнее со значением None, что в других языках соответствует null)
set - множество (набор уникальных объектов)
str - unicode-строка
tuple - кортеж
type - типы и классы данных
Узнать тип данных можно с помощью функции type()
Осваиваем Python. Унция 1. Типы данных.
Типы данных наносят ответный удар
Расскажите про изменяемые и неизменяемые типы данных
Все типы данных в Python можно разделить на изменяемые и неизменяемые. Неизменяемость означает, что состояние нельзя изменить после создания. К неизменяемым типам данных относятся числа, строки, кортежи и байты (bytes). К изменяемым относятся списки, словари и массив байтов (bytearray).
Что вы знаете о строках?
a = "hello"
id(a) # 2044344987401
a = "hello world"
id(a) # 2044334957804
Cтрока – это упорядоченная последовательность символов, которая предназначена для хранения информации в виде простого текста.
В Python3 строка по умолчнанию имеет кодировку Unicode, что избавляет от проблем работы и отображения символов кирилицы и прочих экзотических кодировок. Строка это неизменяемый тип данных, т.е. если нужно добавить символов в существующую строку, придется создать новую строку, с новым адресом в памяти.
41 вопрос о работе со строками в Python
Основы Python — кратко. Строки.
Какие есть числовые типы?
int - целые числа.
float - вещественные или действительные числа(числа с плавающей точкой).
complex - комплексные числа.
Также есть модуль decimal, используемый для выполнения операций повышенной точности.
Есть еще и модуль fractions, обеспечивающий поддержку рациональных чисел и использующийся для осуществления математических операций с дробями.
3 особенности чисел в Python, о которых вы, возможно, не знали
Что в Python не является объектом?
В Python всё является объектом, кроме ключевых слов: in, is, if, while, и т. д.
Заметки об объектной системе языка Python ч.1
Разница между списком и кортежем?
1. Список можно изменить после создания. 2. Кортеж нельзя изменить после создания. 3. Список упорядочен. Он представляет собой упорядоченные последовательности объектов, как правило, одного и того же типа. Например, все имена пользователей упорядочены по дате создания: ["Seth", "Ema", "Eli"]. 4. У кортежа есть структура. В каждом индексе могут сосуществовать различные типы данных. Например, такая запись базы данных в памяти: (2, "Ema", "2020–04–16") # id, name, created_at. Основы Python — кратко. Часть 3. Списки, кортежи, файлы.
Как удалить из списка дубликаты?
a = [1,1,1,2,3]
a = list(set(a))
print(a)
#=> [1, 2, 3]
Это можно сделать путем преобразования списка в множество, а затем обратно в список. Обратите внимание, что множества не обязательно поддерживают порядок следования списка.
Разница между append и extend?
a = [1,2,3]
b = [1,2,3]
a.append(6)
print(a)
#=> [1, 2, 3, 6]
b.extend([4,5])
print(b)
#=> [1, 2, 3, 4, 5]
append добавляет значения в список, а extend добавляет в список значения из другого списка.
Как проверить, существует ли значение в списке?
Используйте in:
'a' in ['a','b','c']
#=> True
'a' in [1,2,3]
#=> False
Что такое словари?
Словари в Python - коллекции произвольных объектов с доступом по ключу.
Начиная с Python3.6 словарь dict() упорядочен, т.е. при переборе имеющегося словаря, элементы возвращаются в том порядке, в котором они были добавлены в словарь при его наполнении.
До Python3.6 приходилось использовать объект OrderedDict(), чтобы иметь упорядоченную коллекцию, с доступам к элементам по ключам. Словарь это изменяемый тип данных. Количество пар "ключ-значение" ограничено объемом оперативной памяти.
Как отсортировать словарь по ключам?
Нельзя «отсортировать» словарь, поскольку словари не поддерживают упорядочение, но можно вернуть отсортированный список кортежей с ключами и значениями из словаря:
d = {'c':3, 'd':4, 'b':2, 'a':1}
sorted(d.items())
#=> [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
Где быстрее поиск: в словарях или списках?
Поиск значения в списке занимает O(n) времени, потому что нужно пройти весь список.
Поиск ключа в словаре занимает O(1) времени, потому что это хэш-таблица.
Разница во времени может быть огромной, если значений много, поэтому для производительности обычно рекомендуют словари. Но у них есть другие ограничения, такие как необходимость уникальных ключей.
Как выполняется интерполяция строк?
Без импорта класса 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)
)
Как проверить, что в строке только буквы и цифры?
Здесь можно использовать isalnum():
'123abc...'.isalnum()
#=> False
'123abc'.isalnum()
#=> True
В чем разница между is и ==?
== проверяет, одинаковые ли значения у переменных.
is проверяет, указывают ли переменные на один и тот же объект.
То есть, a is b по сути то же самое, что id(a) == id(b).
Что означает self в классе?
class Shirt:
def __init__(self, color):
self.color = color
s = Shirt('yellow')
s.color # => 'yellow'
self ссылается на экземпляр класса. Так метод может обновлять объект, к которому принадлежит.
Выше передача self в __init__() дает возможность установить цвет экземпляра при инициализации:
Разница между методами экземпляра, класса и статическими методами?
Методы экземпляра: принимают параметр self и относятся к определенному экземпляру класса.
Статические методы: используют декоратор @staticmethod, не связаны с конкретным экземпляром и являются автономными (атрибуты класса или экземпляра не изменяются).
Методы класса: принимают параметр cls, можно изменить сам класс.
Что такое декоратор?
Декоратор — это функция, оборачивающая другую функцию для расширения её функциональности без непосредственного изменения её кода.
В листинге кода приведен пример реализации декоратора для логирования:
def logging(func):
def log_function_called():
print(f'{func} called.')
func()
return log_function_called
Вот так он может быть использован:
def my_name():
print('chris')
Понимаем декораторы в Python'e, шаг за шагом. Шаг 1
Python декораторы на максималках. Универсальный рецепт по написанию и аннотированию от мала до велика
Разница между func и func()?
func — это представляющий функцию объект, который можно назначить переменной или передать другой функции.
Функция func() с круглыми скобками вызывает функцию и возвращает результат.
def func():
print('Im a function')
func # => function __main__.func >
func() # => Im a function
Для чего нужна функция range?
range генерирует список целых чисел. Ее можно использовать тремя способами.
1. range(stop) — генерирует целые числа от 0 до целого числа stop
2. range(start, stop) — генерирует целые числа от start до stop
3. range(start, stop, step) — генерирует целые числа от start до stop с интервалами step
Для чего нужна функция map?
def add_three(x):
return x + 3
li = [1, 2, 3]
list(map(add_three, li))
# => [4, 5, 6]
Она возвращает объект (итератор), который перебирает значения, применяя функцию к каждому элементу. В случае необходимости объект можно преобразовать в список.
Для чего нужна функция filter?
def add_three(x):
if x % 2 == 0:
return True
else:
return False
li = [1,2,3,4,5,6,7,8]
[i for i in filter(add_three, li)]
#=> [2, 4, 6, 8]
Функция делает буквально то, о чем говорит ее название: она фильтрует элементы в последовательности.
Каждый элемент передается функции, которая включает его в последовательность, если по условию получает True, и отбрасывает в случае False.
Для чего нужна функция reduce?
from functools import reduce
def add_three(x,y):
return x + y
li = [1,2,3,5]
reduce(add_three, li)
#=> 11
reduce принимает функцию и последовательность — и проходит по этой последовательности. На каждой итерации в функцию передаются как текущий элемент, так и выходные данные предыдущего элемента. В конце концов, возвращается одно значение.
Как работают функции any() и all()?
any возвращает True, если хоть один элемент в последовательности соответствует условию, то есть является True.
all возвращает True только в том случае, если условию соответствуют все элементы в последовательности.
Разница между модулем и пакетом?
Модуль — это файл или набор файлов, которые импортируются вместе:
import sklearn
Пакет — это каталог с модулями:
from sklearn import cross_validation
Таким образом, пакеты — это модули, но не все модули являются пакетами.
Как реализуется наследование классов?
class Car():
def drive(self):
print('vroom')
class Audi(Car):
pass
audi = Audi()
audi.drive()
В приведенном выше примере класс Audi является наследником Car. И вместе с этим наследуются методы экземпляра родительского класса.
Разница между remove, del и pop?
remove() удаляет первое совпадающее значение.
del удаляет элемент по его индексу.
pop() удаляет элемент по индексу и возвращает этот элемент.
Как выполняется обработка исключений?
try:
# попробовать сделать это
except:
# если блок try не сработал, попробовать это
finally:
# всегда делать это
Для обработки исключений Python предоставляет конструкцию из трех слов: try, except и finally.
Дайте несколько рекомендаций по PEP8
- Используйте 4 пробела на каждый уровень отступа. - Импорт должен быть сгруппирован в следующем порядке: - Импорт стандартной библиотеки. - Импорт сторонних элементов. - Импорт локального приложения/библиотеки. - Имена функций и переменных должны быть строчными и разделяться символами подчеркивания - Имена классов должны состоять из заглавных букв.
Как прочитать файл объемом 8 ГБ на Python с помощью компьютера с 2 ГБ ОЗУ?
with open("./large_dataset.txt") as input_file:
for line in input_file:
process_line(line)
Это решение работает для файлов любых размеров.
Когда вы открываете файл, всё, что вам нужно сделать, это использовать объект файла в качестве итератора: при циклическом просмотре этого объекта, вы будете извлекать по одной строке за раз, а предыдущие строки будут удалены из памяти.
Таким образом, файл никогда не будет полностью загружен в память, и обработка будет выполняться на ходу.
Что такое генератор?
Это функция, которая будучи вызванной в функции next() возвращает следующий объект согласно алгоритму ее работы. Вместо ключевого слова return в генераторе используется yield.
Главное отличие yield от return это то, что yield, после возврата объекта, сохраняет стек генератора, так что при следующем вызове функции next() от генератора, исполнение кода генератора продолжится с того момента, где yield вернул объект в прошлый раз.
Генераторы для самых маленьких