Есть, короче, такое понятие “сила предусловия и постусловия”. Предусловие должно быть максимально ослаблено, тогда как постусловие должно быть максимально усилено. От этого зависит “применимость функции” - число задач, для решения которых эту функцию можно применить.
Вот, например, возьмём функцию zip()
>>> list(zip('abc', 'def'))
[('a', 'd'), ('b', 'e'), ('c', 'f')]
>>> list(zip('abc', 'def', 'ghi'))
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
>>> list(zip('abc', 'def', 'ghi', 'jkl'))
[('a', 'd', 'g', 'j'), ('b', 'e', 'h', 'k'), ('c', 'f', 'i', 'l')]
>>>
Её обычно применяют для спаривания элементов (чаще всего). Если бы она была с сильным предусловием, то её описание звучало бы как “функция для генерации пар элементов из двух последовательностей”. Вроде, всё правильно и на практике она так и применяется. Но когда нам нужно генерировать не пары, а тройки элементов, то такую функцию с сильным предусловием (фиксацией именно на парах) мы не можем применить и должны искать другую функцию для страивания элементов.
Но благодаря тому, что у функции zip() слабое предусловие “функция для генерации энок элементов из любого числа последовательностей”, мы можем применить функцию zip() и к двум последовательностям, и к трём, и к четырём и вообще к любому числу, генеря любые энки элементов. Это высокая применимость функции - функция решает множество задач, а не одну.
Чем больше у тебя высоко применимых функций, тем меньше тебе нужно писать функций потом, потому что при возникновении задачи она может быть решена какой-то функцией, которая вообще для неё не писалась.
Поэтому вот эта формулировка
serhii123
Как можна написать функцию месяц(), который я принимаю в качестве аргумента число от 1 до 12, а на выходе возвращает первые три буквы месяца, соответствующего числу.
хоть и является конкретной (сильным предусловием), но это не значит, что надо писать такую же функцию (с сильным предусловием). Надо написать функцию, которая решит и эту задачу, и множество других задач. И для этого надо в этой формулировке ослабить всю конкретику.
Было так
serhii123
Как можна написать функцию месяц(), который я принимаю в качестве аргумента число от 1 до 12, а на выходе возвращает первые три буквы месяца, соответствующего числу.
А стало так
serhii123
Как можно написать функцию имя(), которая принимает в качестве аргумента число от начала до конца, а на выходе возвращает выбранную строку, соответствующую числу.
И вот уже после такого ослабления можно писать функцию. Тут уже становится видно, что массив строк тоже надо подавать. И так у тебя функция по выбору месяца из списка месяцев уже может решать задачу по выбору пользователя из списка пользователей или по выбору машин из списка машин. Функцию ты пишешь один раз, а применяешь её потом для решения множества задач, даже тех, для которых она вообще не предназначалась.
Допустим, он пишет, что-то для нахождения месяцев, нужно понимать, что три буквы, про которые он пишет, есть не везде, язык - то же самое, может измениться и там вообще все длины поменяются. Поэтому нельзя фиксироваться на этой части условия, так как функция будет неприменима при мельчайшем изменении задачи. То же самое с индексацией - где-то она с единицы, а где-то не с единицы, а с нуля, тоже привязываться нельзя.