X = 1
a = X # Разделяют тот же самый объект в памяти
a = 2 # Переустанавливает только a, значением X по-прежнему будет 1
print(X)
func(**словарь)
передает все пары ключ / значение в словаре как отдельные ключевые аргументы. Неважно, в каком порядке в
dct
указаны элементы: функция распределит их поименно. Такой тип сопоставления аргументов называется «ключевое». foo(first = 1, second = 'Текст') # как интерпретатор видит аргументы
Существует также позиционное сопоставление аргументов
foo(arg1, arg2)
, где аргументы сопоставляются по их положению. Чтобы оно заработало со словарем dct
, придется передать их так:foo(dct['first'], dct['second'])
Что выведет код выше?
Anonymous Quiz
12%
<__main__.MyClass object at 0x...>
16%
<class 'int'>, <class 'list'>
68%
<class 'tuple'>
4%
Error
Инструкция return может возвращать объект любого типа, поэтому с ее помощью можно возвращать сразу несколько значений, упаковав их в кортеж или в коллекцию любого другого типа.
Выглядит так, как будто функция возвращает два значения, но на самом деле – это единственный кортеж, состоящий из двух элементов, а необязательные окружающие скобки просто опущены. После возврата из функции можно использовать операцию присваивания кортежа, чтобы извлечь отдельные элементы. Переменные X и L изменятся после вызова функции, но только потому, что мы явно это предусмотрели.
def multiple(x, y):
x = 2 # Изменяется только локальное имя
y = [3, 4]
return x, y # Новые значения возвращаются в виде кортежа
X = 1
L = [1, 2]
Z = multiple(X, L) # Результаты присваиваются именам в вызывающей программе
print(Z) # (2, [3, 4]) — это кортеж
Выглядит так, как будто функция возвращает два значения, но на самом деле – это единственный кортеж, состоящий из двух элементов, а необязательные окружающие скобки просто опущены. После возврата из функции можно использовать операцию присваивания кортежа, чтобы извлечь отдельные элементы. Переменные X и L изменятся после вызова функции, но только потому, что мы явно это предусмотрели.
Чем отличается сопоставление аргументов функции func(*arg_obj) от func(**arg_obj)?
Anonymous Quiz
11%
* передает словарь, ** — любой итерируемый объект
80%
* передает любой итерируемый объект, ** — словарь
5%
* позволяет сгенерировать значения аргументов, ** — подставляет везде None
4%
Ничем
def func(*имя) # *имя собирает любые добавочные не прошедшие сопоставление аргументы в кортеж, а **имя — в словарь.
В версии Python 3.0 и выше любые обычные аргументы или аргументы со значениями по умолчанию, следующие за формой
*имя
или за единственным символом *
, являются именованными аргументами, которые при вызове функции должны передаваться только по имени.В каком порядке в функции указываются аргументы?
Anonymous Quiz
72%
Позиционные, ключевые, *итерируемый_объект, **словарь
8%
Позиционные, ключевые, **словарь, *итерируемый_объект
9%
Ключевые, позиционные, **словарь, *итерируемый_объект
11%
Порядок неважен
Ниже приводится несколько правил в языке Python, которым вам необходимо следовать, если у вас появится потребность использовать специальные режимы сопоставления аргументов:
— В вызове функции аргументы должны указываться в следующем порядке: любые позиционные аргументы (значения), за которыми могут следовать
любые именованные аргументы (имя=значение) и аргументы в форме *итерируемый объект, за которыми могут следовать аргументы в форме **словарь.
— В заголовке функции аргументы должны указываться в следующем порядке: любые обычные аргументы (name), за которыми могут следовать аргументы со значениями по умолчанию (name=value), за которыми следуют аргументы в форме *name (или * в 3.0), если имеются, за которыми могут следовать любые имена или пары name=value аргументов, которые передаются только по имени (в 3.0), за которыми могут следовать аргументы в форме **имя.
— В вызове функции аргументы должны указываться в следующем порядке: любые позиционные аргументы (значения), за которыми могут следовать
любые именованные аргументы (имя=значение) и аргументы в форме *итерируемый объект, за которыми могут следовать аргументы в форме **словарь.
— В заголовке функции аргументы должны указываться в следующем порядке: любые обычные аргументы (name), за которыми могут следовать аргументы со значениями по умолчанию (name=value), за которыми следуют аргументы в форме *name (или * в 3.0), если имеются, за которыми могут следовать любые имена или пары name=value аргументов, которые передаются только по имени (в 3.0), за которыми могут следовать аргументы в форме **имя.
В Python 3. Х обобщены правила упорядочения в заголовках функций, чтобы позволить указывать аргументы с передачей только по ключевым словам — аргументы, которые должны передаваться только по ключевому слову и никогда не будут заполняться позиционными аргументами. Они полезны, когда необходима функция, которая и обрабатывает любое количество аргументов (возможно, конфигурационные параметры).
Синтаксически аргументы с передачей только по ключевым словам записываются как именованные аргументы, которые могут появляться после конструкции
Синтаксически аргументы с передачей только по ключевым словам записываются как именованные аргументы, которые могут появляться после конструкции
*аргументы
в списке аргументов. Значения для таких аргументов должны передаваться в вызове с использованием синтаксиса ключевых аргументов. В задаче выше аргумент а
может передаваться по имени или по позиции, b
собирает добавочные позиционные аргументы, а с
должно передаваться только по ключевому слову.Мы также можем применять в списке аргументов сам по себе символ
*
, указывая на то, что функция не принимает список аргументов переменной длины, но по-прежнему ожидает передачи всех аргументов, следующих за символом *
, по ключевому слову. В показанной в задаче функции kwonly()
аргумент а
может передаваться по позиции или по имени, но аргументы b
и с
обязаны передаваться по ключевому слову, и никакие добавочные позиционные аргументы не разрешены.Какой тип данных не поддерживает прямое сравнение (a > b)?
Anonymous Quiz
10%
Строки
42%
Словари
3%
Числа
45%
Все вышеперечисленные типы поддерживают прямое сравнение
— Сравнение строк основывается на их лексикографическом порядке, который определяется значениемUnicode каждого символа в строке ('apple' > 'banana' # False
— Сравнение чисел происходит по правилам математики (3 < 4 # True)
— А вот словари сравниваются (только оператором ==) , если у них одинаковые ключи. Операторами
— Сравнение чисел происходит по правилам математики (3 < 4 # True)
— А вот словари сравниваются (только оператором ==) , если у них одинаковые ключи. Операторами
> <
их не сравнить, получим ошибку:TypeError: '>' not supported between instances of 'dict' and 'dict'