pop как стек и безопасный pop в Python

pop как стек и безопасный pop в Python

@python_quiz

Разберем этот квиз

Код из квиза — компактный, но иллюстрирует две важные вещи: список используется как стек (LIFO), и тернарный оператор применяется для безопасного извлечения элемента, чтобы не получить IndexError.

python

Пошаговый разбор

  1. Инициализация и заполнение:

- s = []
- цикл добавляет 1, 2, 3 → s == [1, 2, 3]

  1. Первая печать: print(s.pop(), s.pop())

- s.pop() извлекает последний элемент (LIFO). Первый вызов pop даёт 3.
- Второй вызов pop даёт 2.
- На экран выводится: 3 2

  1. Вторая печать: print(s.pop() if s else None, s.pop() if s else None)

- Здесь используется тернарное выражение: если s непустой — вызываем s.pop(), иначе — возвращаем None.
- Перед этой строкой s == [1] (после двух первых pop).
- Первый тернарный оператор видит s непустой → выполняется s.pop() и возвращает 1.
- Теперь s пустой.
- Второй тернарный оператор видит пустой s → возвращает None.
- На экран выводится: 1 None

  1. Итоговый вывод программы (две строки):
text

Обратите внимание: порядок вычисления аргументов функции print в CPython — слева направо, поэтому pop выполняются в ожидаемой последовательности.

Разбор вариантов ответов (кратко)

  • "1 2\n3 None" — не совпадает: первый вывод здесь перепутан (должен быть 3 2).
  • "3 2\n1 None" — совпадает с выводом программы.
  • "3 2\nNone None" — неверно: второе выражение вернёт 1, а не None (есть один элемент).
  • "2 3\n1 None" — неверно: порядок первых двух чисел перепутан.

Альтернативы и рекомендации

  • Чтобы избежать проверки "if s" каждый раз, можно использовать try/except:
python
  • Для очередей/стеков с высокими требованиями к производительности и явными операциями слева/справа удобно использовать deque:
python
  • Важно: list.pop() не принимает значение по умолчанию (в отличие от dict.pop). Поэтому паттерн s.pop() if s else None — распространённый способ безопасного извлечения из списка.

Вывод

Код демонстрирует LIFO-поведение списка при append/pop и корректное применение тернарного оператора для предотвращения IndexError. Итоговый вывод — две строки с результатами операций: первая содержит элементы, снятые со стека, в порядке LIFO, вторая — результат безопасных извлечений с возвращением None для пустого стека.

Report Page