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

@workakkk - админ

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

@pro_python_code - Python

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

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

РКН: clck.ru/3FmrFd
Download Telegram
🖥 Объясните использование функций help() и dir()

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

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

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

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

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

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👍121🔥1
Какой метод использовался до оператора «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
👍153🔥1
🖥 В чем смысл параметров_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
👍172🔥1
Все знают, что сегодня питон в моде. Но истинное принятие новой технологии подразумевает понимание ее недостатков. Что вы можете сказать по этому поводу?

Ответ

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

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

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

 Ответ

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


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

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

@python_job_interview
👍12🔥31👎1
Какой результат выводит данный код:

>>> 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
👍18🔥3👎21🤔1
Как работать с числами, которые не входят в десятичную систему счисления?

Ответ

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

Бинарные. Это числа, составленные из 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
👍171🔥1
Что такое операторы присвоения в питоне?

Ответ

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

>>> 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
👍21🌚31🔥1
Сколько аргументов может принять 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
👍17🔥41
Что плохого в следующем коде?

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

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

Ответ

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

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

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
👍17🤔4👎2🔥21
🖥 Что делает питон объектно-ориентированным?

Ответ

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

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

Ответ

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

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

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

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

Ответ

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

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

Ответ:
Кажется, ничего сложного. 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
👍33🔥101
🖥 Как происходит инициалиация 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
👍16🔥21
🖥 Можете объяснить жизненный цикл треда?

Ответ

Общими словами, цикл выглядит так:
- сначала создается класс, который подменяет метод исполнения класса в треде, и создаем экземпляр (instance) для этого класса;
- вызываем start(), который готовит тред к исполнению;
- переводим тред в состояние исполнения;
- можно вызвать разные методы, например sleep() и join(), которые переводят тред в режим ожидания;
- когда режим ожидания или исполнения прекращается, другие ожидающие треды подготавливаются к исполнению;
- после завершения исполнения тред останавливается.

@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👍112🔥1
В чем разница между методами экземпляра, класса и статическими методами в Python?

Ответ

Методы экземпляра: принимают параметр self и относятся к определенному экземпляру класса.

Статические методы: используют декоратор @staticmethod, не связаны с конкретным экземпляром и являются автономными (атрибуты класса или экземпляра не изменяются).

Методы класса: принимают параметр cls, можно изменить сам класс.

Проиллюстрируем разницу на вымышленном классе CoffeeShop:

class CoffeeShop:
specialty = 'espresso'

def __init__(self, coffee_price):
self.coffee_price = coffee_price

# instance method
def make_coffee(self):
print(f'Making {self.specialty} for ${self.coffee_price}')

# static method
@staticmethod
def check_weather():
print('Its sunny')

# class method
@classmethod
def change_specialty(cls, specialty):
cls.specialty = specialty
print(f'Specialty changed to {specialty}')


У класса CoffeeShop есть атрибут specialty (фирменный напиток), установленный по умолчанию в значение ‘espresso’. Каждый экземпляр CoffeeShop инициализируется с атрибутом coffee_price. У него также три метода: метод экземпляра, статический метод и метод класса.

Давайте инициализируем экземпляр с атрибутом coffee_price, равным 5. Затем вызовем метод экземпляра make_coffee:

coffee_shop = CoffeeShop('5')
coffee_shop.make_coffee()
#=> Making espresso for $5


Теперь вызовем статический метод. Статические методы не могут изменять состояние класса или экземпляра, поэтому обычно используются для служебных функций, например, сложения двух чисел. Наши проверяют погоду. Говорят, что солнечно. Отлично!

coffee_shop.check_weather()
#=> Its sunny


Теперь используем метод класса для изменения фирменного напитка (specialty), а затем сделаем кофе (make_coffee):

coffee_shop.change_specialty('drip coffee')
#=> Specialty changed to drip coffee

coffee_shop.make_coffee()
#=> Making drip coffee for $5

Скопировать код
Обратите внимание, что make_coffee раньше делал эспрессо, а теперь заваривает капельную кофеварку (drip coffee).

@python_job_interview
👍174🔥3