🐍 Python  ·  20 вопросов  ·  ~50 мин  ·  ⏱ Таймер 50:00  ·  Средний  · 

Области видимости и замыкания

Разбирает локальные и глобальные имена, nonlocal, время связывания и состояние замыкания. Здесь проверяется перенос знания на новый код: вопросы распределены между шкалами «Локальные имена», «global и nonlocal», «Замыкания» и «Позднее связывание». Все задания рассчитаны на CPython 3.12; отличия других реализаций или версий учитываются только там, где это прямо оговорено.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Версия: CPython 3.12. Выберите один ответ из четырёх. На 20 вопросов отведено не меньше 40 минут; код лучше читать построчно. После завершения вы увидите общий процент, четыре тематические шкалы и объяснение каждого ответа.
Вопрос 1 из 20
Внутри функции выполняется `x = x + 1` при существующем глобальном `x`. Какая ошибка возникнет при вызове и почему чтение не дойдёт до глобального имени?
Python
x = 10
def f():
    x = x + 1
    return x

print(f())
Вопрос 2 из 20
Два вызова изменяют захваченное имя через `nonlocal`. Какие значения будут напечатаны?
Python
def make():
    x = 1
    def inc():
        nonlocal x
        x += 2
        return x
    return inc

f = make()
print(f(), f())
Вопрос 3 из 20
Проследите три вызова замыкания `counter()`: какие значения будут напечатаны и где хранится изменяемое состояние?
Python
def counter():
    value = 0
    def next_value():
        nonlocal value
        value += 1
        return value
    return next_value

a = counter()
b = counter()
print(a(), a(), b())
Вопрос 4 из 20
Три функции созданы в цикле и поздно читают `i`. Какой список результатов получится?
Python
funcs = []
for i in range(3):
    funcs.append(lambda: i)
print([f() for f in funcs])
Вопрос 5 из 20
Локального имени нет, но оно есть во внешней функции. Какое значение выберет LEGB и напечатает код?
Python
x = "global"
def outer():
    x = "enclosing"
    def inner():
        return x
    return inner()
print(outer())
Вопрос 6 из 20
Функция дважды изменяет модульное имя через `global`. Какое значение будет напечатано?
Python
count = 0
def add():
    global count
    count += 1
add()
add()
print(count)
Вопрос 7 из 20
Внешняя функция уже завершилась после создания замыкания. Какое значение всё равно вернёт вызов?
Python
def make_power(exp):
    def power(value):
        return value ** exp
    return power

square = make_power(2)
print(square(5))
Вопрос 8 из 20
Лямбды в цикле видят последнее значение `i`. Какое исправление зафиксирует значение при создании каждой функции?
Вопрос 9 из 20
Несколько функций скрыто меняют состояние модуля через `global`. Какое проектное решение уменьшит связанность?
Вопрос 10 из 20
Что выведет затенение встроенного имени?
Python
len = 5
values = [1, 2, 3]
print(len(values))
Вопрос 11 из 20
В граничном сценарии `nonlocal name` не находит `name` ни в одной внешней функции. Что произойдёт при компиляции?
Вопрос 12 из 20
Какой результат даст вложенное изменение списка без nonlocal?
Python
def make():
    items = []
    def add(value):
        items.append(value)
        return items
    return add

f = make()
print(f(1), f(2))
Вопрос 13 из 20
Что выведет код, если `reset` перепривязывает имя без `nonlocal`?
Python
def make():
    items = []
    def reset():
        items = []
        return items
    reset()
    return items
print(make())
Вопрос 14 из 20
Что напечатает код с изменением глобального объекта?
Python
settings = {"debug": False}
def enable():
    settings["debug"] = True
enable()
print(settings)
Вопрос 15 из 20
Как узнать, какие значения захвачены замыканием функции в отладочном эксперименте?
Вопрос 16 из 20
Каков результат позднего связывания после изменения внешнего имени?
Python
rate = 2
def calculate(x):
    return x * rate
rate = 3
print(calculate(4))
Вопрос 17 из 20
Чем замыкание-счётчик отличается от функции с локальной переменной `value = 0` внутри каждого вызова?
Вопрос 18 из 20
Что выведет функция с одноимёнными параметрами?
Python
x = 100
def f(x):
    def g(x):
        return x + 1
    return g(x * 2)
print(f(3), x)
Вопрос 19 из 20
Почему фиксация значения через `lambda i=i` работает, хотя выглядит как одинаковое имя?
Вопрос 20 из 20
Что произойдёт после удаления глобального имени?
Python
value = 5
def f():
    return value
del value
print(f())

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу