Python: задачки и вопросы
7.52K subscribers
1.26K photos
1 video
1 file
116 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Метод 𝚛𝚎𝚙𝚕𝚊𝚌𝚎() возвращает новую строку и не изменяет исходную. Результат вызова метода не сохраняется в переменную, поэтому переменная 𝚜𝚎𝚝𝚞𝚙 остается неизменной.

Пошагово:
🔘 Переменной 𝚜𝚎𝚝𝚞𝚙 присваивается строка «Утка входит в бар...»
🔘 Вызывается метод 𝚜𝚎𝚝𝚞𝚙.𝚛𝚎𝚙𝚕𝚊𝚌𝚎('Утка', 'Сурок'), который создает и возвращает новую строку «Сурок входит в бар...»
🔘 Результат метода не присваивается обратно в переменную 𝚜𝚎𝚝𝚞𝚙
🔘 При выводе 𝚙𝚛𝚒𝚗𝚝(𝚜𝚎𝚝𝚞𝚙) выводится исходная строка, которая не изменилась

Из документации Python:

𝚜𝚝𝚛.𝚛𝚎𝚙𝚕𝚊𝚌𝚎(𝚘𝚕𝚍, 𝚗𝚎𝚠[, 𝚌𝚘𝚞𝚗𝚝])
«Возвращает копию строки со всеми вхождениями подстроки 𝚘𝚕𝚍, замененными на 𝚗𝚎𝚠. Если указан необязательный аргумент 𝚌𝚘𝚞𝚗𝚝, заменяются только первые 𝚌𝚘𝚞𝚗𝚝 вхождений».

Метод возвращает новую строку, а не изменяет существующую, поскольку строки в Python являются неизменяемыми (𝚒𝚖𝚖𝚞𝚝𝚊𝚋𝚕𝚎) объектами. Для сохранения результата замены необходимо присвоить возвращаемое значение переменной:

𝚜𝚎𝚝𝚞𝚙 = 𝚜𝚎𝚝𝚞𝚙.𝚛𝚎𝚙𝚕𝚊𝚌𝚎('Утка', 'Сурок')
𝚙𝚛𝚒𝚗𝚝(𝚜𝚎𝚝𝚞𝚙) # Сурок входит в бар...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🕊1
Метод умножения списка создаёт несколько ссылок на один и тот же внутренний список, а не независимые копии, поэтому все строки в 𝚖𝚊𝚝𝚛𝚒𝚡 указывают на один объект. Изменение элемента 𝚖𝚊𝚝𝚛𝚒𝚡 фактически меняет общий вложенный список, и та же единица появляется в каждой строке. Проверить это можно по 𝚒𝚍: [𝚒𝚍(𝚛𝚘𝚠) 𝚏𝚘𝚛 𝚛𝚘𝚠 𝚒𝚗 𝚖𝚊𝚝𝚛𝚒𝚡] даёт одинаковые значения.

Как правильно: создавать каждую строку заново, например с генератором списков:

𝚖𝚊𝚝𝚛𝚒𝚡 = [[𝟶 𝚏𝚘𝚛 _ 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟹)] 𝚏𝚘𝚛 _ 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟹)]

Теперь каждая строка независима, и изменение одной не затрагивает остальные.

Для копирования уже созданной матрицы используйте копирование по элементам, например 𝚕𝚒𝚜𝚝(𝚖𝚊𝚙(𝚕𝚒𝚜𝚝, 𝚖𝚊𝚝𝚛𝚒𝚡)) или 𝚍𝚎𝚎𝚙𝚌𝚘𝚙𝚢 из модуля 𝚌𝚘𝚙𝚢, если внутри есть вложенные структуры.
👍21
Что выведет код? Перевод на новую строку и пробелы не учитываем, вопрос про списки.
Anonymous Quiz
57%
[1] [1, 1]
37%
[1] [1]
3%
[ ] [ ]
4%
[ ] [1]
1
В Python значения аргументов по умолчанию вычисляются один раз — при определении функции, а не при каждом вызове. Если использовать изменяемый объект (например, список) как аргумент по умолчанию, все вызовы функции без передачи значения будут работать с одним и тем же объектом.

В этом примере список 𝚡 создаётся при определении 𝚏𝚞𝚗, и каждый вызов 𝚏𝚞𝚗() добавляет в него единицу. Поэтому после первого вызова выводится [𝟷], а после второго уже [𝟷, 𝟷]. Такой эффект ловит многих: кажется, будто 𝚡 — новый пустой список при каждом вызове, но на деле это один и тот же, постоянно растущий список.​

Чтобы избежать такого поведения, используйте 𝙽𝚘𝚗𝚎 как значение по умолчанию — тогда новый список создаётся при каждом вызове:

𝚍𝚎𝚏 𝚏𝚞𝚗(𝚡=𝙽𝚘𝚗𝚎):
  𝚒𝚏 𝚡 𝚒𝚜 𝙽𝚘𝚗𝚎:
    𝚡 = [ ]
  𝚡.𝚊𝚙𝚙𝚎𝚗𝚍(𝟷)
  𝚛𝚎𝚝𝚞𝚛𝚗 𝚡

Теперь каждый раз будет новый список: [𝟷] — поведение ожидаемое и безопасное для задач, где нужны независимые коллекции.​

Эта особенность касается любых изменяемых типов: списков, словарей и даже пользовательских объектов. Полезно обратить на это внимание при проектировании функций‑инструментов и обработчиков.
4
Что выведет код в Python 3?
Anonymous Quiz
52%
['a', 'b', 'c'], 2
9%
['a', 'b', 'c'], 3
27%
['b', 'c'], 2
13%
Error
2
Методы 𝚔𝚎𝚢𝚜(), 𝚟𝚊𝚕𝚞𝚎𝚜(), 𝚒𝚝𝚎𝚖𝚜() возвращают не списки, а динамические представления (views) словаря, которые автоматически обновляются при изменениях в оригинальном словаре.

Разбор по шагам:
🔘𝚍 = {'a': 10, 'b': 20} создаёт словарь с двумя парами.
🔘𝚔𝚎𝚢𝚜 = 𝚍.𝚔𝚎𝚢𝚜() возвращает 𝚍𝚒𝚌𝚝_𝚔𝚎𝚢𝚜(['a', 'b']) — представление ключей, отражающее текущее состояние 𝚍.
🔘𝚍['c'] = 30 добавляет новую пару; представление 𝚔𝚎𝚢𝚜 мгновенно видит три ключа, поэтому 𝚕𝚒𝚜𝚝(𝚔𝚎𝚢𝚜) даёт ['a', 'b', 'c'].
🔘𝚍.𝚙𝚘𝚙('a') удаляет ключ 'a'; представление снова обновляется, и теперь 𝚕𝚎𝚗(𝚔𝚎𝚢𝚜) возвращает 2 (остались 'b' и 'c').

Views — это не копии, а «живые» ссылки на словарь, экономящие память и время. В отличие от Python 2 (где 𝚍𝚒𝚌𝚝.𝚔𝚎𝚢𝚜() возвращал список-копию), в Python 3 представления всегда динамичны. Если бы код использовал 𝚕𝚒𝚜𝚝(𝚍.𝚔𝚎𝚢𝚜()) в начале, то 𝚘𝚕𝚍_𝚔𝚎𝚢𝚜 = 𝚕𝚒𝚜𝚝(𝚍.𝚔𝚎𝚢𝚜()), добавление 'c' не повлияло бы на 𝚘𝚕𝚍_𝚔𝚎𝚢𝚜 — оно осталось бы ['a', 'b'].
Please open Telegram to view this post
VIEW IN TELEGRAM
1