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

Пошаговый разбор
- Инициализация и заполнение:
- s = []
- цикл добавляет 1, 2, 3 → s == [1, 2, 3]
- Первая печать: print(s.pop(), s.pop())
- s.pop() извлекает последний элемент (LIFO). Первый вызов pop даёт 3.
- Второй вызов pop даёт 2.
- На экран выводится: 3 2
- Вторая печать: 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
- Итоговый вывод программы (две строки):

Обратите внимание: порядок вычисления аргументов функции 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:

- Для очередей/стеков с высокими требованиями к производительности и явными операциями слева/справа удобно использовать deque:

- Важно: list.pop() не принимает значение по умолчанию (в отличие от dict.pop). Поэтому паттерн s.pop() if s else None — распространённый способ безопасного извлечения из списка.
Вывод
Код демонстрирует LIFO-поведение списка при append/pop и корректное применение тернарного оператора для предотвращения IndexError. Итоговый вывод — две строки с результатами операций: первая содержит элементы, снятые со стека, в порядке LIFO, вторая — результат безопасных извлечений с возвращением None для пустого стека.