Python: задачки и вопросы
7.78K subscribers
1.18K photos
1 video
1 file
86 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
加入频道
def func(*имя) # *имя собирает любые добавочные не прошедшие сопоставление аргументы в кортеж, а **имя — в словарь.


В версии Python 3.0 и выше любые обычные аргументы или аргументы со значениями по умолчанию, следующие за формой *имя или за единственным символом *, являются именованными аргументами, которые при вызове функции должны передаваться только по имени.
Ниже приводится несколько правил в языке Python, которым вам необходимо следовать, если у вас появится потребность использовать специальные режимы сопоставления аргументов:

— В вызове функции аргументы должны указываться в следующем порядке: любые позиционные аргументы (значения), за которыми могут следовать
любые именованные аргументы (имя=значение) и аргументы в форме *итерируемый объект, за которыми могут следовать аргументы в форме **словарь.

— В заголовке функции аргументы должны указываться в следующем порядке: любые обычные аргументы (name), за которыми могут следовать аргументы со значениями по умолчанию (name=value), за которыми следуют аргументы в форме *name (или * в 3.0), если имеются, за которыми могут следовать любые имена или пары name=value аргументов, которые передаются только по имени (в 3.0), за которыми могут следовать аргументы в форме **имя.
Исполнится ли код выше или вызовет ошибку?
Anonymous Quiz
54%
Исполнится
46%
Выпадет в ошибку
В Python 3. Х обобщены правила упорядочения в заголовках функций, чтобы позволить указывать аргументы с передачей только по ключевым словам — аргументы, которые должны передаваться только по ключевому слову и никогда не будут заполняться позиционными аргументами. Они полезны, когда необходима функция, которая и обрабатывает любое количество аргументов (возможно, конфигурационные параметры).

Синтаксически аргументы с передачей только по ключевым словам записываются как именованные аргументы, которые могут появляться после конструкции *аргументы в списке аргументов. Значения для таких аргументов должны передаваться в вызове с использованием синтаксиса ключевых аргументов. В задаче выше аргумент а может передаваться по имени или по позиции, b собирает добавочные позиционные аргументы, а с должно передаваться только по ключевому слову.
Исполнится ли код выше без ошибки?
Anonymous Quiz
61%
Да
39%
Нет
Мы также можем применять в списке аргументов сам по себе символ *, указывая на то, что функция не принимает список аргументов переменной длины, но по-прежнему ожидает передачи всех аргументов, следующих за символом *, по ключевому слову. В показанной в задаче функции kwonly() аргумент а может передаваться по позиции или по имени, но аргументы b и с обязаны передаваться по ключевому слову, и никакие добавочные позиционные аргументы не разрешены.
Какой тип данных не поддерживает прямое сравнение (a > b)?
Anonymous Quiz
10%
Строки
42%
Словари
3%
Числа
45%
Все вышеперечисленные типы поддерживают прямое сравнение
— Сравнение строк основывается на их лексикографическом порядке, который определяется значениемUnicode каждого символа в строке ('apple' > 'banana' # False

— Сравнение чисел происходит по правилам математики (3 < 4 # True)

— А вот словари сравниваются (только оператором ==) , если у них одинаковые ключи. Операторами > < их не сравнить, получим ошибку:

TypeError: '>' not supported between instances of 'dict' and 'dict'
Что выведет код?
Anonymous Quiz
17%
[5]
38%
[1, 3, 4, 5]
9%
[3]
36%
Error
Функция foo() ищет пересечение произвольного числа последовательностей (одной и более), используя форму сопоставления с переменным количеством аргументов *аргументы для сбора всех переданных аргументов. Поскольку аргументы поступают в виде кортежа, мы можем обрабатывать произвольное число аргументов с целью сбора элементов, имеющихся во всех операндах:

def foo(*args):
res = []
for x in args[0]: # Просмотр последовательности
if x in res: continue # Пропуск дубликатов
for other in args[1:]: # Для всех остальных аргументов
if x not in other: break # Элемент находится во всех последовательностях?
else: # Нет: выйти из цикла
res.append(x) # Да: добавить в конец
return res

lst = (1, 3, 4, 3, 5)
print(foo(lst)) # [5]


В данном случае все сводится к блоку else (выходу из цикла) и добавлению последнего элемента в res.

Если подавать функции, например, два кортежа, результат будет другим:

lst = ((1, 3, 4), (3, 4, 5))
print(foo(lst)) # [(3, 4, 5)]
Что выведет код выше?
Anonymous Quiz
13%
1, 2, 3
4%
1, (1, 1)
74%
1, (2, 3)
9%
Error
Код выводит 1 (2, 3), поскольку 1 передается а и *pargs собирает оставшиеся позиционные аргументы в новый объект кортежа. Мы можем проходить по кортежу с добавочными позиционными аргументами посредством любого итерационного инструмента (например, for arg in pargs: . . .).
Что выведет код выше?
Anonymous Quiz
66%
1 {'c': 3, 'b': 2}
16%
1 (3, 2)
7%
1 [3, 2]
11%
Error
Код выводит 1 { ’ Ь ’ : 2, ’ с ’ : 3}, т.к. 1 передается а по имени и **kargs собирает оставшиеся ключевые аргументы в словарь. Мы можем проходить по ключам словаря с добавочными ключевыми аргументами с помощью любого итерационного инструмента (скажем, for key in kargs: . . .). Обратите внимание, что порядок следования ключей в словаре может варьироваться в зависимости от версии Python и других аспектов.