Forwarded from Dinar_Sadykov 👨🏻💻
Компетенция_Python.pdf
118.2 KB
Forwarded from Python вопросы с собеседований
В зависимости от контекста, может означать либо функцию-генератор, либо итератор генератора (чаще всего, последнее). Методы
__iter__ и __next__
у генераторов создаются автоматически.С точки зрения реализации, генератор в Python — это языковая конструкция, которую можно реализовать двумя способами: как функция с ключевым словом yield или как генераторное выражение. В результате вызова функции или вычисления выражения, получаем объект-генератор типа types.GeneratorType. Канонический пример - генератор, порождающий последовательность чисел Фибоначчи, которая, будучи бесконечна, не смогла бы поместиться ни в одну коллекцию. Иногда термин применяется для самой генераторной функции, а не только объекта, возвращенного ей в качестве результата.
Так как в объекте-генераторе определены методы next и iter, то есть реализован протокол итератора, с этой точки зрения, в Python любой генератор является итератором.
Когда выполнение функции-генераторы завершается (при помощи ключевого слова return или достижения конца функции), возникает исключение StopIteration.
Что такое генераторная функция
Генераторная функция - функция, в теле которой встречается ключевое слово yield. Будучи вызвана, такая функция возвращает объект-генератор (generator object) (итератор генератора (generator iterator)).
Что делает yield
yield замораживает состояние функции-генератора и возвращает текущее значение. После следующего вызова __next__() функция-генератор продолжает своё выполнение с того места, где она была приостановлена.
В чем отличие [x for x in y] от (x for x in y)
Первое выражение возвращает список (списковое включение), второе – генератор.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
Можно ли извлечь элемент генератора по индексу
Нет, будет ошибка. Генератор не поддерживает метод getitem.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
MRO – method resolution order, порядок разрешения методов. Алгоритм, по которому следует искать метод в случае, если у класса два и более родителей.
В классических классах поиск при наследовании по ссылкам на имена осуществляется в следующем порядке:
1. Сначала экземпляр
2. Затем его класс
3. Далее все суперклассы его класса с обходом сначала с глубину, а затем слева направо
Используется первое обнаруженное вхождение. Такой порядок называется DFLR (Обход вглубину и слева направо).
При наследовании классов нового стиля применяется правило MRO (порядок разрешения методов), т.е линеаризованный обход дерева классов, причем вложенный элемент наследования становится доступным в атрибуте mro данного класса. Такой алгорим называется C3-линеаризация. Наследование по правилу MRO осуществляется приблизительно в следующем порядке.
Перечисление всех классов, наследуемых экземпляром, по правилу поиска DFLR для классических классов, причем класс включается в результат поиска столько раз, сколько он встречается при обходе.
Просмотр в полученном списке дубликатов классов, из которых удаляются все, кроме последнего (крайнего справа) дубликата в списке.
Упорядочение по правилу MRO применяется при наследовании и вызове встроенной функции super(), которая всегда вызывает следующий по правилу MRO класс (относительно точки вызова).
Пример наследования в неромбовидных иерархаических деревьях:
class attr = 3 # D:3 E:2
class B(D) pass # | |
class E: attr = 2 # B C:1
class C(E): attr = 1 # / /
class A(B, C): pass # A
X = A() # |
print(X.attr) # X
# DFLR = [X, A, B, D, C, E]
# MRO = [X, A, B, D, C, E, object]
# И в версии 3.х и в версии 2.х (всегда) выводит строку "3"
Пример наследования в ромбовидных иерархаических деревьях:
class attr = 3 # D:3 D:3
class B(D) pass # | |
class C(D): attr = 1 # B C:1
class A(B, C): pass # / /
X = A() # A
print(X.attr) # |
# X
# DFLR = [X, A, B, D, C, D]
# MRO = [X, A, B, C, D, object] (сохраняет только последний дубликат D)
# Выводит строку "1" в версии 3.х, строку "3" в версии 2.х ("1" если D(object))
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
Основное различие между этими двумя методами состоит в том, что
__new__
обрабатывает создание объекта, а __init__
обрабатывает его инициализацию.__new__
вызывается автоматически при вызове имени класса (при создании экземпляра), тогда как __init__
вызывается каждый раз, когда экземпляр класса возвращается __new__
, передавая возвращаемый экземпляр в __init__
в качестве параметра self, поэтому даже если вы сохранили экземпляр где-нибудь глобально/статически и возвращали его каждый раз из __new__
, для него все-равно будет каждый раз вызываться __init__
.Из вышесказанного вытекает что сначала вызывается
__new__
, а потом __init__
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
В Python 3 при возбуждении исключения в блоке except, старое исключение сохраняется в атрибуте данных context и если новое исключение не обработано, то будет выведена информация о том, что новое исключение возникло при обработке старого («During handling of the above exception, another exception occurred:»). Также, можно связывать исключения в одну цепь или заменять старые новыми. Для этого используется конструкция raise новое_исключение from старое_исключение либо raise новое_исключение from None. В первом случае указанное исключение сохраняется в атрибуте
__cause__
и атрибут __suppress_context__
(который подавляет вывод исключения из __context__)
устанавливается в True. Тогда, если новое исключение не обработано, будет выведена информация о том, что старое исключение является причиной нового («The above exception was the direct cause of the following exception:»). Во втором случае __suppress_context__
устанавливается в True и __cause__
в None. Тогда при выводе исключения оно, фактически, будет заменено новым (хотя старое исключение всё ещё хранится в __context__)
.В Python 2 нет сцепления исключений. Любое исключение, выброшенное в блоке except, заменяет старое.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
Прикрепляем два XML (1 файл, 2 файл) – это ответы на поисковые запросы, сделанные к одному из наших партнёров. В ответах лежат варианты перелётов (тег Flights) со всей необходимой информацией, чтобы отобразить билет на Aviasales.
На основе этих данных, нужно сделать вебсервис, в котором есть эндпоинты, отвечающие на следующие запросы:
- Какие варианты перелёта из DXB в BKK мы получили?
- Самый дорогой/дешёвый, быстрый/долгий и оптимальный варианты
- В чём отличия между результатами двух запросов (изменение маршрутов/условий)?
Язык реализации: python3 Формат ответа: json Используемые библиотеки и инструменты — всё на твой выбор.
Оценивать будем умение выполнять задачу имея неполные данные о ней, умение самостоятельно принимать решения и качество кода.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
type это метакласс, который Питон внутренне использует для создания всех классов.
Когда вы пишете:
class Foo(Bar):
pass
Питон делает следующее:
- Есть ли у класса
Foo
атрибут __metaclass__
?- Если да, создаёт в памяти объект-класс с именем Foo, используя то, что указано в
__metaclass__.
- Если Питон не находит metaclass, он ищет
__metaclass__
в родительском классе Bar и попробует сделать то же самое.- Если же
__metaclass__
не находится ни в одном из родителей, Питон будет искать __metaclass__
на уровне модуля.- И если он не может найти вообще ни одного
__metaclass__
, он использует type для создания объекта-класса.@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
Привет! Меня зовут Руслан. Около 12 лет я занимаюсь разработкой, из них девять — на Python. За это время я собеседовался на разные позиции десятки раз и сам провёл примерно пару сотен собеседований. Не всегда успешно :/ В этой статье поговорим о том, как снизить вероятность провалов и к чему быть готовым.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python вопросы с собеседований
- перехватить создание класса
- изменить класс
- вернуть модифицированный
Зачем вообще использовать метаклассы
Основное применение метаклассов это создание API. Типичный пример — Django ORM.
Она позволяет написать что-то в таком духе:
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
Однако если вы выполните следующий код:
guy = Person(name='bob', age='35')
print guy.age
вы получите не
IntegerField
, а int, причём значение может быть получено прямо из базы данных.Это возможно, потому что models.Model определяет
__metaclass__
, который сотворит некую магию и превратит класс Person, который мы только что определили простым выражением в сложную привязку к базе данных.Django делает что-то сложное выглядящее простым, выставляя наружу простой API и используя метаклассы, воссоздающие код из API и незаметно делающие всю работу.
@python_job_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Мathshub
Мы подготовили подборку, которая будет полезна тем, кто интересуется изучением Python.
Материал в книге изложен доступно и понятно. Автор очень подробно рассматривает общие концепции, что дает полное понимание структуры языка.
Описывает язык Python 3. Если ваши знания о компьютере ограничиваются тем, как сохранять текстовые файлы — эта книга для вас.
Must read, самое популярное в мире руководство по языку Python. Научит писать программы, устранять ошибки и создавать работающие приложения.
Научно-популярно о том, как персональные компьютеры работают на аппаратном и программном уровне.
Простым языком описаны основные типовые задачи и методы их решения с подробными комментариями. Приводятся типичные ошибки начинающих и дается ряд полезных советов.
Разбираются вопросы разработки веб-приложений с использованием Python, фреймворка Django и интерактивной среды разработки PyCharm.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM