На первом этапе проверки ваши решения в домашних заданиях и лабораторных работах будут проверяться с помощью автоматических тестов – ячеек с кодом, которые проверяют соответствие результатов исполнения ваших программ ожидаемым результатам в условиях задач. Эти тесты можно использовать для проверки кода перед сдачей задания.
Итак, для предварительной проверки задания нужно сделать следующее:
# YOUR CODE HERE
. Отступ вашего кода должен составлять 4 пробела. Ничего не менять вокруг!assertion
), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.Внимание! Если в какой-то момент забыть ввести входные данные и перейти на следующую ячейку, есть риск, что Notebook перестанет откликаться. В этом случае надо перезапустить ядро: Kernel → Restart. При этом потеряются все значения переменных, но сам код останется.
Запустите следующую ячейку, чтобы иметь возможность запускать тесты.
# Фабрика тестов для проверки программ, принимающих данные через input()
from collections import deque
class Tester(object):
def __init__(self, inp):
self.outputs = []
self.inputs = deque(inp)
def print(self, *args, sep = " ", end = "\n"):
text = sep.join(map(str, args)) + end
newlines = text.splitlines(keepends=True)
if self.outputs and self.outputs[-1] and self.outputs[-1][-1] != "\n" and newlines:
self.outputs[-1] += newlines[0]
self.outputs.extend(newlines[1:])
else:
self.outputs.extend(newlines)
def input(self, *args):
assert self.inputs, "Вы пытаетесь считать больше элементов, чем предусмотрено условием"
return self.inputs.popleft()
def __enter__(self):
global print
global input
print = self.print
input = self.input
return self.outputs
def __exit__(self, *args):
global print
global input
del print
del input
Напишите программу, которая запрашивает у пользователя имя и фамилию (отдельный ввод для имени и фамилии) и выводит на экран сообщение:
Имя Фамилия, добро пожаловать!
Пример работы программы:
Ввод:
Введите имя: Алла
Введите фамилию: Тамбовцева
Вывод:
Алла Тамбовцева, добро пожаловать!
def hello():
name = input()
surname = input()
print(f"{name} {surname}, добро пожаловать!")
hello()
Добби Свободный Добби Свободный, добро пожаловать!
test_data = [
("Алла Тамбовцева", "Алла Тамбовцева, добро пожаловать!"),
("Добби Свободный", "Добби Свободный, добро пожаловать!"),
("0 1", "0 1, добро пожаловать!")
]
for inp, out in test_data:
with Tester(inp.split()) as t:
hello()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0] == out+"\n", "Неверный ответ, была введена строка " + inp
Проверка кода:
Запускаем ячейку с тестами ниже и проверяем код, который вписали выше в hello()
.
Если после запуска ничего не выводится на экран – всё хорошо, тесты пройдены.
Если ошибка вида AssertionError
: код не прошел тест, проверьте, соответствует ли выводимый на экран текст условию, в частности, проверьте, на месте ли восклицательный знак и всё ли хорошо с пробелами. Запустите ячейку с test_data
ещё раз.
Если ошибка вида NameError
про hello is not defined
: забыли запустить ячейку выше с hello()
или перезапустили ядро в Kernel (Python все сбросил и забыл), запустите ячейку выше и проверьте, что в ней есть код с решением. Запустите ячейку с test_data
ещё раз.
Если ошибка вида NameError
про Tester is not defined
: забыли запустить ячейку в начале файла с Tester
(под заголовком Активировать тесты) или перезапустили ядро в Kernel (Python все сбросил и забыл), запустите эту ячейку. Запустите ячейку с test_data
ещё раз.
Напишите программу, которая запрашивает у пользователя с клавиатуры его рост в сантиметрах, его вес в килограммах (каждый показатель – с новой строки, в новом запросе) и выводит на экран сообщение вида:
Индекс массы тела: [значение].
где вместо [значение]
подставляется посчитанное значение индекса массы тела, указанное с точностью до второго знака после запятой.
Индекс массы тела считается так:
$$ \text{BMI}=\frac{m}{h^2}, $$где $m$ – масса тела в килограммах, $h$ – рост в метрах.
Пример работы программы:
Ввод:
Укажите рост: 168
Укажите вес: 55
Вывод:
Индекс массы тела: 19.49.
# внимание: в print() нужно .2f для фиксации числа знаков после точки
# просто {bmi} выдаст ответ в виде длинного числа без округлений
def get_bmi():
height = int(input("Укажите рост: "))
weight = int(input("Укажите вес: "))
bmi = weight / (height / 100) ** 2
print(f"Индекс массы тела: {bmi:.2f}.")
get_bmi()
Укажите рост: 168 Укажите вес: 55 Индекс массы тела: 19.49.
test_data = [
("168 55", "Индекс массы тела: 19.49."),
("180 70", "Индекс массы тела: 21.60."),
("165 48", "Индекс массы тела: 17.63."),
("167 89", "Индекс массы тела: 31.91.")
]
for inp, out in test_data:
with Tester(inp.split()) as t:
get_bmi()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0] == out+"\n", "Неверный ответ, была введена строка " + inp
Напишите программу, которая запрашивает у пользователя год рождения, информацию о том, был ли у того день рождения (True
, если был, или пустая строка, если не был), и выводит на экран число полных лет этого пользователя.
Пример работы программы:
Ввод:
1994
Вывод:
29
Ввод:
1957
True
Вывод:
67
Важный момент 1. Python умеет переводить логическое True
в число 1, а логическое False
в 0, логика и двоичная система связаны.
print(int(True))
print(int(False))
1 0
Важный момент 2. Python умеет переводить строку "True"
в логическое True
, но не умеет переводить строку "False"
в логическое False
. Функция bool()
от любого текста, включая "False"
, вернет True
. Функция bool()
вернёт False
только в одном случае – если применить её к пустой строке.
print(bool("True"))
print(bool("False"))
print(bool(""))
True True False
Идея решения: считаем число полных лет на прошлый год (2023), а затем либо добавляем ещё один год (день рождения был), либо нет (дня рождения не было). Для этого пользуемся тем, что введённое слово "True"
можно переделать в логическое True
, а оно эквивалентно числу 1, а введённую пустую строку – в логическое False
(что эквивалентно 0).
# решение 1: сами указываем год
def counter():
byear = int(input())
binary = bool(input())
print(2023 - byear + binary)
counter()
1994 True 30
# решение 2: пользуемся знаниями об извлечении текущей даты с помощью datetime
# используем функцию now() и забираем оттуда текущий год через атрибут .year
from datetime import datetime
def counter():
byear = int(input())
binary = bool(input())
year = datetime.now().year
print((year - 1) - byear + binary)
counter()
1994 True 30
test_data = [
("1994-", "29"),
("1963-True", "61"),
("1957-", "66"),
("2000-True", "24")
]
for inp, out in test_data:
with Tester(inp.split("-")) as t:
counter()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0] == out+"\n", "Неверный ответ, была введена строка " + inp
В среднем за неделю Питон получает пять сообщений от Анаконды ($\lambda$=5). Пользователь с клавиатуры вводит число сообщений, которые Анаконда может прислать Питону ($k$). Напишите программу, которая выводит на экран вероятность, с которой Питон получит $k$ сообщений от Анаконды за неделю, с точностью до трёх знаков после запятой. Сообщение, выводимое на экран, должно быть такого вида:
Число сообщений от Анаконды за неделю равно [k], вероятность равна [значение].
Вероятность того, что Питон получит ровно $k$ сообщений, определяется следующим образом (распределение Пуассона):
$$ \text{P}(X=k)=e^{−\lambda}⋅\frac{\lambda^k}{k!}. $$Функцию factorial()
для вычисления факториала можно вызвать из модуля math
.
Пример работы программы:
Ввод:
Число сообщений: 2
Вывод:
Число сообщений от Анаконды за неделю равно 2, вероятность равна 0.084.
from math import factorial, exp
# почему lamda = 5, а не lambda = 5?
# lambda в Python зарезервировано для специальных функций,
# (подсвечивается зеленым), не стоит использовать
def message():
lamda = 5
k = int(input("Число сообщений:"))
p = exp(-lamda) * lamda ** k / factorial(k)
print(f"Число сообщений от Анаконды за неделю равно {k}, вероятность равна {p:.3f}.")
message()
Число сообщений:8 Число сообщений от Анаконды за неделю равно 8, вероятность равна 0.065.
test_data = [
("2", "Число сообщений от Анаконды за неделю равно 2, вероятность равна 0.084."),
("0", "Число сообщений от Анаконды за неделю равно 0, вероятность равна 0.007."),
("3", "Число сообщений от Анаконды за неделю равно 3, вероятность равна 0.140."),
("5", "Число сообщений от Анаконды за неделю равно 5, вероятность равна 0.175."),
("8", "Число сообщений от Анаконды за неделю равно 8, вероятность равна 0.065.")
]
for inp, out in test_data:
with Tester([inp]) as t:
message()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0] == out+"\n", "Неверный ответ, была введена строка " + inp
Дополнение. Можем импортировать модуль ipywidgets
и воспользоваться возможностями Jupyter Notebook для более интересного запроса ввода данных со стороны пользователя.
import ipywidgets as widgets
Создадим слайдер для целых чисел (IntSlider
) для выбора значений от 0 до 10 (по умолчанию шаг в слайдере 1, если пользователь ничего не выбрал, будет сохраняться значение из аргумента value
):
slider_k = widgets.IntSlider(value = 5, min = 0, max = 10)
display(slider_k)
IntSlider(value=5, max=10)
# из объекта ipywidgets извлекаем значение – атрибут .value
k = slider_k.value
lamda = 5
p = exp(-lamda)* lamda**k / factorial(k)
print(f"Число сообщений от Анаконды за неделю равно {k}, вероятность равна {p:.3f}.")
Число сообщений от Анаконды за неделю равно 8, вероятность равна 0.065.
Можем доработать слайдер – импортировать функцию Layout()
для стилизации и добавить словарь style
:
from ipywidgets import Layout
# description: текст описания слева от слайдера
# style: стиль слайдера, регулируем длину текста
# из-за длинного описания «съелось» место для самого слайдера
# в Layout корректируем длину (в % от ширины страницы)
slider_k = widgets.IntSlider(value = 5,
min = 0,
max = 10,
description = 'Число сообщений: ',
style = {'description_width': '100pt'},
layout = Layout(width='50%'))
display(slider_k)
IntSlider(value=5, description='Число сообщений: ', layout=Layout(width='50%'), max=10, style=SliderStyle(desc…
Кому в жизни не хватает красок:
# handle_color
slider_k = widgets.IntSlider(value = 5,
min = 0,
max = 10,
description = 'Число сообщений: ',
style = {'description_width': '100pt',
'handle_color' : 'limegreen'},
layout = Layout(width='50%'))
display(slider_k)
IntSlider(value=5, description='Число сообщений: ', layout=Layout(width='50%'), max=10, style=SliderStyle(desc…