Формат. Экзамен состоит из трех частей. Первая часть ‒ базовая, задания в ней снабжены автоматическими тестами. Вторая часть посвящена работе в pandas
, а третья ‒ парсингу и web-scraping'у. Никакая из частей экзамена не является обязательной или блокирующей; для того, чтобы получить оценку 4 из 10, нужно набрать 10 баллов из 30.
Формат сдачи. Итоговый ipynb-файл необходимо загрузить в систему nbgr-x. Файл должен содержать в себе полные решения всех частей, не только первой, которая проверяется автоматически.
Запустите следующие ячейку, чтобы иметь возможность запускать тесты. Эту операцию нужно проделывать каждый раз, когда вы перезапускаете ядро. Если какой-то из тестов говорит NameError: name 'Tester' is not defined
, нужно запустить эту ячейку ещё раз.
# Фабрика тестов для проверки программ, принимающих данные через 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
Задание 1 (1 балл) Напишите программу, которая просит пользователя ввести с клавиатуры строку с названием файла с пробелами и выводит на экран название этого же файла, но со знаком _
вместо пробелов.
Пример работы программы:
Ввод:
Введите название файла: любимое фото.png
Вывод:
любимое_фото.png
Ввод:
Введите название файла: не самое любимое фото.png
Вывод:
не_самое_любимое_фото.png
def change():
### YOUR CODE HERE
change()
test_data = [
("любимое фото.png", ["любимое_фото.png\n"]),
("база данных.csv", ["база_данных.csv\n"]),
("это-не-я.png", ["это-не-я.png\n"]),
("не самое любимое фото.png", ["не_самое_любимое_фото.png\n"])]
for inp, out in test_data:
with Tester([inp]) as t:
change()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t == out, "Неверный ответ, была введена строка" + inp
Задание 2 (1 балл) Напишите программу, которая просит пользователя последовательно ввести с клавиатуры два числа (каждое с новой строчки), число пройденных экзаменов и общее число экзаменов, и выводит на экран сообщение вида Пройдено 40.00% пути.
Число процентов должно представляться в виде целого числа; если оно дробное, то дробная часть должна отбрасываться.
Пример работы программы:
Ввод:
Введите число пройденных экзаменов: 2
Введите общее число экзаменов: 8
Вывод:
Пройдено 25 процентов пути.
def my_count():
### YOUR CODE HERE
my_count
test_data = [
("6 8", ["Пройдено 75 процентов пути.\n"]),
("1 10", ["Пройдено 10 процентов пути.\n"]),
("2 8", ["Пройдено 25 процентов пути.\n"]),
("3 8", ["Пройдено 37 процентов пути.\n"])]
for inp, out in test_data:
with Tester(inp.split()) as t:
my_count()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t == out, "Неверный ответ, была введена строка" + inp
Задание 3 (1 балл) Напишите функцию my_sqrt()
, которая принимает на вход список неотрицательных чисел и возвращает список квадратных корней из этих чисел. Функция не должна ничего печатать (выводить на экран).
Пример работы программы:
Ввод:
[4, 0, 9, 16, 5]
Вывод:
[2, 0, 3, 4, 2.]
### YOUR CODE HERE
import math
tol = 0.0001
eq = lambda a, b: abs(a-b) < tol
test = [([4, 0, 9, 16, 5], [2.0, 0.0, 3.0, 4.0, 2.23606797749979]),
([2, 1, 3], [1.4142135623730951, 1.0, 1.7320508075688772]),
([0, 7], [0.0, 2.6457513110645907]),
([5.56, 1.21, 8], [2.3579652245103193, 1.1, 2.8284271247461903])]
for p in test:
for i in range(0, len(p[0])):
assert eq(my_sqrt(p[0])[i], p[1][i]), "Неверный ответ для " + str(p[0])
with Tester([]) as t:
my_sqrt([4, 0, 9, 16, 5])
assert len(t) == 0, "функция ничего не должна печатать"
Задание 4 (1 балл) Напишите функцию make_list()
, которая принимает на вход строку, содержащую целые числа, указанные через пробел, и возвращает список целых чисел. Функция не должна ничего печатать (выводить на экран).
Пример работы программы:
На входе:
4 6 7 0 -1
На выходе:
[4, 6, 7, 0, -1]
### YOUR CODE HERE
assert(make_list("4 6 7 0 -1") == [4, 6, 7, 0, -1]), "Ошибка при вводе строки " + "4 6 7 0 -1"
assert(make_list("2 22 7") == [2, 22, 7]), "Ошибка при вводе строки " + "2 22 7"
assert(make_list("-32 -101 -6") == [-32, -101, -6]), "Ошибка при вводе строки " + "-32 -101 -6"
Задание 5 (1 балл) Напишите функцию col_music()
, которая просит пользователя ввести название цвета, и, если цвет равен yellow
, она выводит на экран строку "We all live in a yellow submarine", если green
, то "And the green grass grows all around, all around", если black
, то "Black night is not right". Если пользователь вводит какой-то другой цвет или один из перечисленных цветов в другом регистре или с опечатками, функция должна выводить на экран строку "Too hard. Make up something else." Функция не должна ничего возвращать.
Пример работы программы:
На входе:
Enter color: black
На выходе (вывод на экране):
Black night is not right
### YOUR CODE HERE
test_data = [
("black", ["Black night is not right\n"]),
("green", ["And the green grass grows all around, all around\n"]),
("yellow", ["We all live in a yellow submarine\n"]),
("Yellowe", ["Too hard. Make up something else.\n"])]
for inp, out in test_data:
with Tester([inp]) as t:
col_music()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t == out, "Неверный ответ, была введена строка " + inp
Задание 6 (1 балл) Напишите функцию make_double()
, которая принимает на вход некоторый список, а возвращает кортеж из двух списков: принятого на вход (старого) и преобразованного (нового). Преобразованный список представляет собой продублированный список, принятый на вход. Функция не должна ничего печатать (выводить на экран).
Пример работы программы:
На входе:
['a', 'b', 3]
На выходе:
(['a', 'b', 3], ['a', 'b', 3, 'a', 'b', 3])
### YOUR CODE HERE
assert make_double(['a', 'b', 3]) == (['a', 'b', 3], ['a', 'b', 3, 'a', 'b', 3]), "Ошибка при вводе " + str(['a', 'b', 3])
assert make_double([1, 0, 3, 3]) == ([1, 0, 3, 3], [1, 0, 3, 3, 1, 0, 3, 3]), "Ошибка при вводе " + str([1, 0, 3, 3])
assert make_double([-1, 6, 5, 9, 'q']) == ([-1, 6, 5, 9, 'q'], [-1, 6, 5, 9, 'q',-1, 6, 5, 9, 'q']), "Ошибка при вводе " + str(-1, 6, 5, 9, 'q')
Задание 7 (2 балла) Напишите функцию slov_find()
, которая принимает на вход два аргумента
и возвращает соответствующий перевод слова. Считайте, что пользователь вводит слова из готового словаря my_dict
. Если введенного слова нет в словаре my_dict
, должна возвращаться строка "Слово не найдено".
Пример работы программы:
На входе:
slov_find(fant, 1)
На выходе:
парень
На входе:
slov_find(язык, 2)
На выходе:
jezik
На входе:
slov_find(открытка, 2)
На выходе:
Слово не найдено
### YOUR CODE HERE
my_dict = {'računalnik': 'компьютер', 'fant' : 'парень', 'sladoled' : 'мороженое', 'kosilo' : 'обед',
'jezik' : 'язык', 'hrbetnica' : 'позвоночник', 'enota' : 'урок'}
assert slov_find('fant', 1), "Ошибка при вводе слова " + "fant"
assert slov_find('računalnik', 1), "Ошибка при вводе слова " + "računalnik"
assert slov_find('sladoled', 1), "Ошибка при вводе слова " + "sladoled"
assert slov_find('урок', 2), "Ошибка при вводе слова " + "урок"
assert slov_find('обед', 2), "Ошибка при вводе слова " + "обед"
Задание 8 (3 балла) Напишите функцию my_count()
, которая принимает на вход целое число в формате строки (string) и,
{"сумма цифр" : 12, "произведение цифр": 27}
.Пользоваться готовой функцией sum()
можно. Для произведения можно импортировать библиотеку numpy
и взять оттуда функцию prod()
. Например, numpy.prod([1,6,7])
.
### YOUR CODE HERE
assert my_count('325') == {'произведение цифр': 30, 'сумма цифр': 10}, "Ошибка при вводе числа 325"
assert my_count('111') == {'произведение цифр': 1, 'сумма цифр': 3}, "Ошибка при вводе числа 111"
assert my_count('45623') == {'произведение цифр': 720, 'сумма цифр': 20}, "Ошибка при вводе числа 45623"
pandas
(12 баллов)¶d
. (1 балл)(3 балла) Используя html-страницу, ссылка на которую приведена ниже, создайте датафрейм pandas
, который должен включать следующие столбцы:
* ФИО депутата (name)
* пол депутата (gender)
* партия (party)
Посмотреть на саму страницу можно здесь:
https://www.w3schools.com/code/tryit.asp?filename=FSHGYZTU2PBH
link = "https://raw.githubusercontent.com/allatambov/Py-programming-3/master/html-depts.html"
(5 баллов) Напишите функцию get_info()
, которая принимает на вход ссылку на персональную страницу преподавателя ВШЭ, и возвращает список, содержащий следующие элементы:
# для примера
guess_who = 'https://www.hse.ru/staff/allat'