Python вопросы с собеседований
25K subscribers
511 photos
18 videos
17 files
409 links
Вопросы с собеседований по Python

@workakkk - админ

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

@pro_python_code - Python

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

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

РКН: clck.ru/3FmrFd
Download Telegram
В чем разница между модулем и пакетом в Python?

Ответ
Каждый программный файл Python представляет собой модуль, который импортирует другие модули как объекты. Таким образом, модуль — это способ структурирования вашей программы. Папка с программой на Python называется пакетом модулей.

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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Как изменить тип данных списка?

Чтобы преобразовать список в кортеж, мы используем функцию tuple().
Чтобы превратить его в множество — функцию set().
Для преобразования в словарь — dict().
Для превращения в строку — join().

@python_job_interview
🧑‍💻 Собеседование Senior Python Developer на $6000

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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Объясните использование функций help() и dir()

Ответ
В Python функция help() используется для отображения документации по модулям, классам, функциям, ключевым словам и так далее. Если help() не получает параметров, она запускает интерактивную справочную утилиту на консоли.

Функция dir() возвращает допустимый список атрибутов и методов объекта, к которому она вызывается. Поскольку функция предназначена для получения наиболее релевантных данных (вместо отображения полной информации), она ведет себя по-разному с разными объектами:

- Для модулей/библиотек функция dir() возвращает список всех атрибутов, содержащихся в этом модуле.

- Для объектов класса dir() вернет список всех допустимых атрибутов и базовых атрибутов.

- Когда ей не передаются никакие параметры, функция dir() возвращает список атрибутов в текущей области видимости.

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой метод использовался до оператора «in» для проверки наличия ключа в словаре?

Ответ

Метод has_key().

Ниже приводится синтаксис для метода has_key():

dict.has_key(key)


Параметры
key – это ключ, который нужно искать в словаре.
Возвращаемое значение
Этот метод возвращает true, если данный ключ доступен в словаре, иначе он возвращает false.

Пример
В следующем примере показано использование метода has_key().

#!/usr/bin/python3

dict = {'Name': 'AndreyEx', 'Age': 18}

print ("Значение : %s" % dict.has_key('Age'))
print ("Значение : %s" % dict.has_key('Sex'))



Когда мы запускаем указанную выше программу, она дает следующий результат:

Значение : True
Значение : False


@python_job_interview
🖥 В чем смысл параметров_value, __value?

Поле класса с одним лидирующим подчеркиванием говорит о том, что параметр используется только внутри класса. При этом он доступен для обращения извне.

class Foo(object):
def __init__(self):
self._bar = 42

Foo()._bar
>>> 42


Современные IDE вроде PyCharm подсвечивают обращение к полю с подчеркиванием, но ошибки в процессе исполнения не будет.

Поля с двойным подчеркиванием доступны внутри класса, но недоступны извне. Это достигается хитрым приемом: интерпретатор назначает таким полям имена вида _<ClassName>__<fieldName>. Зная это правило, можно получить значение скрытого поля вне класса, но это смотрится очень уродливо.

class Foo(object):
def __init__(self):
self.__bar = 42


Foo().__bar
>>> AttributeError: 'Foo' object has no attribute '__bar'
Foo()._Foo__bar
>>> 42


@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Все знают, что сегодня питон в моде. Но истинное принятие новой технологии подразумевает понимание ее недостатков. Что вы можете сказать по этому поводу?

Ответ

Какие в питоне есть ограничения:

- интерпретируемая природа питона снижает скорость исполнения программы
- его не выгодно использовать для мобильных устройств и браузеров
- будучи языком с динамической типизацией данных, он использует утиную типизацию; в связи с этим появляются ошибки исполнения (runtime errors);
- в нем слабо развиты возможности доступа к базам данных; поэтому питон не идеальный вариант для приложений с очень большими базами данных;
- низкие требования на входе, то есть свои силы в питоне может попробовать каждый; это иногда снижает качество кода;
- у питона индивидуально выраженный стиль.

@python_job_interview
Как в питоне узнать, в какой мы сейчас директории?

 Ответ

>>> import os
>>> os.getcwd()
"C:\\Users\\lifei\\AppData\\Local\\Programs\\Python\\Python36-32"


@python_job_interview
🖥 Напишите функцию, которая будет принимать два списка чисел (вложенный и обычный) и проверять, все ли числа в подсписках вложенного принадлежат множеству чисел второго, обычного списка

Примечания:
1) пустой список считаем валидным подмножеством множества чисел второго списка
2) в каждом отдельном списке (как во вложенных, так и во втором, обычном списке) числа будут уникальными.

@python_job_interview
Какой результат выводит данный код:

>>> def extendList(val, list=[]):
list.append(val)
return list
>>> list1 = extendList(10)
>>> list2 = extendList(123,[])
>>> list3 = extendList('a')
>>> list1, list2, list3
[10, ‘a’], [123], [10, ‘a’]


Ответ
Возможный, но неверный ответ: ([10], [123], [‘a’])

В функции есть аргумент list=[], который не запускается в нулевом значении при каждом вызове этой функции. Когда мы первый раз определяем функцию, она создает новый список. Затем, каждый раз, когда мы вызываем данную функцию без аргумента-списка, она использует один и тот же список. Питон исполняет выражения, которые имеют нулевые значения, при определении функции, а не при вызове функции.


@python_job_interview
Как работать с числами, которые не входят в десятичную систему счисления?

Ответ

В питоне можно вводить бинарные, восьмеричные и шестнадцатеричные числа.

Бинарные. Это числа, составленные из 0 и 1. Для ввода в бинарном формате, используется префикс 0b или 0B:

>>> int(0b1010)
10


Число можно преобразовать в бинарный формат с помощью функции bin():

>>> bin(0xf)
‘0b1111’


Восьмеричные числа могут состоять из цифр от 0 до 7, также используется префикс 0o или 0O:

>>> oct(8)
‘0o10’


Шестнадцатеричные числа могут состоять из цифр от 0 до 15, также используется префикс 0x или 0X:

>>> hex(15)
‘0xf’


@python_job_interview
Что такое операторы присвоения в питоне?

Ответ

Все арифметические операторы можно комбинировать с символом присвоения.

>>> a = 7
>>> a += 1
>>> a
8

>>> a -= 1
>>> a
7

>>> a *= 2
>>> a
14

>>> a /= 2
>>> a
7.0

>>> a **= 2
>>> a
49.0

>>> a // =3
>>> a
16.0

>>> a %= 4
>>> a
0.0


@python_job_interview
Сколько аргументов может принять range()

Ответ
От одного до трех:

>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(-5))
[]
>>> list(range(2, 7))
[2, 3, 4, 5, 6]
>>> list(range(-3, 4))
[-3, -2, -1, 0, 1, 2, 3]
>>> list(range(2, 9, 2))
[2, 4, 6, 8]
>>> list(range(9, 2, -1))
[9, 8, 7, 6, 5, 4, 3]


@python_job_interview
Что плохого в следующем коде?

Ответ:
В Python нет объявлений переменных, поэтому он должен сам определить их область действия. Если внутри функции имеется обращение к переменной, то она считается локальной. Переменная count выше является глобальной, поэтому код выбрасывает ошибку.

@python_job_interview
Расскажите, какой в питоне механизм передачи параметров

Ответ

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

Рассмотрим следующий пример:

def foo(x):
x = 4

a = 3
foo(a)
print(a)
# 3

Функция вызывается, но изменения оказанные на переменную a больше не действую после возврата из функции, ведь a всё ещё равна 3. Поэтому может показаться, что используется передача по значению, но это не так. Python не копирует значения параметров при вызове функции. Если мы рассмотрим другую функцию:

def clearly_not_pass_by_value(my_list):
my_list[0] = 42

l = [1, 2, 3]
clearly_not_pass_by_value(l)
print(l)
# [42, 2, 3]


— то мы четко видим, что элемент исходного списка l был изменен после вызова функции.

При передачи по ссылке в момент вызова функции передаются адреса переменных, причем с адресами работают так, как если бы это была обычная переменная (поэтому не нужно дополнительно проводить разыменование, как это делается в Си). Такая модель подразумевает, что исходные переменные и параметры функции — это одни и те же объекты. Изменяя параметры в теле функции, вы изменяете их и в вызывающем контексте.

@python_job_interview
🖥 Что делает питон объектно-ориентированным?

Ответ

Он следует парадигме объектно-ориентированного программирования, которая построена вокруг классов (classes) и их экземпляров (instances). Это позволяет реализовать следующие функции:
- сокрытие внутренней структуры данных
- абстракция
- наследование
- полиморфизм (способность выбирать правильный метод в зависимости от типа данных)
- ограничение доступа к данным

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие есть типы объектов в питоне?

Ответ

В питоне поддерживаются изменяемые (mutable) и не изменяемые (immutable) типы объектов.

Не изменяемые не позволяют изменять свое содержание. Примеры: кортежи, булевы, строки, числа. Итерация по ним выполняется быстрее.

Изменяемые позволяют изменять свое содержание. Примеры: списки, множества и словари. Итерация по ним выполняется медленнее.

@python_job_interview
🖥 Что такое оператор контроля последовательности (control flow statement)

Ответ

Обычно программа в питоне начинает исполнение с первой строки. После нее программа однократно исполняет каждое предложение. Когда будет исполнено последнее предложение, программа прекращается. Также контроль последовательности помогает усложнить обычный порядок исполнения программы.

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Что выведет программа?

Ответ:
Кажется, ничего сложного. create_multipliers вернёт список из 5 функций (назовём их list_lamba_f). Каждая list_lamba_f будет умножать свой аргумент на свой индекс в результирующем массиве.

Получается, что на экране мы увидим:

0
2
4
6
8

Дальнейший разбор предполагает, что вам знакомо замыкание (closure) при использовании вложенных функций (nested functions).

Свои коррективы в наивное объяснение выше вносит позднее связывание. Согласно ему, значение переменной из замыкания (это переменная i) вычисляется в тот момент, когда вызывается внутренняя функция (наши list_lamba_f).

Получается, что значение i в list_lamba_f вычисляется в момент вызова multiplier(2) в пятой строчке. Но в этот момент create_multipliers уже отработала целиком. и значение i — это 4. То есть для всех list_lamba_f значение i равно 4.

Итак, ответ:

8
8
8
8
8.


@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥 Как происходит инициалиация list в CPython ?

Ответ

Объект списка в CPython представлен нижеследующей структурой в C. ob_item — это список указателей на элементы списка, allocated — количество выделенной памяти.

typedef struct {
PyObject_VAR_HEAD
PyObject **ob_item;
Py_ssize_t allocated;
} PyListObject;



Инициализация списка

Давайте посмотрим, что происходит при создании пустого списка, к примеру l = []. Вызывается функция PyList_New(0):

/*
size - размер списка
*/
PyList_New(Py_ssize_t size)
{
// Вычисляется реальный размер необходимой памяти
nbytes = size * sizeof(PyObject *);

// Инициализируется ob_item
if (size <= 0)
op->ob_item = NULL;
else {
op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
memset(op->ob_item, 0, nbytes);
}

// Сохраняется количество выделенных ячеек
op->allocated = size;

return (PyObject *) op;
}



Важно понимать разницу между выделенной памятью и размером списка. Размер списка — это тоже самое, что и len(l). allocated — это количество выделенной памяти, которое зачастую может быть больше размера списка. Это делается для предотвращения вызовов realloc при каждом добавлении элементов.


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