diff --git a/.gitignore b/.gitignore index c1d7cb7eb..af4b2d3d7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,106 +4,4 @@ __pycache__/ *.py[cod] *$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ -### JetBrains template -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio - -*.iml - -## Directory-based project format: -.idea/ -# if you remove the above rule, at least ignore the following: - -# User-specific stuff: -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/dictionaries - -# Sensitive or high-churn files: -# .idea/dataSources.ids -# .idea/dataSources.xml -# .idea/sqlDataSources.xml -# .idea/dynamic.xml -# .idea/uiDesigner.xml - -# Gradle: -# .idea/gradle.xml -# .idea/libraries - -# Mongo Explorer plugin: -# .idea/mongoSettings.xml - -## File-based project format: -*.ipr -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties - -/*.zip +.DS_Store diff --git a/lesson01/home_work/hw01_easy.py b/lesson01/home_work/hw01_easy.py old mode 100644 new mode 100755 index f927b0b06..c9a557690 --- a/lesson01/home_work/hw01_easy.py +++ b/lesson01/home_work/hw01_easy.py @@ -1,5 +1,6 @@ +#!/usr/bin/env python3 -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Студенников Валерий Юрьевич' # Задача-1: Дано произвольное целое число (число заранее неизвестно). # Вывести поочередно цифры исходного числа (порядок вывода цифр неважен). @@ -7,8 +8,11 @@ # * постарайтесь решить задачу с применением арифметики и цикла while; # * при желании решите задачу с применением цикла for. -# код пишем тут... +n = int( input() ) +while n != 0: + print( n % 10 ) + n //= 10 # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. @@ -18,7 +22,16 @@ # Не нужно решать задачу так: # print("a = ", b, "b = ", a) - это неправильное решение! +a, b = input(), input() +a, b = b, a +print("a =", a, "; b =", b) # Задача-3: Запросите у пользователя его возраст. # Если ему есть 18 лет, выведите: "Доступ разрешен", # иначе "Извините, пользование данным ресурсом только с 18 лет" + +age = int( input() ) +if age >= 18: + print('Доступ разрешен') +else: + print('Вход в pornhub только с 18!') diff --git a/lesson01/home_work/hw01_hard.py b/lesson01/home_work/hw01_hard.py old mode 100644 new mode 100755 index 7df268664..ab24a058a --- a/lesson01/home_work/hw01_hard.py +++ b/lesson01/home_work/hw01_hard.py @@ -1,5 +1,6 @@ +#!/usr/bin/env python3 -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Студенников Валерий Юрьевич' # Задание-1: # Ваня набрал несколько операций в интерпретаторе и получал результаты: @@ -14,3 +15,7 @@ # если точно известно, что её значение не изменялось? # Подсказка: это значение точно есть ;) + +import math + +print( math.inf ) diff --git a/lesson01/home_work/hw01_normal.py b/lesson01/home_work/hw01_normal.py old mode 100644 new mode 100755 index 991724e9a..9b90eea55 --- a/lesson01/home_work/hw01_normal.py +++ b/lesson01/home_work/hw01_normal.py @@ -1,5 +1,6 @@ +#!/usr/bin/env python3 -__author__ = 'Ваши Ф.И.О.' +__author__ = 'Студенников Валерий Юрьевич' # Задача-1: Дано произвольное целое число, вывести самую большую цифру этого числа. # Например, дается x = 58375. @@ -10,6 +11,8 @@ # * постарайтесь решить задачу с применением арифметики и цикла while; # * при желании и понимании решите задачу с применением цикла for. +n = input() +print( max( map( int, list(n) ) ) ) # Задача-2: Исходные значения двух переменных запросить у пользователя. # Поменять значения переменных местами. Вывести новые значения на экран. @@ -18,6 +21,9 @@ # * постарайтесь сделать решение через действия над числами; # * при желании и понимании воспользуйтесь синтаксисом кортежей Python. +a, b = input(), input() +a, b = b, a +print("a =", a, "; b =", b) # Задача-3: Напишите программу, вычисляющую корни квадратного уравнения вида # ax² + bx + c = 0. @@ -25,3 +31,22 @@ # Для вычисления квадратного корня воспользуйтесь функцией sqrt() модуля math: # import math # math.sqrt(4) - вычисляет корень числа 4 + +import math +print('Enter A, B, C:') +a, b, c = map( int, [input(), input(), input()] ) + +d = b ** 2 - 4 * a * c + +if a == 0: + x = -c / b + print( "one solution:", x ) +elif d < 0: + print( "no real solution" ) +elif d == 0: + x = (- b + math.sqrt( b ** 2 - 4 * a * c)) / (2 * a) + print( "one solution:", x ) +else: + x1 = ( -b + math.sqrt( (b ** 2) - (4 * (a * c) ) ) ) / (2 * a) + x2 = ( -b - math.sqrt( (b ** 2) - (4 * (a * c) ) ) ) / (2 * a) + print( "two solutions:", x1, "or", x2 ) diff --git a/lesson01/home_work/task01.py b/lesson01/home_work/task01.py new file mode 100755 index 000000000..790fe23da --- /dev/null +++ b/lesson01/home_work/task01.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +# Поработайте с переменными, создайте несколько, выведите на экран, +# запросите у пользователя несколько чисел и строк и сохраните в переменные, +# выведите на экран. + +a = 'see' +b = 5 +c = None + +print( a, b, c ) + +print( 'Enter 3 variables:' ) + +d, e, f = input(), input(), input() + +print( d, e, f ) diff --git a/lesson01/home_work/task02.py b/lesson01/home_work/task02.py new file mode 100755 index 000000000..e0b0b3f7a --- /dev/null +++ b/lesson01/home_work/task02.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +# Пользователь вводит время в секундах. Переведите время в часы, +# минуты и секунды и выведите в формате чч:мм:сс. +# Используйте форматирование строк. + +print( 'enter seconds:' ) +seconds = int( input() ) + +minutes = seconds // 60 +seconds = seconds % 60 + +hours = minutes // 60 +minutes = minutes % 60 + +print( "%02d:%02d:%02d" % (hours, minutes, seconds) ) diff --git a/lesson01/home_work/task03.py b/lesson01/home_work/task03.py new file mode 100755 index 000000000..d99c7a002 --- /dev/null +++ b/lesson01/home_work/task03.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + +# Узнайте у пользователя число n. Найдите сумму чисел n + nn + nnn. +# Например, пользователь ввёл число 3. Считаем 3 + 33 + 333 = 369. + +n = input() + +sum = int( n ) + int( n + n ) + int( n + n + n ) + +print( sum ) diff --git a/lesson01/home_work/task04.py b/lesson01/home_work/task04.py new file mode 100755 index 000000000..82348e487 --- /dev/null +++ b/lesson01/home_work/task04.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +# Пользователь вводит целое положительное число. Найдите самую большую цифру в числе. +# Для решения используйте цикл while и арифметические операции. + +n = input() + +# var 1 +print( max( map( int, list(n) ) ) ) + +# var 2 +n = int(n) +m = 0 +while n != 0: + d = n % 10 + if d > m: + m = d + n //= 10 + +print( m ) diff --git a/lesson01/home_work/task05.py b/lesson01/home_work/task05.py new file mode 100755 index 000000000..4e5dcb957 --- /dev/null +++ b/lesson01/home_work/task05.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +# Запросите у пользователя значения выручки и издержек фирмы. +# Определите, с каким финансовым результатом работает фирма +# (прибыль — выручка больше издержек, или убыток — издержки больше выручки). +# Выведите соответствующее сообщение. +# Если фирма отработала с прибылью, вычислите рентабельность выручки +# (соотношение прибыли к выручке). +# Далее запросите численность сотрудников фирмы и определите прибыль фирмы +# в расчете на одного сотрудника. + +revenue = float( input('Enter revenue: ')) +expenses = float( input('Enter expenses: ')) +profit = revenue - expenses +employees = float( input('Enter count of employees: ')) + +print( 'Profit: %.2f' % profit ) + +profit_per_employee = profit / employees + +print( 'Profit per employee: %.2f' % profit_per_employee ) diff --git a/lesson01/home_work/task06.py b/lesson01/home_work/task06.py new file mode 100755 index 000000000..e188609c4 --- /dev/null +++ b/lesson01/home_work/task06.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +# Спортсмен занимается ежедневными пробежками. +# В первый день его результат составил a километров. +# Каждый день спортсмен увеличивал результат на 10 % относительно предыдущего. +# Требуется определить номер дня, на который общий результат спортсмена +# составить не менее b километров. +# Программа должна принимать значения параметров a и b и +# выводить одно натуральное число — номер дня. + +a = float( input('a: ') ) +b = float( input('b: ') ) + +n = 1 +while a < b: + a *= 1.1 + n += 1 + +print( "n = %d" % n ) diff --git a/lesson02/home_work/from_manual-01.py b/lesson02/home_work/from_manual-01.py new file mode 100755 index 000000000..60c8ee08a --- /dev/null +++ b/lesson02/home_work/from_manual-01.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +# 1. +# Создать список и заполнить его элементами различных типов данных. +# Реализовать скрипт проверки типа данных каждого элемента. +# Использовать функцию type() для проверки типа. +# Элементы списка можно не запрашивать у пользователя, а указать явно, в программе. + +print('=== 1 ===') + +lst1 = [ 1, 'ной', set('ковчег'), [2, 3], dict(), { 'my' : 'dickt' } ] + +for item in lst1: + print( item, type(item) ) diff --git a/lesson02/home_work/from_manual-02.py b/lesson02/home_work/from_manual-02.py new file mode 100755 index 000000000..c3461f242 --- /dev/null +++ b/lesson02/home_work/from_manual-02.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +# 2. +# Для списка реализовать обмен значений соседних элементов, т.е. +# Значениями обмениваются элементы с индексами 0 и 1, 2 и 3 и т.д. +# При нечетном количестве элементов последний сохранить на своем месте. +# Для заполнения списка элементов необходимо использовать функцию input(). + +print('=== 2 ===') + +#lst2 = [1, 2, 3, 4, 5, 6, 7] +lst2 = input('enter words divided by space: ').split() + +for i in range(len(lst2) // 2): + lst2[ i * 2 ], lst2[ i * 2 + 1 ] = lst2[ i * 2 + 1 ], lst2[ i * 2 ] + +print( lst2 ) diff --git a/lesson02/home_work/from_manual-03.py b/lesson02/home_work/from_manual-03.py new file mode 100755 index 000000000..9c3252efe --- /dev/null +++ b/lesson02/home_work/from_manual-03.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +# 3. +# Пользователь вводит месяц в виде целого числа от 1 до 12. +# Сообщить к какому времени года относится месяц (зима, весна, лето, осень). +# Напишите решения через list и через dict. + +print('=== 3 ===') + +#month_num = 12 +month_num = int(input('enter month number: ')) +month_num -= 1 + +months_list = ['зима', 'зима', 'весна', 'весна', 'весна', 'лето', 'лето', 'лето', 'осень', 'осень', 'осень', 'зима'] +months_dict = { + 11 : 'зима', + 0 : 'зима', + 1 : 'зима', + 2 : 'весна', + 3 : 'весна', + 4 : 'весна', + 5 : 'лето', + 6 : 'лето', + 7 : 'лето', + 8 : 'осень', + 9 : 'осень', + 10 : 'осень', +} + +print( months_list[ month_num ], months_dict[ month_num ] ) diff --git a/lesson02/home_work/from_manual-04.py b/lesson02/home_work/from_manual-04.py new file mode 100755 index 000000000..f15238f71 --- /dev/null +++ b/lesson02/home_work/from_manual-04.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +# 4. +# Пользователь вводит строку из нескольких слов, разделённых пробелами. +# Вывести каждое слово с новой строки. Строки необходимо пронумеровать. +# Если в слово длинное, выводить только первые 10 букв в слове. + +print('=== 4 ===') + +#words_str = 'enter words divided by space andverylongword' +words_str = input('enter words divided by space: ') +words = words_str.split() + +for i, word in enumerate( words ): + print( i, word[:10] ) diff --git a/lesson02/home_work/from_manual-05.py b/lesson02/home_work/from_manual-05.py new file mode 100755 index 000000000..8c9a78aea --- /dev/null +++ b/lesson02/home_work/from_manual-05.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +# 5. +# Реализовать структуру «Рейтинг», представляющую собой не возрастающий +# набор натуральных чисел. У пользователя необходимо запрашивать новый +# элемент рейтинга. Если в рейтинге существуют элементы с одинаковыми +# значениями, то новый элемент с тем же значением должен разместиться после них. +# Подсказка. Например, набор натуральных чисел: 7, 5, 3, 3, 2. +# Пользователь ввел число 3. Результат: 7, 5, 3, 3, 3, 2. +# Пользователь ввел число 8. Результат: 8, 7, 5, 3, 3, 2. +# Пользователь ввел число 1. Результат: 7, 5, 3, 3, 2, 1. +# Набор натуральных чисел можно задать непосредственно в коде + +print('=== 5 ===') + +rating = [7, 5, 3, 3, 2] + +while True: + print( 'текущий рейтинг:', rating ) + val = int(input('введите очередное число в рейтинг, или 0 чтобы закончить: ')) + if not val: + break + + # rating.append( num ) # ну почему нельзя просто решить и надо искать сложный путь? ) + # rating.sort( reverse = True ) + + for i in range( len(rating)-1, -1, -1 ): + if val <= rating[i]: + rating.insert( i + 1, val ) + break + elif i == 0: + rating.insert( 0, val ) + break diff --git a/lesson02/home_work/from_manual-06.py b/lesson02/home_work/from_manual-06.py new file mode 100755 index 000000000..a014c4608 --- /dev/null +++ b/lesson02/home_work/from_manual-06.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +# 6. +# *Реализовать структуру данных «Товары». +# Она должна представлять собой список кортежей. +# Каждый кортеж хранит информацию об отдельном товаре. +# В кортеже должно быть два элемента — +# номер товара и словарь с параметрами +# (характеристиками товара: название, цена, количество, единица измерения). +# Структуру нужно сформировать программно, т.е. запрашивать все данные у пользователя. +# Необходимо собрать аналитику о товарах. Реализовать словарь, в котором каждый ключ — характеристика товара, например название, а значение — список значений-характеристик, например список названий товаров. +# Пример: +# { +# "название": ["компьютер", "принтер", "сканер"], +# "цена": [20000, 6000, 2000], +# "количество": [5, 2, 7], +# "ед": ["шт."] +# } + +print('=== 6 ===') + +from pprint import pprint +from collections import defaultdict + +fldnames = ['название', 'цена', 'количество', 'eд'] + +# Пример готовой структуры: +goods = [ +# (1, {"название": "компьютер", "цена": 20000, "количество": 5, "eд": "шт."}), +# (2, {"название": "принтер", "цена": 6000, "количество": 2, "eд": "шт."}), +# (3, {"название": "сканер", "цена": 2000, "количество": 7, "eд": "шт."}) +] + +i = 0 +while True: + i += 0 + good = {} + for fldname in fldnames: + val = input( f'товар #{i}: "{fldname}:" (пустая строка чтобы закончить): ' ) + if not val: + break + good[fldname] = int(val) if fldname in ['цена', 'количество'] else val + if len(good) < len(fldnames): + break + + goods.append( (i, good) ) + +# Строим "аналитику" + +analytics = defaultdict(list) +for fldname in fldnames: + for good in goods: + val = good[1][fldname] + analytics[ fldname ].append( val ) + +pprint( dict( analytics ) ) diff --git a/lesson02/home_work/hw02_easy.py b/lesson02/home_work/hw02_easy.py old mode 100644 new mode 100755 index ed4447e50..9db52d2cf --- a/lesson02/home_work/hw02_easy.py +++ b/lesson02/home_work/hw02_easy.py @@ -1,3 +1,7 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + # Задача-1: # Дан список фруктов. # Напишите программу, выводящую фрукты в виде нумерованного списка, @@ -13,13 +17,29 @@ # Подсказка: воспользоваться методом .format() +fruit_names = ["яблоко", "банан", "киви", "арбуз"] + +for i, fruit_name in enumerate( fruit_names ): + print( "{}. {:>10s}".format( i + 1, fruit_name ) ) # Задача-2: # Даны два произвольные списка. # Удалите из первого списка элементы, присутствующие во втором списке. +list1 = [1, 2, 4, 5, 6] +list2 = [2, 3, 6, 7] + +list1 = list( set(list1) - set(list2) ) + +print( list1 ) # Задача-3: # Дан произвольный список из целых чисел. # Получите НОВЫЙ список из элементов исходного, выполнив следующие условия: # если элемент кратен двум, то разделить его на 4, если не кратен, то умножить на два. + +dlist1 = [1, 2, 4, 5, 6, 7] + +dlist2 = [ d // 2 if d % 2 == 0 else d * 2 for d in dlist1 ] + +print( dlist2 ) diff --git a/lesson02/home_work/hw02_hard.py b/lesson02/home_work/hw02_hard.py old mode 100644 new mode 100755 index c96843184..8eca742c4 --- a/lesson02/home_work/hw02_hard.py +++ b/lesson02/home_work/hw02_hard.py @@ -1,10 +1,18 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + # Задание-1: уравнение прямой вида y = kx + b задано в виде строки. # Определить координату y точки с заданной координатой x. equation = 'y = -12x + 11111140.2121' x = 2.5 + # вычислите и выведите y +expression = equation.replace( 'x', '*{x}' ).replace( 'y = ', '' ).format( x = x ) + +print( expression, '=' ,eval( expression ) ) # Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. # Проверить, корректно ли введена дата. @@ -16,13 +24,28 @@ # 4. Длина исходной строки для частей должна быть в соответствии с форматом # (т.е. 2 символа для дня, 2 - для месяца, 4 - для года) -# Пример корректной даты -date = '01.11.1985' -# Примеры некорректных дат -date = '01.22.1001' -date = '1.12.1001' -date = '-2.10.3001' +dates = [ + '01.11.1985', '01.11.0001', '01.11.3001', '01.11.9999', + '01.22.1001', '1.12.1001', '-2.10.3001' +] + +from datetime import datetime, date +import re + +for datestr in dates: + thedate = None + + if re.match( r'\d{2}\.\d{2}\.\d{4}', datestr ): + try: + thedate = datetime.strptime( datestr, '%d.%m.%Y' ) + except: + pass + + if thedate: + print( datestr, '—', thedate.date() ) + else: + print( datestr, '—', 'Not a date!' ) # Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) @@ -53,4 +76,19 @@ # Выход: 6 2 # # Вход: 11 -# Выход: 5 3 \ No newline at end of file +# Выход: 5 3 + +def get_foor_and_room_number( n ): + n -= 1 + + block_base_floor = 0 + for block_num in range(1000000000): + count_of_rooms_in_block = block_num ** 2 + if n < count_of_rooms_in_block: + return block_base_floor + n // block_num, n % block_num + block_base_floor += block_num + n -= count_of_rooms_in_block + +for n in [11, 13, 2000000, 2000000000]: + floor_num, relative_room_num = get_foor_and_room_number( n ) + print( n, ':', floor_num + 1, relative_room_num + 1 ) diff --git a/lesson02/home_work/hw02_normal.py b/lesson02/home_work/hw02_normal.py old mode 100644 new mode 100755 index 3acfaabb6..1b9480689 --- a/lesson02/home_work/hw02_normal.py +++ b/lesson02/home_work/hw02_normal.py @@ -1,3 +1,7 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + # Задача-1: # Дан список, заполненный произвольными целыми числами, получите новый список, # элементами которого будут квадратные корни элементов исходного списка, @@ -5,21 +9,102 @@ # если такой корень вообще можно извлечь # Пример: Дано: [2, -5, 8, 9, -25, 25, 4] Результат: [3, 5, 2] +import math + +list1 = [2, -5, 8, 9, -25, 25, 4] + +list2 = [ + int(math.sqrt(d)) for d in list1 + if d >= 0 and math.sqrt(d) == int(math.sqrt(d)) +] -# Задача-2: Дана дата в формате dd.mm.yyyy, например: 02.11.2013. +print(list2) + + +# Задача-Дана дата в формате dd.mm.yyyy, например: 02.11.2013. # Ваша задача вывести дату в текстовом виде, например: второе ноября 2013 года. # Склонением пренебречь (2000 года, 2010 года) +datestr = '02.11.2013' + +days_names = [ + 'первое', + 'второе', + 'третье', + 'четвёртое', + 'пятое', + 'шестое', + 'седьмое', + 'восьмое', + 'девятое', + 'десятое', + 'одиннадцатое', + 'двенадцатое', + 'тринадцатое', + 'четырнадцатое', + 'пятнадцатое', + 'шестнадцатое', + 'семнадцатое', + 'восемнадцатое', + 'девятнадцатое', + 'двадцатое', + 'двадцать первое', + 'двадцать второе', + 'двадцать третье', + 'двадцать четвёртое', + 'двадцать пятое', + 'двадцать шестое', + 'двадцать седьмое', + 'двадцать восьмое', + 'двадцать девятое', + 'тридцатое', + 'тридцать первое', +] + +month_names = [ + 'января', + 'февраля', + 'марта', + 'апреля', + 'мая', + 'июня', + 'июля', + 'августа', + 'сентября', + 'октября', + 'ноября', + 'декабря', +] -# Задача-3: Напишите алгоритм, заполняющий список произвольными целыми числами +day, month, year = map( int, datestr.split('.') ) + +day_name = days_names[ day - 1 ] +month_name = month_names[ month - 1 ] + +print( f'{day_name} {month_name} {year} года' ) + +# Задача-Напишите алгоритм, заполняющий список произвольными целыми числами # в диапазоне от -100 до 100. В списке должно быть n - элементов. # Подсказка: # для получения случайного числа используйте функцию randint() модуля random +import random + +n = 12 +list3 = [ random.randint( -100, 100 ) for a in range(n) ] -# Задача-4: Дан список, заполненный произвольными целыми числами. +print(list3) + +# Задача-Дан список, заполненный произвольными целыми числами. # Получите новый список, элементами которого будут: # а) неповторяющиеся элементы исходного списка: # например, lst = [1, 2, 4, 5, 6, 2, 5, 2], нужно получить lst2 = [1, 2, 4, 5, 6] # б) элементы исходного списка, которые не имеют повторений: # например, lst = [1 , 2, 4, 5, 6, 2, 5, 2], нужно получить lst2 = [1, 4, 6] + +lst = [1, 2, 4, 5, 6, 2, 5, 2] +lst2 = list(set(lst)) +print(lst2) + +lst3 = [ i for i in lst2 if lst.count(i) == 1 ] +print(lst3) diff --git a/lesson03/home_work/from_manual-01.py b/lesson03/home_work/from_manual-01.py new file mode 100755 index 000000000..3a89d1621 --- /dev/null +++ b/lesson03/home_work/from_manual-01.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +import math + +# Реализовать функцию, принимающую два числа (позиционные аргументы) и выполняющую их деление. +# Числа запрашивать у пользователя, предусмотреть обработку ситуации деления на ноль. + +def div( numerator, denominator ): + try: + return numerator / denominator + except ZeroDivisionError: + return math.inf + +print( 'result:', div( float(input('numerator: ')), float(input('denominator: ')) ) ) diff --git a/lesson03/home_work/from_manual-02.py b/lesson03/home_work/from_manual-02.py new file mode 100755 index 000000000..976594601 --- /dev/null +++ b/lesson03/home_work/from_manual-02.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать функцию, принимающую несколько параметров, описывающих данные пользователя: +# имя, фамилия, год рождения, город проживания, email, телефон. +# Функция должна принимать параметры как именованные аргументы. +# Реализовать вывод данных о пользователе одной строкой. + +def print_user_info( first_name = None, last_name = None, birth_year = None, city = None, email = None, phone = None ): + print( f"{first_name} {last_name} из города {city}, {birth_year} г.р.; {email}, {phone}" ) + +print_user_info( + first_name = 'Валерий', + last_name = 'Студенников', + birth_year = 1978, + city = 'Самара', + email = 'despair@gmail.com', + phone = '+79272133862' +) diff --git a/lesson03/home_work/from_manual-03.py b/lesson03/home_work/from_manual-03.py new file mode 100755 index 000000000..957988984 --- /dev/null +++ b/lesson03/home_work/from_manual-03.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать функцию my_func(), которая принимает три позиционных аргумента, +# и возвращает сумму наибольших двух аргументов. + +def my_func( arg1, arg2, arg3 ): + return sum( sorted( [arg1, arg2, arg3] )[1:3] ) + +print( my_func( 1978, 1, 2 ) ) +print( my_func( 3, 2, 2 ) ) +print( my_func( 3, -55, 6 ) ) diff --git a/lesson03/home_work/from_manual-04.py b/lesson03/home_work/from_manual-04.py new file mode 100755 index 000000000..7c537baf7 --- /dev/null +++ b/lesson03/home_work/from_manual-04.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Программа принимает действительное положительное число x и целое отрицательное число y. +# Необходимо выполнить возведение числа x в степень y. +# Задание необходимо реализовать в виде функции my_func(x, y). +# При решении задания необходимо обойтись без встроенной функции возведения числа в степень. + +def sign( x ): + return (1, -1)[ x < 0] + +def my_pow( x, y ): + p = abs( y ) + for i in range(0, p): + x *= x + return x if y >= 0 else 1 / x + +print( my_pow( float(input('x (float): ')), int(input('y (int): ')) ) ) diff --git a/lesson03/home_work/from_manual-05.py b/lesson03/home_work/from_manual-05.py new file mode 100755 index 000000000..0ecfafc25 --- /dev/null +++ b/lesson03/home_work/from_manual-05.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Программа запрашивает у пользователя строку чисел, разделенных пробелом. +# При нажатии Enter должна выводиться сумма чисел. +# Пользователь может продолжить ввод чисел, разделенных пробелом и снова нажать Enter. +# Сумма вновь введенных чисел будет добавляться к уже подсчитанной сумме. +# Но если вместо числа вводится специальный символ, выполнение программы завершается. +# Если специальный символ введен после нескольких чисел, +# то вначале нужно добавить сумму этих чисел к полученной ранее сумме и после этого +# завершить программу. + +print('Введите ещё числа через пробел, либо вместо очередного числа любое нечисловое стоп-слово.') +current_sum = 0 +stop_flag = False +while True: + s = input('Давай числа: ') + words = s.split() + for word in words: + try: + num = float(word) + current_sum += num + except ValueError: + stop_flag = True + break + print('Текущая сумма чисел:', current_sum) + if stop_flag: + break diff --git a/lesson03/home_work/from_manual-06.py b/lesson03/home_work/from_manual-06.py new file mode 100755 index 000000000..80fe87dea --- /dev/null +++ b/lesson03/home_work/from_manual-06.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать функцию int_func(), принимающую слово из маленьких латинских букв и +# возвращающую его же, но с прописной первой буквой. +# Например, print(int_func(‘text’)) -> Text. +# +# Продолжить работу над заданием. В программу должна попадать строка из слов, +# разделенных пробелом. Каждое слово состоит из латинских букв в нижнем регистре. +# Сделать вывод исходной строки, но каждое слово должно начинаться с заглавной буквы. +# Необходимо использовать написанную ранее функцию int_func(). + +def int_func( word ): + return word[0].upper() + word[1:] + +words = input('string of words: ').split() +print( ' '.join([ int_func( word ) for word in words ]) ) + diff --git a/lesson03/home_work/hw03_easy.py b/lesson03/home_work/hw03_easy.py old mode 100644 new mode 100755 index 63d13f646..108bf58d8 --- a/lesson03/home_work/hw03_easy.py +++ b/lesson03/home_work/hw03_easy.py @@ -1,3 +1,7 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + # Задание-1: # Напишите функцию, округляющую полученное произвольное десятичное число # до кол-ва знаков (кол-во знаков передается вторым аргументом). @@ -5,7 +9,12 @@ # Для решения задачи не используйте встроенные функции и функции из модуля math. def my_round(number, ndigits): - pass + number = number * 10 ** ndigits + inumber = number // 1 + remainder = number - inumber + if remainder >= 0.5: + inumber += 1 + return inumber / 10 ** ndigits print(my_round(2.1234567, 5)) @@ -20,7 +29,12 @@ def my_round(number, ndigits): # !!!P.S.: функция не должна НИЧЕГО print'ить def lucky_ticket(ticket_number): - pass + ticket_number_str = str( ticket_number ) + if len(ticket_number_str) % 2 == 1: + return False + ticket_number_str_l = ticket_number_str[ : len(ticket_number_str) // 2 ] + ticket_number_str_r = ticket_number_str[ len(ticket_number_str) // 2 : ] + return sum( map( int, ticket_number_str_l ) ) == sum( map( int, ticket_number_str_r ) ) print(lucky_ticket(123006)) diff --git a/lesson03/home_work/hw03_hard.py b/lesson03/home_work/hw03_hard.py old mode 100644 new mode 100755 index a8c7f668a..ca3cac2c1 --- a/lesson03/home_work/hw03_hard.py +++ b/lesson03/home_work/hw03_hard.py @@ -9,6 +9,7 @@ # Ввод: -2/3 - -2 # Вывод: 1 1/3 +"Влом" # Задание-2: # Дана ведомость расчета заработной платы (файл "data/workers"). @@ -18,6 +19,7 @@ # они получают удвоенную ЗП, пропорциональную норме. # Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" +"Влом" # Задание-3: # Дан файл ("data/fruits") со списком фруктов. @@ -31,3 +33,5 @@ # Подсказка: # Чтобы получить список больших букв русского алфавита: # print(list(map(chr, range(ord('А'), ord('Я')+1)))) + +"Влом" diff --git a/lesson03/home_work/hw03_normal.py b/lesson03/home_work/hw03_normal.py old mode 100644 new mode 100755 index 38ac1fcc1..4b66d19d3 --- a/lesson03/home_work/hw03_normal.py +++ b/lesson03/home_work/hw03_normal.py @@ -1,9 +1,20 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + # Задание-1: # Напишите функцию, возвращающую ряд Фибоначчи с n-элемента до m-элемента. # Первыми элементами ряда считать цифры 1 1 -def fibonacci(n, m): - pass +def fibonacci( n, m ): + fib = [1, 1] + for i in range(2, m): + fib.append( fib[i-1] + fib[i-2] ) + return fib[ n - 1 : m ] + +print( fibonacci( 1, 3 ) ) +print( fibonacci( 2, 4 ) ) +print( fibonacci( 3, 7 ) ) # Задача-2: # Напишите функцию, сортирующую принимаемый список по возрастанию. @@ -11,17 +22,72 @@ def fibonacci(n, m): # Для решения данной задачи нельзя использовать встроенную функцию и метод sort() -def sort_to_max(origin_list): - pass +def sort_to_max(arr): + n = len(arr) + + for i in range(n): + for j in range(0, n-i-1): + if arr[j] > arr[j+1] : + arr[j], arr[j+1] = arr[j+1], arr[j] + + return arr -sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) + +print( sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) ) # Задача-3: # Напишите собственную реализацию стандартной функции filter. # Разумеется, внутри нельзя использовать саму функцию filter. +def my_filter( function, iterable ): + res = [] + for item in iterable: + if callable( function ) and function( item ) or item: + res.append( item ) + return res + +print( my_filter( None, [-1, 0, 1, 0, 0, 1, 0, -1, ''] ) ) +print( my_filter( int, [-1, 0, 1, 0, 0, 1, 0, -1] ) ) +print( my_filter( str, [-1, 0, 1, 0, 0, 1, 0, -1] ) ) +print( my_filter( bool, [-1, 0, 1, 0, 0, 1, 0, -1] ) ) # Задача-4: # Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). # Определить, будут ли они вершинами параллелограмма. +import collections + +def isParallelogram( points ): + # looping over all pairs of point to store their mid points + mid_point_map = collections.defaultdict(list) + for i in range(4): + for j in range(i + 1, 4): + mid_point = \ + (points[i][0] + points[j][0]) / 2.0, \ + (points[i][1] + points[j][1]) / 2.0 + + # storing point pair, corresponding to the mid point + mid_point_map[mid_point].append( (i, j) ) + + two, one = 0, 0 + + # looping over (midpoint, (corresponding pairs)) + # map to check the occurence of each midpoint + for v in mid_point_map.values(): + # updating midpoint count which occurs twice + if len(v) == 2: + two += 1 + # updating midpoing count which occurs once + elif len(v) == 1: + one += 1 + # if midpoint count is more than 2, then parallelogram is not possible + else: + return False + + # for parallelogram, one mid point should come + # twice and other mid points should come once + return two == 1 and one == 4 + +print( isParallelogram( ( (0, 0), (4, 0), (1, 3), (5, 3) ) ) ) +print( isParallelogram( ( (0, 0), (4, 0), (1, 3), (5, 3.1) ) ) ) +print( isParallelogram( ( (0, 0), (2, 0), (4, 0), (2, 2) ) ) ) diff --git a/lesson04/home_work/from_manual-01.py b/lesson04/home_work/from_manual-01.py new file mode 100755 index 000000000..d7f758cd1 --- /dev/null +++ b/lesson04/home_work/from_manual-01.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +import sys + +# Реализовать скрипт, в котором должна быть предусмотрена функция расчета +# заработной платы сотрудника. В расчете необходимо использовать формулу: +# (выработка в часах*ставка в час) + премия. +# Для выполнения расчета для конкретных значений необходимо запускать скрипт +# с параметрами. + +try: + working_hours, salary_per_hour, bounty = map( float, sys.argv[1:] ) + print( working_hours * salary_per_hour + bounty ) +except ValueError: + print('Usage: scriptname {working_hours} {salary_per_hour} {bounty}') + + diff --git a/lesson04/home_work/from_manual-02.py b/lesson04/home_work/from_manual-02.py new file mode 100755 index 000000000..c375d57cf --- /dev/null +++ b/lesson04/home_work/from_manual-02.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Представлен список чисел. Необходимо вывести элементы исходного списка, значения которых больше предыдущего элемента. +# Подсказка: элементы, удовлетворяющие условию, оформить в виде списка. Для формирования списка использовать генератор. + +a = [1, 2, 5, 7, 23, 65, 235, 6633, 34, 17, 7, 68, 334, 687, 0] + +print( [a[i] for i in range(len(a)-1) if a[i] > a[i+1]] ) diff --git a/lesson04/home_work/from_manual-03.py b/lesson04/home_work/from_manual-03.py new file mode 100755 index 000000000..27e92a388 --- /dev/null +++ b/lesson04/home_work/from_manual-03.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Для чисел в пределах от 20 до 240 найти числа, кратные 20 или 21. Необходимо решить задание в одну строку. +# Подсказка: использовать функцию range() и генератор. + +print( [ x for x in range(20,240+1) if x % 20 == 0 or x % 21 == 0 ] ) diff --git a/lesson04/home_work/from_manual-04.py b/lesson04/home_work/from_manual-04.py new file mode 100755 index 000000000..59f0a7092 --- /dev/null +++ b/lesson04/home_work/from_manual-04.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Представлен список чисел. Определить элементы списка, не имеющие повторений. +# Сформировать итоговый массив чисел, соответствующих требованию. +# Элементы вывести в порядке их следовани + +a = [1, 2, 5, 7, 23, 65, 235, 6633, 34, 17, 7, 68, 334, 687, 0, 1, 2, 3, 3, 5, 6, 7] + +print( [a[i] for i in range(len(a)) if a.count(a[i]) == 1] ) diff --git a/lesson04/home_work/from_manual-05.py b/lesson04/home_work/from_manual-05.py new file mode 100755 index 000000000..350ae36aa --- /dev/null +++ b/lesson04/home_work/from_manual-05.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать формирование списка, используя функцию range() и возможности генератора. +# В список должны войти четные числа от 100 до 1000 (включая границы). +# Необходимо получить результат вычисления произведения всех элементов списка. +# Подсказка: использовать функцию reduce(). + +from functools import reduce + +list = [ x for x in range(100,1000+1) if x % 2 == 0 ] + +print( reduce( lambda a, b: a * b, list) ) + diff --git a/lesson04/home_work/from_manual-06.py b/lesson04/home_work/from_manual-06.py new file mode 100755 index 000000000..31b007144 --- /dev/null +++ b/lesson04/home_work/from_manual-06.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать два небольших скрипта: +# а) бесконечный итератор, генерирующий целые числа, начиная с указанного, + +def numbers_start_from( n ): + while True: + yield n + n += 1 + +print('не понял на счёт функции count() — ведь numbers_start_from это и есть фактически реализация count...') + +# б) бесконечный итератор, повторяющий элементы некоторого списка, определенного заранее. +# Подсказка: использовать функцию count() и cycle() модуля itertools. + +print('я не понял... вы просите реализовать два итератора, которые УЖЕ реализованы в count() и cycle(), при том что просите при этом использовать count() и cycle()...') diff --git a/lesson04/home_work/from_manual-07.py b/lesson04/home_work/from_manual-07.py new file mode 100755 index 000000000..692dfd230 --- /dev/null +++ b/lesson04/home_work/from_manual-07.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать генератор с помощью функции с ключевым словом yield, создающим очередное значение. +# При вызове функции должен создаваться объект-генератор. +# Функция должна вызываться следующим образом: for el in fibo_gen(). +# Функция отвечает за получение факториала числа, а в цикле необходимо выводить только первые 15 чисел. +# Подсказка: факториал числа n — произведение чисел от 1 до n. +# Например, факториал четырёх 4! = 1 * 2 * 3 * 4 = 24. + +def fact_gen(): + fac = 1 + for n in range(1, 15 + 1): + fac *= n + yield fac + +for el in fact_gen(): + print( el ) diff --git a/lesson04/home_work/hw04_easy.py b/lesson04/home_work/hw04_easy.py old mode 100644 new mode 100755 index 85035ea8b..4d5a33446 --- a/lesson04/home_work/hw04_easy.py +++ b/lesson04/home_work/hw04_easy.py @@ -1,3 +1,8 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' +import math + # Все задачи текущего блока решите с помощью генераторов списков! # Задание-1: @@ -6,13 +11,25 @@ # квадратами элементов исходного списка # [1, 2, 4, 0] --> [1, 4, 16, 0] +a = [1, 2, 4, 0] +print( [ math.sqrt( x ) for x in a ] ) + # Задание-2: # Даны два списка фруктов. # Получить список фруктов, присутствующих в обоих исходных списках. +a = [ 'apple', 'banana', 'mango', 'orange' ] +b = [ 'pineapple', 'pine', 'mango', 'apple' ] + +print( [x for x in a if x in b] ) + # Задание-3: # Дан список, заполненный произвольными числами. # Получить список из элементов исходного, удовлетворяющих следующим условиям: # + Элемент кратен 3 # + Элемент положительный # + Элемент не кратен 4 + +a = [1, 2, 3, 4, -12, 12, 27, 9, 11] + +print( [x for x in a if x % 3 == 0 and x > 0 and x % 4 != 0] ) diff --git a/lesson04/home_work/hw04_hard.py b/lesson04/home_work/hw04_hard.py old mode 100644 new mode 100755 index 3b12dc315..56b5a2e8b --- a/lesson04/home_work/hw04_hard.py +++ b/lesson04/home_work/hw04_hard.py @@ -1,3 +1,9 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +from functools import reduce + # Задание-1: # Матрицы в питоне реализуются в виде вложенных списков: # Пример. Дано: @@ -7,12 +13,13 @@ # Выполнить поворот (транспонирование) матрицы # Пример. Результат: -# matrix_rotate = [[1, 3, 0], -# [0, 4, 4], -# [8, 1, 2]] # Суть сложности hard: Решите задачу в одну строку +print([ [line[0] for line in matrix], [line[1] for line in matrix], [line[2] for line in matrix] ]) + + + # Задание-2: # Найдите наибольшее произведение пяти последовательных цифр в 1000-значном числе. # Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр. @@ -39,6 +46,9 @@ 05886116467109405077541002256983155200055935729725 71636269561882670428252483600823257530420752963450""" +number = number.replace('\n','') + +print( max( reduce( lambda a, b: a * b, map( int, number[i:i+5] ) ) for i in range(len(number) - 4) ) ) # Задание-3 (Ферзи): # Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били @@ -47,3 +57,5 @@ # Программа получает на вход восемь пар чисел, # каждое число от 1 до 8 — координаты 8 ферзей. # Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. + +print( 'лень решать' ) diff --git a/lesson04/home_work/hw04_normal.py b/lesson04/home_work/hw04_normal.py old mode 100644 new mode 100755 index 739dd33f8..8e0cb484e --- a/lesson04/home_work/hw04_normal.py +++ b/lesson04/home_work/hw04_normal.py @@ -1,3 +1,9 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' +import re +from random import randint + # Задание-1: # Вывести символы в нижнем регистре, которые находятся вокруг # 1 или более символов в верхнем регистре. @@ -20,6 +26,10 @@ 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' +strs = re.findall(r'(?:(?<=[A-Z])|^)([a-z]+)(?:(?=[A-Z])|$)', line) +print( strs ) +print( 'без помощи re не хочу решать ;)' ) + # Задание-2: # Вывести символы в верхнем регистре, слева от которых находятся @@ -45,9 +55,25 @@ 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +strs = re.findall(r'(?<=[a-z]{2})([A-Z]+)(?=[A-Z]{2})', line_2) +print( strs ) +print( 'без помощи re не хочу решать ;)' ) + + # Задание-3: # Напишите скрипт, заполняющий указанный файл (самостоятельно задайте имя файла) # произвольными целыми цифрами, в результате в файле должно быть # 2500-значное произвольное число. # Найдите и выведите самую длинную последовательность одинаковых цифр # в вышезаполненном файле. + +f = open( 'digits.txt', 'w' ) +f.write( ''.join( str(randint(0,9)) for x in range(2500) ) ) +f.close() + +f = open( 'digits.txt', 'r' ) +digits = f.read() +f.close() +sdseq = re.findall( r'0{3,}|1{3,}|3{3,}|4{3,}|5{3,}|6{3,}|7{3,}|8{3,}|9{3,}', digits ) +sdseq.sort( key = lambda x: len(x) ) +print(sdseq[-1]) diff --git a/lesson05/home_work/firms.txt b/lesson05/home_work/firms.txt new file mode 100644 index 000000000..ea28c8d5a --- /dev/null +++ b/lesson05/home_work/firms.txt @@ -0,0 +1,6 @@ +Apple ОАО 1400000 1200000 +Microsoft ОАО 1100000 1100000 +Tesla ОАО 300000 1300000 +SkyEng ООО 70 60 +REG.RU ООО 34 22 +Нетология ООО 15 11 diff --git a/lesson05/home_work/from_manual-01.py b/lesson05/home_work/from_manual-01.py new file mode 100755 index 000000000..4daa99324 --- /dev/null +++ b/lesson05/home_work/from_manual-01.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создать программно файл в текстовом формате, +# записать в него построчно данные, вводимые пользователем. +# Об окончании ввода данных свидетельствует пустая строка. + +f = open('temp.txt', 'w') + +while True: + s = input('Введите строку для записи в файл: ') + if not s: + break + print( s, file = f ) + + +f.close() \ No newline at end of file diff --git a/lesson05/home_work/from_manual-02.py b/lesson05/home_work/from_manual-02.py new file mode 100755 index 000000000..ef94594a7 --- /dev/null +++ b/lesson05/home_work/from_manual-02.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создать текстовый файл (не программно), сохранить в нем несколько строк, +# выполнить подсчет количества строк, количества слов в каждой строке. + +f = open('myfile.txt', 'r') + +for i, line in enumerate(f): + print(i, ':',len(line.split())) + +print('Total lines:', i + 1) diff --git a/lesson05/home_work/from_manual-03.py b/lesson05/home_work/from_manual-03.py new file mode 100755 index 000000000..b34b8b91e --- /dev/null +++ b/lesson05/home_work/from_manual-03.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создать текстовый файл (не программно), построчно записать фамилии сотрудников и величину их окладов. +# Определить, кто из сотрудников имеет оклад менее 20 тыс., вывести фамилии этих сотрудников. +# Выполнить подсчет средней величины дохода сотрудников. + +f = open('salaries.txt', 'r') + +salary_sum, salary_cnt = 0, 0 + +for line in f: + name, salary = line.split() + salary = int(salary) + salary_sum += salary + salary_cnt += 1 + if salary < 20000: + print(name) + +print('Avg salary:', salary_sum / salary_cnt) diff --git a/lesson05/home_work/from_manual-04.py b/lesson05/home_work/from_manual-04.py new file mode 100755 index 000000000..02cc5dac2 --- /dev/null +++ b/lesson05/home_work/from_manual-04.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Необходимо написать программу, открывающую файл на чтение и считывающую построчно данные. При этом английские числительные должны заменяться на русские. Новый блок строк должен записываться в новый текстовый файл. + +import re + +f1 = open('numerals.txt', 'r') +f2 = open('numerals2.txt', 'w') + +re_list = [(r'One', 'Адын'), (r'Two', 'Два'), (r'Three', 'Три'), (r'Four', 'Четыре')] + +for line in f1: + for re1, re2 in re_list: + line = re.sub( re1, re2, line ) + f2.write( line ) + +f1.close() +f2.close() diff --git a/lesson05/home_work/from_manual-05.py b/lesson05/home_work/from_manual-05.py new file mode 100755 index 000000000..e24500236 --- /dev/null +++ b/lesson05/home_work/from_manual-05.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создать (программно) текстовый файл, записать в него программно набор чисел, разделенных пробелами. +# Программа должна подсчитывать сумму чисел в файле и выводить ее на экран. + +import random + +# пишем + +f = open('numbers.txt', 'w') +f.write( ' '.join([ str(random.randint(0,10)) for i in range(20) ]) ) +f.close() + +# читаем + +f = open('numbers.txt', 'r') + +print( sum( map( int, f.read().split() ) ) ) + +f.close() diff --git a/lesson05/home_work/from_manual-06.py b/lesson05/home_work/from_manual-06.py new file mode 100755 index 000000000..4c9aaeece --- /dev/null +++ b/lesson05/home_work/from_manual-06.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Необходимо создать (не программно) текстовый файл, где каждая строка описывает учебный предмет и +# аличие лекционных, практических и лабораторных занятий по этому предмету и их количество. +# Важно, чтобы для каждого предмета не обязательно были все типы занятий. +# Сформировать словарь, содержащий название предмета и общее количество занятий по нему. +# Вывести словарь на экран. + +# пишем + +f = open('subjects.txt', 'r') + +subjects = {} + +for line in f: + subject, lect, pract, lab = line.split() + subjects[subject] = int(lect) + int(pract) + int(lab) + +f.close() + +print( subjects ) diff --git a/lesson05/home_work/from_manual-07.py b/lesson05/home_work/from_manual-07.py new file mode 100755 index 000000000..afd64db0d --- /dev/null +++ b/lesson05/home_work/from_manual-07.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создать (не программно) текстовый файл, в котором каждая строка должна содержать данные о фирме: +# название, форма собственности, выручка, издержки. +# Необходимо вычислить прибыль каждой компании и среднюю прибыль. +# Реализовать список, содержащий словарь (название фирмы и прибыль) и словарь с одним элементом (средняя прибыль). +# Добавить в первый словарь еще один элемент, содержащий результат вычисления отношения прибыли к убыткам. +# Итоговый список сохранить в файл. +# Подсказка: использовать менеджеры контекста. + + +firms_profit = {} + +with open('firms.txt', 'r') as f: + for line in f: + firm, ownership, income, expences = line.split() + profit = int(income) - int(expences) + firms_profit[ firm ] = profit + + +the_list = [ firms_profit, ] + +""" +"Реализовать список, содержащий словарь (название фирмы и прибыль) и словарь с одним элементом (средняя прибыль)." + +1. Что за "словарь с одним элементом"? + +"Добавить в первый словарь еще один элемент, содержащий результат вычисления отношения прибыли к убыткам." + +2. Вообще ничего не понятно: +а) почему это в первый словарь записать, ведь там у нас прибыль по фирмам? причём тут соотношение прибылей и убытков, ведь оно не относится к конкретной фирме, а в этом словаре конкретные фирмы. +б) о каких вообще "убытках" речь? + +"Итоговый список сохранить в файл." +3. То есть сохранить список из двух словарей? Сохранить в JSON, как я понимаю? +""" diff --git a/lesson05/home_work/hw05_easy.py b/lesson05/home_work/hw05_easy.py old mode 100644 new mode 100755 index c6317de2b..24b844e5a --- a/lesson05/home_work/hw05_easy.py +++ b/lesson05/home_work/hw05_easy.py @@ -1,10 +1,41 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Задача-2: +# Напишите скрипт, отображающий папки текущей директории. + +import os + +def get_dirs(): + return [ f.name for f in os.scandir() if f.is_dir() ] + +print( get_dirs() ) + # Задача-1: # Напишите скрипт, создающий директории dir_1 - dir_9 в папке, # из которой запущен данный скрипт. # И второй скрипт, удаляющий эти папки. -# Задача-2: -# Напишите скрипт, отображающий папки текущей директории. +for i in range(1,10): + dirname = 'dir_' + str(i) + os.mkdir( dirname ) + +print( get_dirs() ) + +for i in range(1,10): + dirname = 'dir_' + str(i) + os.rmdir( dirname ) + +print( get_dirs() ) # Задача-3: # Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. + +import sys +import shutil + +shutil.copyfile( sys.argv[0], sys.argv[0] + '.copy' ) + +os.unlink( sys.argv[0] + '.copy' ) + diff --git a/lesson05/home_work/hw05_hard.py b/lesson05/home_work/hw05_hard.py old mode 100644 new mode 100755 diff --git a/lesson05/home_work/hw05_normal.py b/lesson05/home_work/hw05_normal.py old mode 100644 new mode 100755 diff --git a/lesson05/home_work/myfile.txt b/lesson05/home_work/myfile.txt new file mode 100644 index 000000000..7eb370e51 --- /dev/null +++ b/lesson05/home_work/myfile.txt @@ -0,0 +1,14 @@ +Практическое задание +1) Создать программно файл в текстовом формате, записать в него построчно данные, вводимые пользователем. Об окончании ввода данных свидетельствует пустая строка. +2) Создать текстовый файл (не программно), сохранить в нем несколько строк, выполнить подсчет количества строк, количества слов в каждой строке. +3) Создать текстовый файл (не программно), построчно записать фамилии сотрудников и величину их окладов. Определить, кто из сотрудников имеет оклад менее 20 тыс., вывести фамилии этих сотрудников. Выполнить подсчет средней величины дохода сотрудников. +4) Создать (не программно) текстовый файл со следующим содержимым: +One — 1 +Two — 2 +Three — 3 +Four — 4 +Необходимо написать программу, открывающую файл на чтение и считывающую построчно данные. При этом английские числительные должны заменяться на русские. Новый блок строк должен записываться в новый текстовый файл. +5) Создать (программно) текстовый файл, записать в него программно набор чисел, разделенных пробелами. Программа должна подсчитывать сумму чисел в файле и выводить ее на экран. +6) Необходимо создать (не программно) текстовый файл, где каждая строка описывает учебный предмет и наличие лекционных, практических и лабораторных занятий по этому предмету и их количество. Важно, чтобы для каждого предмета не обязательно были все типы занятий. Сформировать словарь, содержащий название предмета и общее количество занятий по нему. Вывести словарь на экран. +7) Создать (не программно) текстовый файл, в котором каждая строка должна содержать данные о фирме: название, форма собственности, выручка, издержки. Необходимо вычислить прибыль каждой компании и среднюю прибыль. Реализовать список, содержащий словарь (название фирмы и прибыль) и словарь с одним элементом (средняя прибыль). Добавить в первый словарь еще один элемент, содержащий результат вычисления отношения прибыли к убыткам. Итоговый список сохранить в файл. +Подсказка: использовать менеджеры контекста. diff --git a/lesson05/home_work/numerals.txt b/lesson05/home_work/numerals.txt new file mode 100644 index 000000000..a13d26b0f --- /dev/null +++ b/lesson05/home_work/numerals.txt @@ -0,0 +1,4 @@ +One — 1 +Two — 2 +Three — 3 +Four — 4 diff --git a/lesson05/home_work/salaries.txt b/lesson05/home_work/salaries.txt new file mode 100644 index 000000000..5869ba962 --- /dev/null +++ b/lesson05/home_work/salaries.txt @@ -0,0 +1,7 @@ +Иванов 70000 +Петров 35000 +Сидоров 15000 +Медведев 1750000 +Путин 2500000000000 +Васечкин 8500 +Курсавин 19900 diff --git a/lesson05/home_work/subjects.txt b/lesson05/home_work/subjects.txt new file mode 100644 index 000000000..ca39bd654 --- /dev/null +++ b/lesson05/home_work/subjects.txt @@ -0,0 +1,6 @@ +Физика 11 12 13 +Химия 39 29 14 +Литература 4 5 6 +Биология 70 60 50 +Психология 34 22 43 +Нумерология 99 11 0 diff --git a/lesson06/home_work/from_manual-01.py b/lesson06/home_work/from_manual-01.py new file mode 100755 index 000000000..d907d39b2 --- /dev/null +++ b/lesson06/home_work/from_manual-01.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создать класс TrafficLight (светофор) +# и определить у него один атрибут color (цвет) +# и метод running (запуск). +# Атрибут реализовать как приватный. +# В рамках метода реализовать переключение светофора в режимы: красный, желтый, зеленый. +# Время перехода между режимами должно составлять 7 и 2 секунды. +# Проверить работу примера, создав экземпляр и вызвав описанный метод. + +import time + +class TrafficLight(): + def __init__( self, color = 'G' ): + self.__color = color + + @property + def color( self ): + return self.__color + + # я не понял про "Время перехода между режимами должно составлять 7 и 2 секунды." + # делаю как понял + def next_color( self ): + if self.__color == 'G': + self.__turn_red = True + time.sleep(7) + self.__color = 'Y' + elif self.__color == 'R': + self.__turn_red = False + time.sleep(7) + self.__color = 'Y' + else: + time.sleep(2) + self.__color = 'R' if self.__turn_red else 'G' + +t = TrafficLight() +print( t.color ) +t.next_color() +print( t.color ) +t.next_color() +print( t.color ) +t.next_color() +print( t.color ) +t.next_color() +print( t.color ) +t.next_color() +print( t.color ) +t.next_color() +print( t.color ) diff --git a/lesson06/home_work/from_manual-02.py b/lesson06/home_work/from_manual-02.py new file mode 100755 index 000000000..01b1984e6 --- /dev/null +++ b/lesson06/home_work/from_manual-02.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать класс Road (дорога), в котором определить атрибуты: +# length (длина), width (ширина). +# Значения данных атрибутов должны передаваться при создании экземпляра класса. +# Атрибуты сделать защищенными. +# Определить метод расчета массы асфальта, необходимого для покрытия всего дорожного полотна. +# Использовать формулу: длина * ширина * масса асфальта для покрытия одного кв метра дороги асфальтом, толщиной в 1 см*число см толщины полотна. Проверить работу метода. +# Например: 20м*5000м*25кг*5см = 12500 т + +import time + +class Road(): + def __init__( self, length, width ): + self._length = length + self._width = width + + @property + def length( self ): + return self._length + + @property + def width( self ): + return self._width + + def asphalt_mass( self, thickness, mass_of_1sqm_asphalt_1cm ): + return self._length * self._width * thickness * mass_of_1sqm_asphalt_1cm + +road_to_paradize = Road( 5000, 20 ) +print( road_to_paradize.asphalt_mass( 5, 25 ) / 1000, 'tons' ) diff --git a/lesson06/home_work/from_manual-03.py b/lesson06/home_work/from_manual-03.py new file mode 100755 index 000000000..ecd1efcd5 --- /dev/null +++ b/lesson06/home_work/from_manual-03.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать базовый класс Worker (работник), в котором определить атрибуты: +# name, surname, position (должность), income (доход). +# Последний атрибут должен быть защищенным и ссылаться на словарь, +# содержащий элементы: оклад и премия, например, {"profit": profit, "bonus": bonus}. +# Создать класс Position (должность) на базе класса Worker. +# В классе Position реализовать методы получения полного имени сотрудника (get_full_name) +# и дохода с учетом премии (get_full_profit). +# Проверить работу примера на реальных данных (создать экземпляры класса Position, +# передать данные, проверить значения атрибутов, вызвать методы экземпляров). + +class Worker(): + def __init__( self, name, surname, position, salary, bonus ): + self.name = name + self.surname = surname + self.position = position + self._income = { "salary" : salary, "bonus" : bonus } + + @property + def income( self ): + return self._income + +class Position(Worker): + def get_full_name( self ): + return self.name + " " + self.surname + + def get_total_income( self ): + return self._income['salary'] + self._income['bonus'] + +p1 = Position( 'Валерий', 'Студенников', 'директор', 165000, 1000000 ) +print( p1.get_full_name(), 'получает', p1.get_total_income() ) + diff --git a/lesson06/home_work/from_manual-04.py b/lesson06/home_work/from_manual-04.py new file mode 100755 index 000000000..f30382d81 --- /dev/null +++ b/lesson06/home_work/from_manual-04.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Опишите несколько классов: TownCar, SportCar, WorkCar, PoliceCar. +# У каждого класса должны быть следующие атрибуты: speed, color, name, is_police (булево). +# А также несколько методов: go, stop, turn(direction), которые должны сообщать, +# что машина поехала, остановилась, повернула (куда). + +class Car(): + speed = None + color = None + name = None + is_police = False + + def go(self): + print('started') + + def stop(self): + print('stopped') + + def turn(self, direction): + print('turned', direction) + +class TownCar(Car): + speed = 80 + color = 'yellow' + name = 'Smart' + +class SportCar(Car): + speed = 270 + color = 'red' + name = 'Lamborghini' + +class WorkCar(Car): + speed = 110 + color = 'black' + name = 'Волга' + +class PoliceCar(Car): + speed = 170 + is_police = True + color = 'white' + name = 'renauld' + + +car = TownCar() +print( car.speed, car.name, car.color, car.is_police ) +car.go() +car.turn('left') +car.turn('right') +car.stop() + +car = SportCar() +print( car.speed, car.name, car.color, car.is_police ) +car.go() +car.turn('left') +car.turn('right') +car.stop() + +car = WorkCar() +print( car.speed, car.name, car.color, car.is_police ) +car.go() +car.turn('left') +car.turn('right') +car.stop() + +car = PoliceCar() +print( car.speed, car.name, car.color, car.is_police ) +car.go() +car.turn('left') +car.turn('right') +car.stop() diff --git a/lesson06/home_work/from_manual-05.py b/lesson06/home_work/from_manual-05.py new file mode 100755 index 000000000..4452fd4ba --- /dev/null +++ b/lesson06/home_work/from_manual-05.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать класс Stationery (канцелярская принадлежность). +# Определить в нем атрибут title (название) и метод draw (отрисовка). +# Метод выводит сообщение “Запуск отрисовки.” +# Создать три дочерних класса Pen (ручка), Pencil (карандаш), Handle (маркер). +# В каждом из классов реализовать переопределение метода draw. +# Для каждого из классов методы должен выводить уникальное сообщение. +# Создать экземпляры классов и проверить, +# что выведет описанный метод для каждого экземпляра. + + +class Stationery(): + title = None + + def draw(self): + print('Запуск отрисовки.') + +class Pen(Stationery): + title = 'ручка' + def draw(self): + print('Рисую ручкой.') + +class Pencil(Stationery): + title = 'карандаш' + def draw(self): + print('Рисую карандашом.') + +class Handle(Stationery): + title = 'маркер' + def draw(self): + print('Рисую маркером.') + +abstr = Stationery() +abstr.draw() + +pen = Pen() +pen.draw() + +pencil = Pencil() +pencil.draw() + +handle = Handle() +handle.draw() diff --git a/lesson06/home_work/hw06_easy.py b/lesson06/home_work/hw06_easy.py old mode 100644 new mode 100755 index fe5dc2b11..065e4d80c --- a/lesson06/home_work/hw06_easy.py +++ b/lesson06/home_work/hw06_easy.py @@ -1,9 +1,113 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + # Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. # Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. +import math + +class Triangle: + def __init__(self, x1, y1, x2, y2, x3, y3): + self.x1 = x1 + self.y1 = y1 + self.x2 = x2 + self.y2 = y2 + self.x3 = x3 + self.y3 = y3 + # найдём длины сторон + self.a = math.sqrt( (x1 - x2)**2 + (y1 - y2)**2 ) + self.b = math.sqrt( (x3 - x2)**2 + (y3 - y2)**2 ) + self.c = math.sqrt( (x3 - x1)**2 + (y3 - y1)**2 ) + + def perimeter(self): + return self.a + self.b + self.c + + def square(self): + p = self.perimeter() / 2.0 + return math.sqrt( p * (p - self.a) * (p - self.b) * (p - self.c) ) + + +t = Triangle( 0, 0, 0, 1, 1, 0 ) +print( t.perimeter(), t.square() ) # Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. # Предусмотреть в классе методы: # проверка, является ли фигура равнобочной трапецией; # вычисления: длины сторон, периметр, площадь. +# "прмерное сравнение" +def approx_eq( x, y ): + return abs( x - y ) < 0.00001 + +class Trapezoid: + # точки — массив или кортеж кортежей + # точки должны быть заданы ПОСЛЕДОВАТЕЛЬНО, а не крест-накрест + def __init__(self, points): + self.points = tuple(points) + + # считаем длины сторон + def side_lengths(self): + points = self.points + + side_lengths = [] + for i in range(4): + p1 = points[0] + p2 = points[1] + points = points[1:]+(points[0],) + side_length = math.sqrt( (p2[0] - p1[0])**2 + (p2[1] - p1[1])**2 ) + side_lengths.append( side_length ) + return side_lengths + + # проверка является ли равнобочной трапецией? + def is_isosceles(self): + points = self.points + # должны быть равны две боковых стороны, а также должны быть равны диагонали + + # смотрим есть ли две одинаковые стороны + side_lengths = self.side_lengths() + have_eq_sides = 0 + for i in range(4): + for j in range(i,4): + have_eq_sides += approx_eq( side_lengths[i], side_lengths[j] ) + if not have_eq_sides: + return False + + # длины диагоналей находим + d1 = math.sqrt( (points[2][0] - points[0][0])**2 + (points[2][1] - points[0][1])**2 ) + d2 = math.sqrt( (points[3][0] - points[1][0])**2 + (points[3][1] - points[1][1])**2 ) + + return approx_eq( d1, d2 ) + + # считаем периметр + def perimeter(self): + return sum( self.side_lengths() ) + + # считаем площадь + def square(self): + side_lengths = self.side_lengths() + if approx_eq( side_lengths[1], side_lengths[3] ): + # align points + side_lengths = side_lengths[1:] + [side_lengths[0]] + + # Формула площади через стороны: + c = side_lengths[0] + a = side_lengths[1] + b = side_lengths[-1] + return (a + b) / 4 * math.sqrt( 4 * c**2 - (a - b)**2 ) + + +t1 = Trapezoid( ((0,0), (1,2), (3,2), (4, 0)) ) +print( 't1 is_isosceles:', t1.is_isosceles() ) +print( 't1 perimeter:', t1.perimeter() ) +print( 't1 square:', t1.square() ) + +t2 = Trapezoid( ((-0.5,0), (1,2), (3,2), (4, 0)) ) +print( 't2 is_isosceles:', t2.is_isosceles() ) +print( 't2 perimeter:', t2.perimeter() ) +print( 't2 square:', t2.square() ) + +t3 = Trapezoid( ((0,1), (1,2), (2,1), (1, 0)) ) +print( 't3 is_isosceles:', t3.is_isosceles() ) +print( 't3 perimeter:', t3.perimeter() ) +print( 't3 square:', t3.square() ) diff --git a/lesson06/home_work/hw06_hard.py b/lesson06/home_work/hw06_hard.py old mode 100644 new mode 100755 diff --git a/lesson06/home_work/hw06_normal.py b/lesson06/home_work/hw06_normal.py old mode 100644 new mode 100755 index 01c3982f4..d66c74aac --- a/lesson06/home_work/hw06_normal.py +++ b/lesson06/home_work/hw06_normal.py @@ -1,3 +1,7 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + # Задание-1: # Реализуйте описаную ниже задачу, используя парадигмы ООП: # В школе есть Классы(5А, 7Б и т.д.), в которых учатся Ученики. @@ -7,11 +11,165 @@ # Т.е. Учитель Иванов может преподавать математику у 5А и 6Б, # но больше математику не может преподавать никто другой. +class School(): + def __init__(self, name, classes): + self.name = name + self.classes = classes + + def print_class_names(self): + print('Список классов школы ' + self.name + ':') + for i, cls in enumerate(self.classes): + print( '%d. %s' % (i, cls.name) ) + print() + +class SchoolClass(): + def __init__( self, name, teachers ): + self.name = name + self.pupils = [] + self.teachers = teachers + + def add_pupul( self, pupil ): + pupil.learns_in = self + self.pupils.append( pupil ) + + def get_pupuls_names( self ): + return [ pupil.get_short_name() for pupil in self.pupils ] + + def print_pupils( self ): + print('Список учеников класса ' + self.name + ':') + for i, pupul_name in enumerate( self.get_pupuls_names() ): + print( '%d. %s' % (i, pupul_name) ) + print() + + def print_teachers( self ): + print('Список учителей класса ' + self.name + ':') + for i, teacher in enumerate( self.teachers ): + print( '%d. %s' % (i, teacher.full_name) ) + print() + +class SchoolSubject(): + def __init__( self, name ): + self.name = name + +class Pupil(): + def __init__( self, name, surname, patronimic, father, mother ): + self.name = name + self.surname = surname + self.patronimic = patronimic + self.father = father + self.mother = mother + self.learns_in = mother + + def get_full_name(self): + return self.surname + ' ' + self.name + ' ' + self.patronimic + + def get_short_name(self): + return self.surname + ' ' + self.name[0] + '. ' + self.patronimic[0] + '.' + + def print_subjects(self): + print('Предметы ученика ' + self.get_full_name() + ':') + for i, teacher in enumerate( self.learns_in.teachers ): + print( '%d. %s' % (i, teacher.subject.name) ) + print() + + def print_parents_names(self): + print('Родители ученика ' + self.get_full_name() + ':') + print(' отец:', self.father.get_full_name() ) + print(' мать:', self.mother.get_full_name() ) + +class Parent(): + def __init__( self, name, surname, patronimic ): + self.name = name + self.surname = surname + self.patronimic = patronimic + + def get_full_name(self): + return self.surname + ' ' + self.name + ' ' + self.patronimic + +class Teacher(): + def __init__( self, subject, full_name ): + self.subject = subject + self.teach_classes = [] + self.full_name = full_name + # Выбранная и заполненная данными структура должна решать следующие задачи: + +subj_mat = SchoolSubject('математика') +subj_phi = SchoolSubject('физика') +subj_pol = SchoolSubject('политология') +subj_lit = SchoolSubject('литература') +subj_bio = SchoolSubject('биология') +subj_che = SchoolSubject('химия') + +teacher_mat1 = Teacher(subj_mat, 'Математичкина Ирина Петровна') +teacher_mat2 = Teacher(subj_mat, 'Рене Декарт') +teacher_phi1 = Teacher(subj_phi, 'Физичкин Михаил Флорович') +teacher_phi2 = Teacher(subj_phi, 'Ландау Лев Давидович') +teacher_pol1 = Teacher(subj_pol, 'Шульман Екатерина') +teacher_lit1 = Teacher(subj_lit, 'Пришвин Михаил Александрович') +teacher_lit2 = Teacher(subj_lit, 'Пушкин Александр Сергеевич') +teacher_bio1 = Teacher(subj_bio, 'Дарвин Чарльз Леопольдович') +teacher_che1 = Teacher(subj_che, 'Менделеев Дмитрий Иванович') + +class1 = SchoolClass('5А', [teacher_mat1, teacher_lit1]) +class2 = SchoolClass('7Б', [teacher_mat1, teacher_lit2, teacher_phi1]) +class3 = SchoolClass('11В', [teacher_mat2, teacher_lit2, teacher_phi2, teacher_pol1, teacher_bio1, teacher_che1]) + +school = School( '146 г. Самара', [class1, class2, class3] ) + +parent1 = Parent('Отец', 'Опекун', 'Опекунович') +parent2 = Parent('Мать', 'Строгая', 'Злюковна') +parent3 = Parent('Инженер', 'Здоровов', 'Блядинович') +parent4 = Parent('Мария', 'Мертвова', 'Блядиновна') +parent5 = Parent('Сергей', 'Перевывустов', 'Мониторович') +parent6 = Parent('Алефтина', 'Клаустрова', 'Миноровна') + +pupil1 = Pupil( 'Иванов', 'Иван', 'Иванович', parent1, parent2 ) +pupil2 = Pupil( 'Сынок', 'Маменькин', 'Какеготамович', parent1, parent2 ) +pupil3 = Pupil( 'Пиздос', 'Пиздосов', 'Нехорошевич', parent4, parent3 ) +pupil4 = Pupil( 'Клава', 'Клюшкина', 'Петровна', parent5, parent6 ) +pupil5 = Pupil( 'Глюколь', 'Морквашова', 'Объебоссовна', parent1, parent4 ) +pupil6 = Pupil( 'Валерий', 'Мормыш', 'Карабасович', parent3, parent2 ) +pupil7 = Pupil( 'Муркан', 'Мышеловкин', 'Бабасович', parent3, parent6 ) +pupil8 = Pupil( 'Михаил', 'Клей', 'Ухлёстович', parent5, parent4 ) +pupil9 = Pupil( 'Филёна', 'Слугина', 'Барбарисовна', parent3, parent6 ) + +class1.add_pupul( pupil1 ) +class1.add_pupul( pupil2 ) +class1.add_pupul( pupil3 ) +class2.add_pupul( pupil4 ) +class2.add_pupul( pupil5 ) +class2.add_pupul( pupil6 ) +class3.add_pupul( pupil7 ) +class3.add_pupul( pupil8 ) +class3.add_pupul( pupil9 ) + # 1. Получить полный список всех классов школы + +school.print_class_names() + # 2. Получить список всех учеников в указанном классе # (каждый ученик отображается в формате "Фамилия И.О.") + +class1.print_pupils() +class2.print_pupils() +class3.print_pupils() + # 3. Получить список всех предметов указанного ученика # (Ученик --> Класс --> Учителя --> Предметы) + +pupil1.print_subjects() +pupil4.print_subjects() +pupil7.print_subjects() + # 4. Узнать ФИО родителей указанного ученика + +pupil2.print_parents_names() +pupil5.print_parents_names() +pupil8.print_parents_names() + # 5. Получить список всех Учителей, преподающих в указанном классе + +class1.print_teachers() +class2.print_teachers() +class3.print_teachers() diff --git a/lesson07/home_work/from_manual-01.py b/lesson07/home_work/from_manual-01.py new file mode 100755 index 000000000..1d3dffb8b --- /dev/null +++ b/lesson07/home_work/from_manual-01.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод __init__()), который должен принимать данные (список списков) для формирования матрицы. +# Подсказка: матрица — система некоторых математических величин, расположенных в виде прямоугольной схемы. +class Matrix(): + def __init__( self, arr ): + self.arr = arr + + # Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в привычном виде. + def __str__( self ): + return '\n'.join( str(s) for s in self.arr ) + + + # Далее реализовать перегрузку метода __add__() для реализации операции сложения двух объектов класса Matrix (двух матриц). Результатом сложения должна быть новая матрица. + # Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки первой матрицы складываем с первым элементом первой строки второй матрицы и т.д. + def __add__( self, other ): + return Matrix( [[j[0] + j[1] for j in zip(i[0], i[1])] for i in zip( self.arr, other.arr )] ) + + + +matrix1 = Matrix([ [31, 22],[37,43],[51,86] ]) +matrix2 = Matrix([ [3, 5, 32], [2, 4, 6], [-1, 64, -8] ]) +matrix3 = Matrix([ [3, 5, 8, 3], [8, 3, 7, 1] ]) +matrix4 = Matrix([ [-1, -1],[0,0],[-2,-2] ]) + +print( 'matrix1:', matrix1, end = '\n\n', sep = '\n' ) +print( 'matrix2:', matrix2, end = '\n\n', sep = '\n' ) +print( 'matrix2:', matrix3, end = '\n\n', sep = '\n' ) +print( 'matrix4:', matrix4, end = '\n\n', sep = '\n' ) + +print( 'matrix1 + matrix4:', matrix1 + matrix4, end = '\n\n', sep = '\n' ) diff --git a/lesson07/home_work/from_manual-02.py b/lesson07/home_work/from_manual-02.py new file mode 100755 index 000000000..2d16d53d3 --- /dev/null +++ b/lesson07/home_work/from_manual-02.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать проект расчета суммарного расхода ткани на производство одежды. +# Основная сущность (класс) этого проекта — одежда, которая может иметь определенное название. +# К типам одежды в этом проекте относятся пальто и костюм. +# У этих типов одежды существуют параметры: размер (для пальто) и рост (для костюма). +# Это могут быть обычные числа: V и H, соответственно. + +# Для определения расхода ткани по каждому типу одежды использовать формулы: +# для пальто (V/6.5 + 0.5), для костюма (2*H + 0.3). +# Проверить работу этих методов на реальных данных. +# Реализовать общий подсчет расхода ткани. +# Проверить на практике полученные на этом уроке знания: реализовать абстрактные +# классы для основных классов проекта, проверить на практике работу декоратора @property. + +from abc import ABC, abstractmethod + +class Clothing(ABC): + name = None + + @abstractmethod + def __init__(self): + pass + + @abstractmethod + def __str__(self): + pass + + @property + @abstractmethod + def fabric_consumption(self): + pass + +class Coat(Clothing): + name = 'пальто' + + def __init__(self, v): + self.v = v + + def __str__(self): + return '[' + self.name + ' размера ' + str(self.v) + ']' + + @property + def fabric_consumption(self): + return self.v / 6.5 + 0.5 + +class Suit(Clothing): + name = 'костюм' + + def __init__(self, h): + self.h = h + + def __str__(self): + return '[' + self.name + ' размера ' + str(self.h) + ']' + + @property + def fabric_consumption(self): + return 2 * self.h + 0.3 + +coat = Coat( 52 ) + +print( coat, '; ткани надо:', coat.fabric_consumption ) + +suit = Suit( 191 ) + +print( suit, '; ткани надо:', suit.fabric_consumption ) diff --git a/lesson07/home_work/from_manual-03.py b/lesson07/home_work/from_manual-03.py new file mode 100755 index 000000000..86ddd9978 --- /dev/null +++ b/lesson07/home_work/from_manual-03.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать программу работы с органическими клетками, состоящими из ячеек. +# Необходимо создать класс Клетка. +# В его конструкторе инициализировать параметр, соответствующий количеству ячеек клетки (целое число). +# В классе должны быть реализованы методы перегрузки арифметических операторов: +# сложение (__add__()), вычитание (__sub__()), умножение (__mul__()), деление (__truediv__()). +# Данные методы должны применяться только к клеткам и выполнять +# увеличение, уменьшение, умножение и обычное (не целочисленное) деление клеток, соответственно. +# В методе деления должно осуществляться округление значения до целого числа. + +class Cell(): + def __init__( self, size ): + self.size = size + + def __str__( self ): + return "Cell(size:{})".format( self.size ) + + # Перегружаем оператор + + def __add__( self, other ): + return Cell( self.size + other.size ) + + # Перегружаем оператор - + def __sub__( self, other ): + new_size = self.size - other.size + if new_size > 0: + return Cell( new_size ) + else: + raise ArithmeticError( new_size ) + + # Перегружаем оператор * + def __mul__( self, other ): + return Cell( self.size * other.size ) + + # Перегружаем оператор * + def __truediv__( self, other ): + return Cell( self.size // other.size ) + + # string representation + def make_order( self, rowsize ): + residual = self.size + strres = '' + while residual: + thisrowsize = rowsize if residual >= rowsize else residual + strres += '*' * thisrowsize + residual -= thisrowsize + return strres + + +c5 = Cell(5) +c6 = Cell(6) + +print( 'add: c5 + c6:', c5 + c6 ) + +print( 'sub: c6 - c5:', c6 - c5 ) + +try: + print( c5 - c6 ) +except ArithmeticError: + print( 'sub: c5 - c6: Wrong sub args' ) + +print( 'mul: c5 * c6:', c5 * c6 ) + +print( 'div: c5 / c6:', c5 / c6 ) + +print( 'div: c6 / c5:', c6 / c5 ) diff --git a/lesson08/home_work/from_manual-1.py b/lesson08/home_work/from_manual-1.py new file mode 100755 index 000000000..3758a4922 --- /dev/null +++ b/lesson08/home_work/from_manual-1.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать класс «Дата», функция-конструктор которого должна принимать дату +# в виде строки формата «день-месяц-год». +# В рамках класса реализовать два метода. +# Проверить работу полученной структуры на реальных данных. + +import re + +# предпочитаю формат YYYY-MM-DD, который и буду реализовывать +class MyDate(): + def __init__( self, datestr ): + yearnum, monthnum, daynum = self.parse_datestr( datestr ) + if MyDate.verify_ymd( yearnum, monthnum, daynum ): + self.yearnum = yearnum + self.monthnum = monthnum + self.daynum = daynum + + def __str__( self ): + return "MyDate(%04d-%02d-%02d)" % ( self.yearnum, self.monthnum, self.daynum ) + + + # Первый, с декоратором @classmethod, должен извлекать число, месяц, + # год и преобразовывать их тип к типу «Число». + @classmethod + def parse_datestr( cls, datestr ): + match = re.match( r'(\d{4})-(\d{2})-(\d{2})', datestr ) # ([12]\d{3})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) + if match: + return int(match.group(1)), int(match.group(2)), int(match.group(3)) + else: + raise ValueError( "date format " + datestr + " doesn't match pattern YYYY-MM-DD" ) + + # Второй, с декоратором @staticmethod, должен проводить валидацию числа, + # месяца и года (например, месяц — от 1 до 12). + @staticmethod + def verify_ymd( yearnum, monthnum, daynum ): + if not( yearnum >= 1000 and yearnum <= 2999 ): + raise ValueError( "wrong year: " + str(yearnum) ) + if not( monthnum >= 1 and monthnum <= 12 ): + raise ValueError( "wrong month: " + str(monthnum) ) + if not( daynum >= 1 and daynum <= 31 ): + raise ValueError( "wrong day: " + str(daynum) ) + return True + + +try: + d = MyDate('3456-ЩЩ-ММММ') + print(d) +except Exception as e: + print( e ) + +try: + d = MyDate('3456-12-31') + print(d) +except Exception as e: + print( e ) + +try: + d = MyDate('1212-21-23') + print(d) +except Exception as e: + print( e ) + +try: + d = MyDate('1456-12-41') + print(d) +except Exception as e: + print( e ) + +try: + d = MyDate('2019-12-31') + print(d) +except Exception as e: + print( e ) diff --git a/lesson08/home_work/from_manual-2.py b/lesson08/home_work/from_manual-2.py new file mode 100755 index 000000000..69aa3189a --- /dev/null +++ b/lesson08/home_work/from_manual-2.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создайте собственный класс-исключение, обрабатывающий ситуацию деления на нуль. +# Проверьте его работу на данных, вводимых пользователем. +# При вводе пользователем нуля в качестве делителя программа должна корректно +# обработать эту ситуацию и не завершиться с ошибкой. + +class DivByZeroException(Exception): + def __str__(self): + return "Can't didivde by zero!" + +def try_divide( numerator, denominator ): + if denominator == 0: + raise DivByZeroException() + else: + return numerator / denominator + +while True: + numerator = int(input('numerator: ')) + denominator = int(input('denominator: ')) + + try: + print('{} / {} = {}'.format( numerator, denominator, try_divide( numerator, denominator ) ) ) + except DivByZeroException as e: + print( e ) diff --git a/lesson08/home_work/from_manual-3.py b/lesson08/home_work/from_manual-3.py new file mode 100755 index 000000000..60aeeed32 --- /dev/null +++ b/lesson08/home_work/from_manual-3.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Создайте собственный класс-исключение, который должен проверять содержимое списка +# на отсутствие элементов типа строка и булево. Проверить работу исключения на +# реальном примере. Необходимо запрашивать у пользователя данные и заполнять список. +# Класс-исключение должен контролировать типы данных элементов списка. + +class StrOrBoolException(Exception): + def __str__(self): + return "List can't contain string or bool values!" + +class CleanList(list): + def __init__(self, content): + super().__init__(content) + for x in content: + if type(x) is str or type(x) is bool: + raise StrOrBoolException() + +# Я не очень понимаю как это пользователь будет вводить +# различные типа данных, когда он может вводить только строки. +# Так что попробуем предопределённые списки + +try: + l = CleanList( [ 1, 2, 3, 4, 5] ) + print(l) +except StrOrBoolException as e: + print(e) + +try: + l = CleanList( [ 1, 2, 3, 4, 5, 'str'] ) + print(l) +except StrOrBoolException as e: + print(e) + +try: + l = CleanList( [ 1, 2, True, 4, 5] ) + print(l) +except StrOrBoolException as e: + print(e) diff --git a/lesson08/home_work/from_manual-456.py b/lesson08/home_work/from_manual-456.py new file mode 100755 index 000000000..1f09b2309 --- /dev/null +++ b/lesson08/home_work/from_manual-456.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. +# А также класс «Оргтехника», который будет базовым для классов-наследников. +# Эти классы — конкретные типы оргтехники (принтер, сканер, ксерокс). +# В базовом классе определить параметры, общие для приведенных типов. +# В классах-наследниках реализовать параметры, уникальные для каждого типа оргтехники. + +# Продолжить работу над первым заданием. +# Разработать методы, отвечающие за приём оргтехники на склад и передачу +# в определенное подразделение компании. +# Для хранения данных о наименовании и количестве единиц оргтехники, +# а также других данных, можно использовать любую подходящую структуру, например словарь. + +# Продолжить работу над вторым заданием. +# Реализуйте механизм валидации вводимых пользователем данных. +# Например, для указания количества принтеров, отправленных на склад, +# нельзя использовать строковый тип данных. +# Подсказка: постарайтесь по возможности реализовать в проекте «Склад оргтехники» +# максимум возможностей, изученных на уроках по ООП. +# --> я буду только контролировать цену и вес оборудования при создании объекта Equipment + +import collections + +# склады: основной склад и склады подразделений +class Warehouse(): + def __init__( self, name ): + self.name = name = name + self.items = [] + + def __str__(self): + strres = f'Состояние склада "{self.name}":\n' + if self.items: + for i, item in enumerate(self.items): + strres += f"{i}: {item}\n" + else: + strres += 'пусто!\n' + return strres + + # оприходовать оборудование на склад warehouse + def debit( self, equipment ): + self.items.append( equipment ) + + # "списать" оборудование со склада + def _credit( self, equipment ): + if not equipment in self.items: + raise KeyError( equipment ) + self.items.remove( equipment ) + # # найдём нужное нам оборудование: того же производителя и модели и спишем + # for item in self.items: + # if item.shortname() == equipment.shortname(): + + # оприходовать оборудование на склад warehouse + def moveto( self, equipment, another_warehouse ): + self._credit( equipment ) + another_warehouse.debit( equipment ) + +# --> я буду только контролировать цену и вес оборудования при создании объекта Equipment +class Equipment(): + def __init__( self, brandname, model, price, weight ): + if not ( (type(price) is int or type(price) is float) and price > 0 ): + raise ValueError('price should be positive number') + if not ( (type(weight) is int or type(weight) is float) and weight > 0 ): + raise ValueError('weight should be positive number') + + self.brandname = brandname + self.model = model + self.price = price + self.weight = weight + + def __str__(self): + return f'{self.itemname} {self.model} ценою {str(self.price)} ₽ и весом {str(self.weight)} кг.' + + # краткое наименование + def shortname(self): + return f'{self.itemname} {self.model}' + +class Printer(Equipment): + itemname = 'Принтер' + +class Scanner(Equipment): + itemname = 'Сканер' + +class Xerox(Equipment): + itemname = 'Ксерокс' + + +e1 = Printer( 'LG', 'pocket photo pd239', 12340, 2.54 ) +print( e1 ) + +e2 = Scanner( 'LG', 'fu667d', 4625, 4.533 ) +print( e2 ) + +e3 = Xerox( 'Xerox', 'SXD5', 45632, 12.46 ) +print( e3 ) + +warehouse_main = Warehouse( 'main' ) +warehouse_moscow = Warehouse( 'MoscowCityOffice' ) +warehouse_samara = Warehouse( 'SamaraOffice' ) + +warehouse_main.debit( e1 ) +warehouse_main.debit( e2 ) +warehouse_main.debit( e3 ) + +print(warehouse_main) + +warehouse_main.moveto( e1, warehouse_moscow ) + +print(warehouse_main) + +warehouse_main.moveto( e2, warehouse_moscow ) + +print(warehouse_main) + +warehouse_main.moveto( e3, warehouse_samara ) + +print(warehouse_main) + +try: + warehouse_main.moveto( e1, warehouse_samara ) +except KeyError as e: + print('оборудование не найдено и не может быть списано') + +print(warehouse_main) + +try: + e4 = Xerox( 'Xerox', 'SXD55', -45632, -12.46 ) + print( e4 ) +except ValueError as e: + print(e) + +print("That's all, folks!") diff --git a/lesson08/home_work/from_manual-7.py b/lesson08/home_work/from_manual-7.py new file mode 100755 index 000000000..3238114b5 --- /dev/null +++ b/lesson08/home_work/from_manual-7.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +__author__ = 'Студенников Валерий Юрьевич' + +# Реализовать проект «Операции с комплексными числами». +# Создайте класс «Комплексное число», реализуйте перегрузку методов сложения +# и умножения комплексных чисел. +# Проверьте работу проекта, создав экземпляры класса (комплексные числа) и +# выполнив сложение и умножение созданных экземпляров. +# Проверьте корректность полученного результата. + +class Complex(object): + def __init__(self, real, imag=0.0): + self.real = real + self.imag = imag + + def __add__(self, other): + return Complex(self.real + other.real, + self.imag + other.imag) + + def __sub__(self, other): + return Complex(self.real - other.real, + self.imag - other.imag) + + def __mul__(self, other): + return Complex(self.real * other.real - self.imag * other.imag, + self.imag * other.real + self.real * other.imag) + + def __str__(self): + return '(%g, %g)' % (self.real, self.imag) + + def __repr__(self): + return 'Complex' + str(self) + +c1 = Complex(1,0) +c2 = Complex(0,1) +c3 = Complex(-1,1) +c4 = Complex(1,-1) + +print('c1 + c2 =', c1 + c2) +print('c1 * c2 =', c1 * c2) +print('c3 * c4 =', c3 * c4)