Найти - Пользователи
Полная версия: Помогите пожалуста решить задачу/функц без if
Начало » Python для новичков » Помогите пожалуста решить задачу/функц без if
1 2 3
serhii123
Как можна написать функцию месяц(), который я принимаю в качестве аргумента число от 1 до 12, а на выходе возвращает первые три буквы месяца, соответствующего числу.
Например, месяц(2) возвращает “фев”
Как можно решить задаче, НЕ использовать условные операторы if для перечисления месяцев.
Iskatel
http://python.su/forum/33/
ZerG
Задолбал спамить
Vigi
 def moth(digit):
    moths = {1: 'Янв',
             2: 'Фев',
             3: 'Мрт',
             4: 'Апр',
             5: 'Май',
             6: 'Июн',
             7: 'Июл',
             8: 'Авг',
             9: 'Снт',
            10: 'Окт',
            11: 'Нбр',
            12: 'Дкб'
             }
    return moths[digit]
print(moth(int(input())))
py.user.next
  
>>> def get_month(n):
...     months = ('Янв', 'Фев', 'Мар',
...               'Апр', 'Май', 'Июн',
...               'Июл', 'Авг', 'Сен',
...               'Окт', 'Ноя', 'Дек')
...     return months[n - 1]
... 
>>> get_month(1)
'Янв'
>>> get_month(12)
'Дек'
>>>
4kpt_IV
Проще

 #
find = lambda pos: "ЯнвФевМарАпрМайИюнИюлАвгСенОктНояДек"[(pos - 1) * 3:pos * 3]
print(find(2))
ZerG
Гггггг 4kpt_IV ЖЖОТЕ СУДАРЬ!
py.user.next
4kpt_IV
Проще
А полные названия? Необязательно полные, просто произвольной длины.
4kpt_IV
serhii123
Как можна написать функцию месяц(), который я принимаю в качестве аргумента число от 1 до 12, а на выходе возвращает первые три буквы месяца, соответствующего числу.
py.user.next
Есть, короче, такое понятие “сила предусловия и постусловия”. Предусловие должно быть максимально ослаблено, тогда как постусловие должно быть максимально усилено. От этого зависит “применимость функции” - число задач, для решения которых эту функцию можно применить.

Вот, например, возьмём функцию 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
Как можно написать функцию имя(), которая принимает в качестве аргумента число от начала до конца, а на выходе возвращает выбранную строку, соответствующую числу.

И вот уже после такого ослабления можно писать функцию. Тут уже становится видно, что массив строк тоже надо подавать. И так у тебя функция по выбору месяца из списка месяцев уже может решать задачу по выбору пользователя из списка пользователей или по выбору машин из списка машин. Функцию ты пишешь один раз, а применяешь её потом для решения множества задач, даже тех, для которых она вообще не предназначалась.


Допустим, он пишет, что-то для нахождения месяцев, нужно понимать, что три буквы, про которые он пишет, есть не везде, язык - то же самое, может измениться и там вообще все длины поменяются. Поэтому нельзя фиксироваться на этой части условия, так как функция будет неприменима при мельчайшем изменении задачи. То же самое с индексацией - где-то она с единицы, а где-то не с единицы, а с нуля, тоже привязываться нельзя.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB