Какие есть типы объектов в питоне?
Ответ
В питоне поддерживаются изменяемые (mutable) и не изменяемые (immutable) типы объектов.
Не изменяемые не позволяют изменять свое содержание. Примеры: кортежи, булевы, строки, числа. Итерация по ним выполняется быстрее.
Изменяемые позволяют изменять свое содержание. Примеры: списки, множества и словари. Итерация по ним выполняется медленнее.
@python_job_interview
Ответ
В питоне поддерживаются изменяемые (mutable) и не изменяемые (immutable) типы объектов.
Не изменяемые не позволяют изменять свое содержание. Примеры: кортежи, булевы, строки, числа. Итерация по ним выполняется быстрее.
Изменяемые позволяют изменять свое содержание. Примеры: списки, множества и словари. Итерация по ним выполняется медленнее.
@python_job_interview
Ответ
Обычно программа в питоне начинает исполнение с первой строки. После нее программа однократно исполняет каждое предложение. Когда будет исполнено последнее предложение, программа прекращается. Также контроль последовательности помогает усложнить обычный порядок исполнения программы.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ:
Получается, что на экране мы увидим:
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
Ответ
Объект списка в 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
Ответ
Общими словами, цикл выглядит так:
- сначала создается класс, который подменяет метод исполнения класса в треде, и создаем экземпляр (instance) для этого класса;
- вызываем start(), который готовит тред к исполнению;
- переводим тред в состояние исполнения;
- можно вызвать разные методы, например sleep() и join(), которые переводят тред в режим ожидания;
- когда режим ожидания или исполнения прекращается, другие ожидающие треды подготавливаются к исполнению;
- после завершения исполнения тред останавливается.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между методами экземпляра, класса и статическими методами в Python?
Ответ
Методы экземпляра: принимают параметр self и относятся к определенному экземпляру класса.
Статические методы: используют декоратор @staticmethod, не связаны с конкретным экземпляром и являются автономными (атрибуты класса или экземпляра не изменяются).
Методы класса: принимают параметр cls, можно изменить сам класс.
Проиллюстрируем разницу на вымышленном классе CoffeeShop:
У класса CoffeeShop есть атрибут specialty (фирменный напиток), установленный по умолчанию в значение ‘espresso’. Каждый экземпляр CoffeeShop инициализируется с атрибутом coffee_price. У него также три метода: метод экземпляра, статический метод и метод класса.
Давайте инициализируем экземпляр с атрибутом coffee_price, равным 5. Затем вызовем метод экземпляра make_coffee:
Теперь вызовем статический метод. Статические методы не могут изменять состояние класса или экземпляра, поэтому обычно используются для служебных функций, например, сложения двух чисел. Наши проверяют погоду. Говорят, что солнечно. Отлично!
Теперь используем метод класса для изменения фирменного напитка (specialty), а затем сделаем кофе (make_coffee):
Скопировать код
Обратите внимание, что make_coffee раньше делал эспрессо, а теперь заваривает капельную кофеварку (drip coffee).
@python_job_interview
Ответ
Методы экземпляра: принимают параметр 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
Ответ:
Как известно, попытка доступа к элементу списка с использованием индекса, превышающего число элементов (например, операция list[10] в списке выше), приводит к ошибке IndexError. Однако, попытка получить доступ к срезу списка с начальным индексом, превышающем количество элементов в списке, не приведет к IndexError и просто вернет пустой список.
Особенно неприятным это обстоятельство делает то, что оно может привести к ошибкам, которые действительно трудно отследить, поскольку во время выполнения кода не возникает никаких ошибок.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Лучше всего питон использовать в следующих областях:
- веб-приложения
- графические интерфейсы пользователя для настольных ПК
- научные и арифметические приложения
- разработка ПО
- разработка программ обучения
- приложения для бизнеса
- сетевые приложения
- игры, 3D-графика
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Series – это проиндексированный одномерный массив значений. Он похож на простой словарь типа dict, где имя элемента будет соответствовать индексу, а значение – значению записи. DataFrame — это проиндексированный многомерный массив значений, соответственно каждый столбец DataFrame, является структурой Series.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Напишите в одну строку, как можно получить самую позднюю по значению букву в строке.
Ответ
Значение буквы определяется по ее коду в ASCII. Для этого подойдет функция max()
С помощью той же логики можно объяснить следующую строку кода:
@python_job_interview
Ответ
Значение буквы определяется по ее коду в ASCII. Для этого подойдет функция max()
>>> max("flyiNg")
"y"
С помощью той же логики можно объяснить следующую строку кода:
>>> max("fly{}iNg")
"}"
@python_job_interview
Ответ
Сначала создадим список:
>>> a=[1, 2, 4]
Затем используем метод
insert()
. В нем первым аргументом будет индекс, под которым вставляется объект, а вторым — значение объекта:>>> a.insert(2,3)
>>> a
[1, 2, 3, 4]
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Каким будет результат выполнения кода?
Anonymous Quiz
41%
{'x': 1} {'x': 2}
7%
{'x': 1} {'x': 1}
14%
{} {'x': 2}
5%
{'x': 2} {'x': 2}
2%
{} {}
2%
None
6%
Error
24%
Узнать ответ
Ответ
В питоне такой цикл не реализован. Это вопрос из тех, которые с подвохом, когда упоминают элементы других языков.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
- огромный набор бесплатных наборов данных
- инструменты для работы с данными
- обучающие материалы для датасаентистов
- перевод книг и статей
🔥 Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
Оба метода переводят класс в строку, но у них есть небольшая разница.
str — используется для красивого вывода информации об объекте. Вызывается, например, функциями print() и format().
repr — выводит подробную об информацию об объекте, очень полезно при отладке. Бывает, можно получить такой же объект, если запихнуть результат в eval(str).
Если метод str не определён, то используется repr и наоборот.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Функция complex() создает комплексное число:
>>> complex(3.5,4)
(3.5+4j)
Функция eval() исполняет строку:
>>> eval("print(max(22,22.0) — min(2,3))")
20
Функция filter() отфильтровывает элементы, для которых заданное условие верно.
>>> list(filter(lambda x: x%2 == 0,[1, 2, 0, False]))
[2, 0, False]
Функция format() помогает задать формат строки:
>>> print("a = {0} but b = {1}".format(a, b))
a = 2 but b = 3
Функция hash() возвращает хэш-значение объекта:
>>> hash(3.7)
644245917
Функция hex() преобразовывает число в шестнадцатеричное число:
>>> hex(14)
"0xe"
Функция input() читает ввод и возвращает строку:
>>> input("Enter a number")
Enter a number7
"7"
Функция len() возвращает число, показывающее длину строки:
>>> len("Ayushi")
6
Функция locals() возвращает словарь с локальной таблицей имен:
>>> locals()
{"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": <class "_frozen_importlib.BuiltinImporter">, "__spec__": None, "__annotations__": {}, "__builtins__": <module "builtins" (built-in)>, "a": 2, "b": 3}
Функция open() открывает файл:
>>> file = open("tabs.txt")
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ
Pickle — это модуль сериализации и десериализации объектов в Python.
В примере ниже мы сериализуем и десериализуем список словарей:
import pickle
obj = [
{'id':1, 'name':'Stuffy'},
{'id':2, 'name': 'Fluffy'}
]
with open('file.p', 'wb') as f:
pickle.dump(obj, f)
with open('file.p', 'rb') as f:
loaded_obj = pickle.load(f)
print(loaded_obj)
#=> [{'id': 1, 'name': 'Stuffy'}, {'id': 2, 'name': 'Fluffy'}]
Еще вопрос о pickle
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ
Инкремент и декремент можно сделать с помощью += и -=
value = 5
value += 1
print(value)
#=> 6
value -= 1
value -= 1
print(value)
#=> 4
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
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]
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ
enumerate() позволяет отслеживать индекс при итерации последовательности. Это более нативный способ, чем определение и приращение целого числа, представляющего индекс:
li = ['a','b','c','d','e']
for idx,val in enumerate(li):
print(idx, val)
#=> 0 a
#=> 1 b
#=> 2 c
#=> 3 d
#=> 4 e
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM