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
加入频道
Обратите внимание на опережающую ссылку в коде:

f2(x)


Вполне нормально вызывать функцию, определенную после функции, где она вызывается, при условии, что второй оператор def выполняется перед фактическим вызовом первой функции. Код внутри def никогда не выполняется до тех пор, пока функция не будет действительно вызвана.
Что выведет код?
Anonymous Quiz
19%
16
28%
4
5%
8
48%
Error
Если выражение lambda и оператор def, определяемый внутри функции, вкладывается в цикл, а вложенная функция ссылается на переменную из объемлющей области видимости, которая изменяется этим циклом, то все функции, генерируемые внутри цикла, будут иметь одно и то же значение — значение ссылаемой переменной на последней итерации цикла.

Лямбда-функция, несмотря на цикл for, будет запоминать последнее значение i, то есть 5:
def makeActions():
acts = []

for i in range(5):
acts.append(lambda x: i ** x) # i в таких условиях всегда равен 4

return acts

Чтобы добиться задуманного, нужно передать текущее значение переменной из объемлющей области видимости посредством стандартного значения:

acts.append(lambda x, i=i: i ** x)
Что выведет код?
Anonymous Quiz
12%
Spam
82%
Ni
4%
SpamNi
2%
Error
Выведется 'Ni', поскольку объявление global заставляет переменную, присваиваемую внутри функции, ссылаться на переменную в объемлющей глобальной области видимости.
Выводится 'Ni' в одной строке, затем 'Spam' в другой, потому что print() во вложенной функции находит имя в локальной области видимости объемлющей функции, а отображение в конце находит переменную в глобальной области видимости.
Что выведет код?
Anonymous Quiz
23%
Ni
68%
Spam
4%
Ничего
4%
Error
Выводится 'Spam', поскольку оператор nonlocal означает, что присваивание X внутри вложенной функции изменяет X в локальной области видимости объемлющей функции. Без этого оператора присваивания классифицировало X бы как локальную переменную во вложенной функции, делая ее другой переменной; тогда код выводил бы 'Ni'.
Что выведет код выше?
Anonymous Quiz
39%
1 ['spam', 3]
23%
2 ['spam', 3]
33%
1 [2, 3]
5%
Error
Вот что означает отсутствие совмещения имен — присваивание имени аргумента внутри функции не изменяет волшебным образом переменную. Имена аргументов могут изначально разделять передаваемые объекты (по существу они являются указателями на эти объекты), но только временно, когда функция вызывается впервые. После повторения присваивания аргумента связь разрывается.

Так происходит в случае присваивания самим именам аргументов. Когда аргументам передаются изменяемые объекты, подобные спискам и словарям, мы должны осознавать, что изменения на месте таких объектов могут продолжить свое существования после завершения функции, а потому оказывать воздействие на вызывающий код.

def changer(a, b): # Аргументам присваиваются ссылки на объекты
a = 2 # Изменяет только значение локального имени
b[0] = 'spam' # Изменяет разделяемый объект на месте


X = 1
L = [2, 3]

changer(X, L) # Передача изменяемого и неизменяемого объектов
print(X, L) # X остается прежним, L отличается
Что выведет код?
Anonymous Quiz
74%
1
25%
2
0%
a
1%
Error
X = 1
a = X # Разделяют тот же самый объект в памяти
a = 2 # Переустанавливает только a, значением X по-прежнему будет 1
print(X)