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

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

Python Workbook Cover T1
  • Конструкция: if-elif-else
  • Контент: Вопросы (4шт) + задачи (4шт)

Оглавление

1
Введение
Определим специфику и синтаксис условных выражений в Python, способы их использования и научимся их применять в зависимости от поставленной задачи. Также рассмотрим примеры, когда они могут быть заменены более простыми и наглядными конструкциями (словарями, тернарными операторами).
Перейти
2
Вопросы и ответы
4 вопроса по теме "Условные выражения" + ответы
Перейти
3
Условия задач
4 задачи по теме двух уровней сложности: Базовый и *Продвинутый
Перейти
4
Решения задач
Приводим код решений указанных выше задач
Перейти
1
One

Введение

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

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

… 

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

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

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

Читайте также

2
Two

Вопросы по теме "Условные выражения"

3
Three

Задачи по теме "Условные выражения"

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

def is_alive(health):
____if:
____health < 0
_______False
____else:
_______return true

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

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

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

1. Длина – 8 символов (если меньше – то проще взломать, а если длиннее – то сложно запомнить).

2. В пароле должны быть:
1) заглавные буквы,
2) строчные символы,
3) числа
4) специальные знаки (из перечня *-#; другие спецсимволы недопустимы, так как Анатолий их не может запомнить).

Помогите парню составить функцию check_pass (pswd), которая проверит пароль на соответствие требованиям.
В случае верного пароля выведется на печать Пароль идеален, а в остальных случаях будут перечислены все ошибки, которые Анатолий допустил (для представления перечня ошибок заведите переменную err в виде словаря).
Задача 4*
Число делится на 6 только в случае соблюдения двух условий:
1. Последняя его цифра четная
2. Сумма всех цифр делится на 3

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

Решения

Задача 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
Как вам материал?

Читайте также