Вопросы и ответы с собеседований по 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
вернул объект в прошлый раз.
Генераторы для самых маленьких