Задачи (5)

Задание 61

Про модуль CSV в Python

В файле braki.stat представлена статистика браков в РФ с 1950 по 2018 годы.

  • Построить график.
  • Определить, в какой год были максимальные и минимальные значения показателей.
# code

Задание 62

В файле razvodi.stat представлена статистика разводов в РФ с 1950 по 2018 годы.

Построить вторым графиком с браками.

# code

Задание 63

Определите три наиболее популярных вида спорта в стране, исходя из количества построенных спортивных объектов для них.

Файл с данными находится по ссылке.

Поля (столбцы) файла:

  • порядковый номер строки;
  • наименование спортивного объект;
  • полный адрес спортивного объекта;
  • виды спорта, для которых предназначен спортивный объект;
  • пропускная способность объекта;
  • вместимость объекта;
  • площадь объекта (Га).

Разделитель между полями (столбцами) в файле: '\t'.

Кодировка файла: 'cp1251'.

PS: для сбора статистики можно воспользоваться словарем, после чего провести его сортировку по значению

Подсказка:

>>> sorted("This is a test string from Andrew".split())
['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']

>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

>>> str.lower("a")
'a'

>>> str.lower('Andrew')
'andrew'

>>> d={"t1":2, "t6":5, "t9":1}
>>> d
{'t9': 1, 't6': 5, 't1': 2}

>>> sorted(d)
['t1', 't6', 't9']

>>> d.get('t1')
2

>>> sorted(d, key=d.get)
['t9', 't1', 't6']

d={"t1":2, "t6":5, "t9":1}
genexp = [(k, d[k]) for k in sorted(d, key=d.get, reverse=True)]
for k, v in genexp:
   print(k, v)
# code

Задание 64 (Объектно-ориентированное проектирование)

В этом задании можно и нужно фантазировать :-)

Провести объектно-ориентированный анализ задачи и определить объекты, которые потребуется использовать:

  • создается текстовая компьютерная игра, поддерживающая одновременное управление несколькими персонажами (множество объектов);
  • каждый персонаж умеет бегать, стрелять и собирать предметы;
  • некоторые персонажи умеют летать (использовать наследование классов);
  • каждый тип действий сопровождается определенной анимацией (подсказка: изменением координат);
  • собираемые предметы могут менять характеристики действий и соответствующую анимацию (например, вдвое ускорять или, наоборот, замедлять бег персонажа).

# code

Задание 65

Напиши программу для очистки и нормализации первой главы ‘Моби Дика’, находящегося в файле moby.txt.

  • Все символы должны относиться к одному регистру.
  • Удалить все знаки препинания.
  • Записать слова по одному на строку во второй файл с именем moby_clean.txt

Подсказка:

> trantab = str.maketrans({'i': '1', 'e': None})
> print(trantab)

> s = "this is string example....wow!!!"
> print(s.translate(trantab))

> intab = "aeiou"
> outtab = "12345"
> trantab = str.maketrans(intab, outtab)
> print(trantab)

> s = "this is string example....wow!!!"
> print(s.translate(trantab))

> trantab = str.maketrans("", "", "sw")
> print(trantab)

> s = "this is string example....wow!!!"
> print(s.translate(trantab))
# code

Задание 66

Прочитайте содержимое файла moby_clean.txt, полученного в задании 65. Используйте словарь для подсчета вхождений каждого слова, выведите первые 5 самых частых и самых редких слов.

# code

Задание 67

Напишите программу, выполняющую функции простейшего калькулятора. Программа получает на вход два числа и операцию (+, -, /).

Обеспечьте корректную обработку ввода, который не преобразуется в числа. Обработайте ошибки деления на ноль.

Вход: 4 5 +
Выход: 9

Вход: 5 0 /
Выход: Ошибка деления на ноль

Вход: e 4 +
Выход: Ошибка преобразования типов
# code

Задание 68

Файл useragents.txt содержит следующие строки:

Firefox
Chrome
Safari
Edge

Вывести все строки log-файла, где useragent отличается от представленных в файле useragents.txt.

# code

Задание 69

Напишите калькулятор, который вычисляет арифметические выражения, заданные пользователем в постфиксной записи (обратная польская запись).

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

1 2 3 * + 2 -

стек, написанный горизонтально в квадратных скобках, становится

[ ], [1], [1 2], [1 2 3], [1 6], [7], [7 2], [5].

Пример вызова:

>>> calc("1 2 + 4 * 3 +")
    '15'
>>> calc("1 2 3 * + 2 -")
    '5'
# postfix_test.py
def calc(expr):
    '''
    >>> calc("1 2 + 4 * 3 +")
    '15'
    >>> calc("1 2 3 * + 2 -")
    '5'
    '''

    # ...

    return # ...

#print(calc("1 2 3 * + 2 -"))

import doctest
doctest.testmod()
**********************************************************************
File "__main__", line 4, in __main__.calc
Failed example:
    calc("1 2 + 4 * 3 +")
Expected:
    '15'
Got nothing
**********************************************************************
File "__main__", line 6, in __main__.calc
Failed example:
    calc("1 2 3 * + 2 -")
Expected:
    '5'
Got nothing
**********************************************************************
1 items had failures:
   2 of   2 in __main__.calc
***Test Failed*** 2 failures.
TestResults(failed=2, attempted=2)

Задание 70

Напишите программу, которая читает последовательность символов-разграничителей, такую как ( ) { [ ] ( ) { } }, и сообщает, когда разграничители симметричны ( { } ( ) ) или когда несимметричны, например ( ( ) } или { ( ).

Используйте стек, чтобы запомнить открытые в настоящий момент символы-разграничители.

Пример вызова:

>>> check_delimiter("( ) { [ ] ( ) { } }")    
True
    
>>> check_delimiter("( ) { [ ] }")    
True
    
>>> check_delimiter("( ) { [ ] ( ] { } }")    
False
# delimiter_test.py
def check_delimiter(s):
    '''
    >>> check_delimiter("( ) { [ ] ( ) { } }")
    True
    >>> check_delimiter("( ) { [ ] }")
    True
    >>> check_delimiter("( ) { [ ] ( ] { } }")
    False

    '''

    # ...

    return # ...

import doctest
doctest.testmod()
**********************************************************************
File "__main__", line 4, in __main__.calc
Failed example:
    calc("1 2 + 4 * 3 +")
Expected:
    '15'
Got nothing
**********************************************************************
File "__main__", line 6, in __main__.calc
Failed example:
    calc("1 2 3 * + 2 -")
Expected:
    '5'
Got nothing
**********************************************************************
File "__main__", line 4, in __main__.check_delimiter
Failed example:
    check_delimiter("( ) { [ ] ( ) { } }")
Expected:
    True
Got nothing
**********************************************************************
File "__main__", line 6, in __main__.check_delimiter
Failed example:
    check_delimiter("( ) { [ ] }")
Expected:
    True
Got nothing
**********************************************************************
File "__main__", line 8, in __main__.check_delimiter
Failed example:
    check_delimiter("( ) { [ ] ( ] { } }")
Expected:
    False
Got nothing
**********************************************************************
2 items had failures:
   2 of   2 in __main__.calc
   3 of   3 in __main__.check_delimiter
***Test Failed*** 5 failures.
TestResults(failed=5, attempted=5)

Задание 71

Напишите функцию, которая будет генерировать случайный пароль. В пароле должно быть от 7 до 10 символов, при этом каждый символ должен быть случайным образом выбран из диапазона от 33 до 126 в таблице ASCII. Ваша функция не должна принимать на вход параметры, а возвращать будет сгенерированный пароль.

PS. Используйте функцию chr.

# code

Задание 72

Необходимо написать функцию, проверяющую введённый пароль на надежность. Определим как надежный пароль, состоящий минимум из 8 символов и включающий хотя бы по одной букве в верхнем и нижнем регистрах и как минимум одну цифру. Функция должна возвращать True, если переданный в качестве параметра пароль отвечает требованиям надежности. В противном случае возвращаемым значением должно быть False. Необходимо запросить у пользователя пароль и оповестить его о том, является ли он достаточно надежным.

# code

Задание 73

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

# code

Задание 74

Валидатор кредитных карт - принимает номер кредитной карты от обычного поставщика кредитных карт (Visa, MasterCard, American Express, Discoverer) и проверяет его, чтобы убедиться, что это действительный номер (посмотрите, как кредитные карты используют контрольную сумму).

Подсказка: см. алгоритм Луна.

# code

Задание 75. Разработайте систему бронирования номеров в отеле

Дополните следующий класс:

class Hotel:
    def __init__(self, num_rooms):
        self._rooms = [0 for _ in range(num_rooms)] # информация о статусе номеров
    # метод для бронирования номера по уникальному значению в списке
    def occypy(self, room_id):
        self._rooms[room_id] = 1  # бронируем номер
    # метод для освобождения номера по уникальному значению в списке
    def free(self, room_id):
        self._rooms[room_id] = 0  # освобождаем номер

hotel = Hotel(5) # в нашем отеле, например, 5 номеров
print(hotel._rooms) # смотрим номера через атрибут self.rooms
hotel.occypy(3)
print(hotel._rooms)
hotel.free(3)
print(hotel._rooms)
[0, 0, 0, 0, 0]
[0, 0, 0, 1, 0]
[0, 0, 0, 0, 0]

Задачи: - допишите метод occypy, чтобы он проверял занятость номера перед бронировнием: если номер занят, то генерируется исключение RuntimeError - напишите метод __str__ для красивой печати списка номеров через вызов функции print - напишите метод, который занимает все свободные номера в отеле - напишите метод, который возвращает долю занятых номеров - напишите метод, который освобождает все занятые номера отеля - напишите метод, который возвращает выручку, исходя из занятости комнат (стоимость комнаты - 5 тыс. у.е.) - проверьте созданные методы через создание объектов и их вызов

# здесь код

Дополнительные задачи: - вместо списка создайте словарь для хранения различных типов номеров (SGL, DBL и Junior Suite, Suite) и их занятости - у комнат разная стоимость (хранить ее можно в словаре) - измените методы, написанные раннее так, чтобы учесть новые особенности номеров (например, добавляется тип номера при бронировании) - проверьте созданные методы через создание объектов и их вызов

# здесь код

Задание 76

Данные от Сбера для анализа представлены в файле opendata.csv.

Определите с помощью стандартных модулей Python среднюю пенсию в Забайкальском крае за 2018 год.

Выполните обработку ошибок в программе.

Постройте график изменения пенсии за 2018 год в Забайкальском крае.

# code

Задание 77

Разработайте собственный класс для работы с файлами.

Интерфейс работы с классом имеет следующий вид:

file = MyFile("text.txt", "read")
text = file.read() # происходит чтение в виде str
print(text)

file = MyFile("text.txt", "write")
text = file.write("привет!") # происходит запись строки в файл

file = MyFile("text.txt", "append")
text = file.write("привет!") # происходит добавление строки в конец файла

# указали URL
file = MyFile("https://blog.dfedorov.spb.ru", "url")
# и может читать содержимое страницы по указанному URL
text = file.read_url() # происходит чтение в виде str
print(text)

# возвращает кол-во url адресов на странице, например, методом count
count = file.count_urls()
print(count)

# происходит запись содержимого страницы по URL в указанный файл
file.write_url("text.txt")

Выполните обработку возможных ошибок.

# code

Задание 78

  1. Исследовать эмоциональную окраску новостей на английском языке (рекомендую модули feedparser и textblob - хорошо работает для англ. языка).

  2. Определите наиболее часто встречающиеся слова в тексте новости на русском языке за выбранный период (рекомендую модуль pymorphy2, использовать начальную форму и убрать союзы / в качестве альтернативы можно использовать модуль nltk).

  3. Постройте график распределения слов в новости на русском языке (рекомендую модуль word_cloud)

# code

Задание 79

Для файла, расположенного в сети Интернет, напишите программу с использованием модуля Beautiful Soup, которая извлекает данные из HTML-страницы и сохраняет их в файле формата CSV (подсказка тут).

# code