[ Сборник задач ] Тема 9. Условные выражения

Условные операторы в языках программирования (в том числе и в Python) необходимы в ситуациях, когда перед программой поставлена проблема выбора действия в зависимости от состояния переменных. Конструкцию if-elif-else еще называют оператором ветвления. Синтаксис инструкции изображают в следующем виде:
Синтаксис

if <условие 1>: 
    <выражение 1> 
elif <условие 2>: 
    <выражение 2> 

… 

elif <условие n>: 
    <выражение n> 
else: 
    <выражение n + 1> 

Структура, как видно, такова:

  1. Всегда присутствует инструкция if;
  2. Ноль, одно или несколько выражений elif;
  3. Конечный оператор else не обязателен, но может использоваться, если все вышестоящие не сработали.

Для успешного решения заданий и ответов на вопросы следует понимать не только текущую тему, но и предыдущие (словари, списки, строки и т.д.).

Задача 1. Базовый уровень

Условие

Николай написал функцию is_alive(health), которая проверяет здоровье персонажа в игре. 
Если оно равно или меньше нуля, то функция возвращает False, в противном случае True.
К сожалению, функция не работает, так как ученик допустил в ней ряд ошибок. 
Исправьте их и проверьте работоспособность программы (в качестве аргумента всегда передается число). 

def is_alive(health):
    if:
        health < 0
        False
    else:
        return true

В функции Николая есть ряд ошибок:
— True – пишется с большой буквы
— проверка здоровья должна писаться после выражения if до двоеточия и включать в себя нулевое значение
— в теле оператора if значение False должно возвращаться, а не просто объявляться.
Пример – IDE

def is_alive(health):
    if health <= 0:
        return False
    else:
        return True

# Тесты 
print(is_alive(122))
print(is_alive(0))
print(is_alive(-1))

Результат выполнения

True
False
False

Задача 2. Базовый уровень

Условие

Составьте функцию season_events(number_of_month), которая принимает номер месяца вашего рождения и в зависимости от сезона печатает на выходе следующее:
«Вы родились в <НАЗВАНИЕ_МЕСЯЦА>. <ОПИСАНИЕ_СОБЫТИЙ>».

В качестве ОПИСАНИЯ_СОБЫТИЙ будет характеристика сезона: 
- для зимы «За окном падал белый снег»,
- для весны «Птицы пели прекрасные песни»,
- для лета «Солнце светило ярче чем когда-либо»,
- для осени «Урожай был невероятным».

Важно учесть, что пользователи могут ввести любой тип данных в качестве аргумента (не попадитесь на этом и предупредите о том, что «Требуется ввести реальный номер месяца»).

Для выведения на печать каждого месяца удобно воспользоваться словарем. Можно, конечно, использовать if / else конструкцию, но в этом случае она неразумно увеличивает объем кода. А вот для четырех сезонов вполне годится условное выражение.
Пример — IDE

 months = {
        1: 'Январе',
        2: 'Феврале',
        3: 'Марте',
        4: 'Апреле',
        5: 'Мае',
        6: 'Июне',
        7: 'Июле',
        8: 'Августе',
        9: 'Сентябре',
        10: 'Октябре',
        11: 'Ноябре',
        12: 'Декабре'
    }


def season_events(number_of_month):
   if not isinstance(number_of_month, int) and 1 <= number_of_month <= 12:
        print('Требуется ввести реальный номер месяца')
	      return
   if number_of_month in range(3, 6):
    print(f'Вы родились в {months[number_of_month]}. Птицы пели прекрасные песни')
   elif number_of_month in range(6, 9):
           print(f'Вы родились в {months[number_of_month]}. Солнце светило ярче чем когда-либо')
   elif number_of_month in range(9, 12):
     print(f'Вы родились в {months[number_of_month]}. Урожай был невероятным')
   else:
        print(f'Вы родились в {months[number_of_month]}. За окном падал белый снег')

# Тесты
season_events(33)
season_events('wq')
season_events(1)
season_events(7)
season_events(10)
season_events(5)

Результат выполнения

Требуется ввести реальный номер месяца
Требуется ввести реальный номер месяца
Вы родились в Январе. За окном падал белый снег
Вы родились в Июле. Солнце светило ярче чем когда-либо
Вы родились в Октябре. Урожай был невероятным
Вы родились в Мае. Птицы пели прекрасные песни

Задача 3. *Продвинутый уровень

Условие

Анатолию в последний месяц удача улыбалась очень плохо. 
У него 3 раза взломали пароль. 
Вот он и задумался над тем, что неправильно подходит к вопросу составления паролей.
Чтобы не напрягаться больше и опять не попасть впросак, молодой человек решил написать функцию на Python, которая будет проверять его пароль на надежность.

Требования к паролю у Анатолия следующие (он внимательно изучил рекомендации знатоков):

1) Длина – 8 символов (если меньше – то проще взломать, а если длиннее – то сложно запомнить)
2) В пароле должны быть заглавные буквы, строчные символы, числа и специальные знаки (из перечня «*-#»; другие спецсимволы недопустимы, так как Анатолий их не может запомнить).

Помогите парню составить функцию check_pass (pswd), которая проверит пароль на соответствие требованиям. 
В случае верного пароля выведется на печать «Пароль идеален», а в остальных случаях будут перечислены все ошибки, которые Анатолий допустил (для представления перечня ошибок заведите переменную err в виде словаря).

Для решения задачи требуется сделать следующее:
– в переменную err вносим все возможные ошибки и их значения,
– итерируемся по паролю, в случае обнаружения требуемого символа в нем, удаляем соответствующую ошибку из словаря,
– для выявления непредусмотренных символов создадим копию пароля и будем заменять все верные буквы и знаки на каждой итерации цикла на пустую строку; если в конце строка с паролем будет не пустой, то это свидетельство применения неверного символа в пароле,
— если после всех операций словарь с ошибками станет пустым, то пароль идеален, в противном случае перечисляем все ошибки.

Приведем 2 способа решения.

Способ 1:
Пример – IDE

import string


def check_pass(pwd):

    err = {
    'length': 'Длина пароля не равна 8 символам',
    'upper': 'Отсутствуют заглавные буквы',
    'lower': 'Нет строчных букв в пароле',
    'digits': 'Нет цифр в пароле',
    'spec': 'Отсутствуют спецсимволы в пароле',
    'bad_symbols': 'В пароле использованы непредусмотренные символы'
    }

    if len(pwd) == 8:
        err.pop('length')

    if pwd.lower() != pwd:
        err.pop('upper')

    if pwd.upper() != pwd:
        err.pop('lower')

    if any(map(str.isdigit, pwd)):
        err.pop('digits')

    if ('*' in pwd) or ('-' in pwd) or ('#' in pwd):
        err.pop('spec')

    allowed_sym = string.ascii_uppercase + string.ascii_lowercase + string.digits + '*-#'

    if (set(pwd) - set(allowed_sym)) == set():
        err.pop('bad_symbols')

    if len(err) == 0:
        print('Пароль идеален')
    else:
        print(*err.values(), sep='; ')


# Тесты
check_pass('8Yy#*rrT')
check_pass('@#@@u')
check_pass('Tr56#2@@')
check_pass('qwerty11')
check_pass('11qweQ-s')

Способ 2:
Пример – IDE

import string

def check_pass(pswd):

    err = {
        'length': 'Длина пароля не равна 8 символам',
        'upper': 'Отсутствуют заглавные буквы',
        'lower': 'Нет строчных букв в пароле',
        'digits': 'Нет цифр в пароле',
        'spec': 'Отсутствуют спецсимволы в пароле',
        'bad_symbols': 'В пароле использованы непредусмотренные символы'
    }

    if len(pswd) == 8:
        err.pop('length')

    pswd_reduced = [symbol for symbol in pswd]

    for symbol in pswd:
        if symbol in string.ascii_uppercase:
            pswd_reduced.remove(symbol)
            err.pop('upper', None)
        elif symbol in string.ascii_lowercase:
            pswd_reduced.remove(symbol)
            err.pop('lower', None)
        elif symbol in string.digits:
            pswd_reduced.remove(symbol)
            err.pop('digits', None)
        elif symbol in '*-#':
            pswd_reduced.remove(symbol)
            err.pop('spec', None)

    if len(pswd_reduced) == 0:
        err.pop('bad_symbols')

    if len(err) == 0:
        print('Пароль идеален')
    else:
        print(*err.values(), sep='; ')


# Тесты
check_pass('8Yy#*rrT')
check_pass('@#@@u')
check_pass('Tr56#2@@')
check_pass('qwerty11')
check_pass('11qweQ-s')

Результат выполнения

Пароль идеален
Длина пароля не равна 8 символам; Отсутствуют заглавные буквы; Нет цифр в пароле; В пароле использованы непредусмотренные символы
В пароле использованы непредусмотренные символы
Отсутствуют заглавные буквы; Отсутствуют спецсимволы в пароле
Пароль идеален

Задача 4. *Продвинутый уровень

Условие

Число делится на 6 только в случае соблюдения двух условий: последняя его цифра четная, а сумма всех цифр делится на 3.
Напишите функцию is_divisible_by_6(number), которая возвращает «Число Х делится на 6» или «Число Х неделимо на 6» в зависимости от того, можно ли его разделить на 6. 
В качестве аргумента может быть передано любое целое число.

При решении нужно учесть, что на входе могут передаваться отрицательные числа.

1. Первый очевидный способ решения — через функцию sum:
Пример — IDE

def is_divisible_by_6(number):
    lst_str_digits = list(str(abs(number)))
    lst_digits = list(map(int, lst_str_digits))
    sum_digits = sum(lst_digits)
    if (sum_digits % 3 == 0) and (lst_digits[-1] % 2 == 0):
        return f'Число {number} делится на 6'
    else:
        return f'Число {number} неделимо на 6'

2. Не столь очевидный, но интересный способ — через функцию reduce из модуляfunctools:
Пример — IDE

from functools import reduce


def is_divisible_by_6(number):
   num = abs(number)
   if int(str(num)[-1]) % 2 == 0 and reduce(lambda x, y: int(x) + int(y), str(num), 0) % 3 == 0:
        return f'Число {number} делится на 6'
    return f'Число {number} неделимо на 6'

# Тесты 
print(is_divisible_by_6(6))
print(is_divisible_by_6(-96))
print(is_divisible_by_6(-1234))
print(is_divisible_by_6(40008))

Результат выполнения

Число 6 делится на 6
Число -96 делится на 6
Число -1234 неделимо на 6
Число 40008 делится на 6

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *