diff --git a/Algorithmf&Data_Structures_3/task_1.py b/Algorithmf&Data_Structures_3/task_1.py new file mode 100644 index 0000000..ff9f70b --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_1.py @@ -0,0 +1,20 @@ +#1. В диапазоне натуральных чисел от 2 до 99 определить, +# сколько из них кратны любому из чисел в диапазоне от 2 до 9. +# +multiplicity_count = [0, 0, ] #список для хранения количеств кратностей +SEQ_LOWERBOUND = 2 +SEQ_UPPERBOUND = 99 +DEVIDERS_LOWERBOUND = 2 +DEVIDERS_UPPERBOUND = 9 +for i in range(DEVIDERS_LOWERBOUND, DEVIDERS_UPPERBOUND + 1): + multiplicity_count.append(0, ) +for k in range(SEQ_LOWERBOUND, SEQ_UPPERBOUND + 1): + for j in range(DEVIDERS_LOWERBOUND, DEVIDERS_UPPERBOUND + 1): + if k % j == 0: + multiplicity_count[j] += 1 +print('\nВ диапазоне натуральных чисел от {: >2d} до {: >2d}:'.format(SEQ_LOWERBOUND, SEQ_UPPERBOUND)) +for i in range(DEVIDERS_LOWERBOUND, DEVIDERS_UPPERBOUND + 1): + print('чисел кратных {: >2d}: {: >2d}'.format(i, multiplicity_count[i])) + +#Здесь я в сомнении не нужно ли всюду отнять по '1', ведь числа-цифры [2-9] кратны сами себе? +#Как-то это вроде не слишком "математично", хотя и под условие данной задачи они подпадают? diff --git a/Algorithmf&Data_Structures_3/task_2.py b/Algorithmf&Data_Structures_3/task_2.py new file mode 100644 index 0000000..8145145 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_2.py @@ -0,0 +1,17 @@ +#2. Во втором массиве сохранить индексы четных элементов первого массива. +# Например, если дан массив со значениями 8, 3, 15, 6, 4, 2, +# то во второй массив надо заполнить значениями 0, 3, 4, 5 +# (индексация начинается с нуля), т.к. именно в этих позициях первого массива стоят четные числа. +import random + +list_1 = [] +List_1_LENGTH = 20 +for i in range(0, List_1_LENGTH + 1): + list_1.append(random.randint(1, 20)) + +print("\nПервый массив: ", list_1) +#even_numbers_indixes = [i for i in range(0, len(list_1)) if list_1[i] % 2 == 0] +#print("Массив индексов четных чисел первого массива: ", even_numbers_indixes) +even_numbers_indixes = [i for i in range(0, List_1_LENGTH) if list_1[i] % 2 == 0] +print("Массив индексов четных чисел первого массива: ", even_numbers_indixes) + diff --git a/Algorithmf&Data_Structures_3/task_3.py b/Algorithmf&Data_Structures_3/task_3.py new file mode 100644 index 0000000..5c167cc --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_3.py @@ -0,0 +1,32 @@ +#3. В массиве случайных целых чисел поменять местами минимальный и максимальный элементы. + +import random + +random_list = [] +random_list_LENGTH = 20 +for i in range(0, random_list_LENGTH + 1): + random_list.append(random.randint(1, 20)) + +curr_max = {} +curr_max['index'] = 0 +curr_max['value'] = random_list[0] +curr_min = {} +curr_min['index'] = 0 +curr_min['value'] = random_list[0] + +for i in range(0, random_list_LENGTH): + if random_list[i] > curr_max['value']: + curr_max['value'] = random_list[i] + curr_max['index'] = i + continue # текущий элнмент уже заведоио не может оказаться минимальным + else: + if random_list[i] < curr_min['value']: + curr_min['value'] = random_list[i] + curr_min['index'] = i +print('\nМаксимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_max['value'], curr_max['index'])) +print('Минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min['value'], curr_min['index'])) +changed_list = random_list[:] +changed_list[curr_max['index']] = curr_min['value'] +changed_list[curr_min['index']] = curr_max['value'] +print("\nИсходный массив :", random_list) +print("измененный массив:", changed_list) \ No newline at end of file diff --git a/Algorithmf&Data_Structures_3/task_4.py b/Algorithmf&Data_Structures_3/task_4.py new file mode 100644 index 0000000..9a94996 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_4.py @@ -0,0 +1,27 @@ +#4. Определить, какое число в массиве встречается чаще всего. + +import random + +count_list = [] +numbers_list = [] +List_LENGTH = 55 +DIFF_NUMBS = 30 +for i in range(0, List_LENGTH + 1): + numbers_list.append(random.randint(1, DIFF_NUMBS)) + +for i in range(0, DIFF_NUMBS+1): + count_list.append(0) + +for i in range(0, List_LENGTH + 1): + count_list[numbers_list[i]] += 1 + +print("исходный массив чисел:") +if List_LENGTH >30: #Если массив очень большой выводим его строками по 10 элементов в строке + for j in range(0, int(List_LENGTH/10)): + line_to_print = numbers_list[j*10:(j*10)+10] + print (line_to_print) +else: + print ('\n', numbers_list) + +for i in range(0, DIFF_NUMBS): + print("В данном массиые число: {: >3d} встречается {: >d} раз".format(i, count_list[i])) diff --git a/Algorithmf&Data_Structures_3/task_5.py b/Algorithmf&Data_Structures_3/task_5.py new file mode 100644 index 0000000..35e9988 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_5.py @@ -0,0 +1,27 @@ +# 5. В массиве найти максимальный отрицательный элемент. +# Вывести на экран его значение и позицию в массиве. + +import random + +random_list = [] +List_LENGTH = 20 +for i in range(0, List_LENGTH + 1): + random_list.append(random.randint(-10, 20)) + +print(random_list) +max_negative = {} +for i in range(0, List_LENGTH): + if random_list[i]< 0: + max_negative["value"] = random_list[i] + max_negative["index"] = i + +if max_negative["index"] != List_LENGTH: + for i in range(max_negative["index"], List_LENGTH): + if random_list[i]<0: + if random_list[i] > max_negative["value"]: + max_negative["value"] = random_list[i] + max_negative["index"] = i + +print(random_list) +print("Максимальным отрицательным элементом массива является {: >-2d} ".format(max_negative["value"])) +print("Его индекс: {: >-2d} ".format(max_negative["index"])) \ No newline at end of file diff --git a/Algorithmf&Data_Structures_3/task_6.py b/Algorithmf&Data_Structures_3/task_6.py new file mode 100644 index 0000000..b8e6437 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_6.py @@ -0,0 +1,54 @@ +#6. В одномерном массиве найти сумму элементов, +# находящихся между минимальным и максимальным элементами. +# Сами минимальный и максимальный элементы в сумму не включать. + +import random + +#======================================================================================================= +# далее блок из задачи task_3.py + +print("\nВведите как можно более длинный ряд челых случайных чисел, для завершения ввода введите символ 'S'") +print("Если вообще не хотите вводить числа, введите 'S' вместо первого числа") +print("тогда список будет создан автоматически. И так начинаем:") +answer = input("Введите первое число или 'S': ") +random_list = [] +random_list_LENGTH = 20 +if answer.lower() == 's': + for i in range(0, random_list_LENGTH + 1): + random_list.append(random.randint(1, random_list_LENGTH)) +else: + while answer.lower() != 's': + random_list.append(int(answer)) + answer = input("Введите следующее число или 'S': ") +curr_max = {} +curr_max['index'] = 0 +curr_max['value'] = random_list[0] +curr_min = {} +curr_min['index'] = 0 +curr_min['value'] = random_list[0] + +for i in range(0, len(random_list)): + if random_list[i] > curr_max['value']: + curr_max['value'] = random_list[i] + curr_max['index'] = i + continue # текущий элнмент уже заведоио не может оказаться минимальным + else: + if random_list[i] < curr_min['value']: + curr_min['value'] = random_list[i] + curr_min['index'] = i +print(random_list) +print('\nМаксимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_max['value'], curr_max['index'])) +print('Минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min['value'], curr_min['index'])) + +# выше блок из задачи task_3.py +#======================================================================================================= +sum_elem = 0 +if curr_max['index'] != curr_min['index']: + if curr_max['index'] > curr_min['index']: + for i in range(curr_min['index'] + 1, curr_max['index']): + sum_elem += random_list[i] + else: + for i in range(curr_max['index'] + 1, curr_min['index']): + sum_elem += random_list[i] + +print('Сумма элементов между максимальным и минимальным значениями, составляет:{: >3d}'.format(sum_elem)) diff --git a/Algorithmf&Data_Structures_3/task_7.py b/Algorithmf&Data_Structures_3/task_7.py new file mode 100644 index 0000000..ebbefd8 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_7.py @@ -0,0 +1,31 @@ +#7. В одномерном массиве целых чисел определить два наименьших элемента. +# Они могут быть как равны между собой (оба являться минимальными), так и различаться. + + +import random + +random_list = [] +random_list_LENGTH = 20 +for i in range(0, random_list_LENGTH + 1): + random_list.append(random.randint(1, 20)) + +curr_min_1 = {} +curr_min_1['index'] = 0 +curr_min_1['value'] = random_list[0] + +for i in range(0, random_list_LENGTH + 1): + if random_list[i] < curr_min_1['value']: + curr_min_1['value'] = random_list[i] + curr_min_1['index'] = i + +curr_min_2 = {} +curr_min_2['index'] = 0 +curr_min_2['value'] = random_list[0] + +for i in range(curr_min_1['index'] + 1, random_list_LENGTH + 1): + if random_list[i] < curr_min_2['value']: + curr_min_2['value'] = random_list[i] + curr_min_2['index'] = i +print(random_list) +print('\n1й минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min_1['value'], curr_min_1['index'])) +print('2й минимальный элемент: {: >2d} в позиции {: >2d}:'.format(curr_min_2['value'], curr_min_2['index'])) diff --git a/Algorithmf&Data_Structures_3/task_8.py b/Algorithmf&Data_Structures_3/task_8.py new file mode 100644 index 0000000..6536b07 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_8.py @@ -0,0 +1,41 @@ +#8. Матрица 5x4 заполняется вводом с клавиатуры, кроме последних элементов строк. +# Программа должна вычислять сумму введенных элементов каждой строки и записывать ее +# в ее последнюю ячейку. В конце следует вывести полученную матрицу. + +import random + +print("\nВведите матрицу 5х4 из целых чисел, т.е. 4 раза по 5 чисел. ") +print("В конце ввода каждой строки из 5 чисел будет автоматически добавляться '0'. Не обращайте внмания!") +print("Если вообще не хотите вводить числа, введите 'S' вместо первого числа") +print("тогда матрица будет создана автоматически. И так начинаем:") +answer = input("Введите первое число или 'S': ") + +matrix = [[], [], [], []] +columns_numb = 5 +rows_numb = 4 +if answer.lower() == 's': + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(random.randint(1,20)) + else: + matrix[j].append(0) +else: + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(int(answer)) + answer = input("Введите следующее число: ") + else: + matrix[j].append(0) + +for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j][columns_numb] += matrix[j][i] + +print("\nВывод матрицы 5х4, последний 6й элемент каждой строки") +print(" - сумма всех элеменов данной строки матрицы:\n") +for j in range(0, rows_numb): + for i in range(0, columns_numb): + print(' |{: >3d} '.format(matrix[j][i]), end = '') + print (' | {: >3d} |'.format(matrix[j][columns_numb]), end = '') + print ('') + diff --git a/Algorithmf&Data_Structures_3/task_9.py b/Algorithmf&Data_Structures_3/task_9.py new file mode 100644 index 0000000..86b7c85 --- /dev/null +++ b/Algorithmf&Data_Structures_3/task_9.py @@ -0,0 +1,38 @@ +#9. Найти максимальный элемент среди минимальных элементов столбцов матрицы. + +import random + +matrix = [] +columns_numb = 6 +rows_numb = 5 +for i in range(0, rows_numb + 1): + matrix.append([]) +#print(matrix) +for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(random.randint(1, 20)) + else: + matrix[j].append(' ') # Этот последняя строка будет использована для хранения минимальных значений столбцов +for i in range(0, columns_numb + 1): + matrix[rows_numb].append(0) + +for i in range(0, columns_numb): + matrix[rows_numb][i] = matrix[0][i] + for j in range(1, rows_numb): + if matrix[j][i] < matrix[rows_numb][i]: + matrix[rows_numb][i] = matrix[j][i] +matrix[rows_numb][columns_numb] = matrix[rows_numb][0] +for i in range(0, columns_numb): + if matrix[rows_numb][i] > matrix[rows_numb][columns_numb]: + matrix[rows_numb][columns_numb] = matrix[rows_numb][i] + +print("\nПострочный вывод матрицы, последняя строка содержит минимальные значения соответствующих колонок") +print("Элемент в последней колонке последней строки, максимальное значение из этих минимумов") +for j in range(0, rows_numb): + for i in range(0, columns_numb): + print(' |{: >3d} '.format(matrix[j][i]), end='') + print(' | {: >3s} |'.format(matrix[j][columns_numb]), end='') + print('') +for i in range(0, columns_numb + 1): + print(' |{: >3d} '.format(matrix[rows_numb][i]), end='') +print(' |\n') diff --git a/Algorithmf&Data_Structures_4/task_1.py b/Algorithmf&Data_Structures_4/task_1.py new file mode 100644 index 0000000..1bb4ca7 --- /dev/null +++ b/Algorithmf&Data_Structures_4/task_1.py @@ -0,0 +1,133 @@ +#1. Проанализировать скорость и сложность одного - трёх любых алгоритмов, +# разработанных в рамках домашнего задания первых трех уроков. +# Данная программа была составлена специально для донного задания +# +import sys + +def fact_recurs(N): + if N == 1: + return 1 + return fact_recurs(N-1)*N + +def fact_memo(N): + memo_facts = [1,2,6,24,120,720,0,0,0,0,0,0,0,0,0,0,0,0,] + [0]*500 + if memo_facts[N] == 0: + memo_facts[N] = fact_memo(N-1)*N + return memo_facts[N] + +def fact_loop(N): + f = 1 + for i in range(1, N+1): + f *=i + return f + +do = { + "r": fact_recurs, + "m": fact_memo, + "l": fact_loop, +} + +try: + N_factor = int(sys.argv[2]) +except IndexError: + file_dir_name = None + +try: + key = sys.argv[1] +except IndexError: + key = None + + +if key: + if do.get(key): + print(do[key](N_factor)) + +#============================================================================================================ +# вычисление 500! рекурсивной функцией +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py r 500 +#122013682599111006870123878542304692625357434280319284219241358838584537315388199760549644750220328186301361647714820358416337872207817720 +#048078520515932928547790757193933060377296085908627042917454788242491272634430567017327076946106280231045264421887878946575477714986349436 +#778103764427403382736539747138647787849543848959553753799042324106127132698432774571554630997720278101456108118837370953101635632443298702 +#956389662891165897476957208792692887128178007026517450776841071962439039432253642260523494585012991857150124870696156814162535905669342381 +#300885624924689156412677565448188650659384795177536089400574523894033579847636394490531306232374906644504882466507594673586207463792518420 +#045936969298102226397195259719094521782333175693458150855233282076282002340262690789834245171200620771464097945611612762914595123722991334 +#016955236385094288559201872743379517301458635757082835578015873543276888868012039988238470215146760544540766353598417443048012893831389688 +#163948746965881750450692636533817505547812864000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +#0000000000000000000000000000000 +# 509 function calls (10 primitive calls) in 0.001 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 500/1 0.001 0.000 0.001 0.001 task_1.py:3(fact_recurs) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.001 0.001 task_1.py:1() +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.001 0.001 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +# вычисление 500! рекурсивной функцией с меморизацией +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py r 500 +#122013682599111006870123878542304692625357434280319284219241358838584537315388199760549644750220328186301361647714820358416337872207817720 +#048078520515932928547790757193933060377296085908627042917454788242491272634430567017327076946106280231045264421887878946575477714986349436 +#778103764427403382736539747138647787849543848959553753799042324106127132698432774571554630997720278101456108118837370953101635632443298702 +#956389662891165897476957208792692887128178007026517450776841071962439039432253642260523494585012991857150124870696156814162535905669342381 +#300885624924689156412677565448188650659384795177536089400574523894033579847636394490531306232374906644504882466507594673586207463792518420 +#045936969298102226397195259719094521782333175693458150855233282076282002340262690789834245171200620771464097945611612762914595123722991334 +#016955236385094288559201872743379517301458635757082835578015873543276888868012039988238470215146760544540766353598417443048012893831389688 +#163948746965881750450692636533817505547812864000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +#0000000000000000000000000000000 +# 509 function calls (10 primitive calls) in 0.001 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 500/1 0.001 0.000 0.001 0.001 task_1.py:3(fact_recurs) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.001 0.001 task_1.py:1() +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.001 0.001 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +# вычисление 20! рекурсивной функцией с циклом +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py l 20 +#2432902008176640000 +# 10 function calls in 0.000 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 1 0.000 0.000 0.000 0.000 task_1.py:1() +# 1 0.000 0.000 0.000 0.000 task_1.py:14(fact_loop) +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.000 0.000 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +# вычисление 500! рекурсивной функцией с циклом выполнить не удалось из-за постоянно возникавшей ошибки: +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_1.py l 500 +#Traceback (most recent call last): +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\runpy.py", line 161, in _run_module_as_main +# "__main__", fname, loader, pkg_name) +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\runpy.py", line 74, in _run_code +# exec(code, run_globals) +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\cProfile.py", line 195, in +# main() +# File "C:\Temp\Portable Python 3.2.5.1\App\lib\cProfile.py", line 181, in main +# code = compile(fp.read(), progname, 'exec') +# File "task_1.py", line 113 +#SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 3-4: truncated \UXXXXXXXX escape +#============================================================================================================ +# +#Оценить сложность по результатам выполненых измеренрий не представляется возможным, +# слищком грубым оказался инструмент... +# diff --git a/Algorithmf&Data_Structures_4/task_2.py b/Algorithmf&Data_Structures_4/task_2.py new file mode 100644 index 0000000..c551358 --- /dev/null +++ b/Algorithmf&Data_Structures_4/task_2.py @@ -0,0 +1,60 @@ +#2. Написать два алгоритма нахождения i-го по счёту простого числа. +# Первый - использовать алгоритм решето Эратосфена. Второй - без использования "решета". +# Проанализировать скорость и сложность алгоритмов. +# Примечание: Результаты анализа сохранить в виде комментариев в файле с кодом. + +def erathosthen(up_to): + primes = [i for i in range(2, up_to + 1)] + + for curr_prim in primes: + if curr_prim != 0: + for j in range(curr_prim + curr_prim, up_to + 1, curr_prim): + primes[j - 2] = 0 + return primes + + +nth_prime = 5 +primes = erathosthen(100) +#print(primes) +primes_counter = 0 +#print([i for i in primes if i != 0]) +for i in range(len(primes)): + if primes[i]: + primes_counter += 1 + if primes_counter == nth_prime: + break +#print('{: >2d}е простое число = {: >2d}'.format(nth_prime, primes[i])) + +#Все оценки проводились при отключенном выводе на экран!! +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2.py 25 +# 6 function calls in 0.000 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.000 0.000 0.000 0.000 task_2.py:6(erathosthen) +# 1 0.000 0.000 0.000 0.000 task_2.py:6() +# 1 0.000 0.000 0.000 0.000 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 task_2.py:8() +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# + +# Не представляю, что можно здесь проанализирова!? Видимо слишком простая функция. Даже увеличение +#Даже увеличение параметра у функции erathosthen( до 1000 не влияет на результат!Разве что до 10000 +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2.py 10000 +# 6 function calls in 0.003 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.003 0.003 0.003 0.003 task_2.py:6(erathosthen) +# 1 0.000 0.000 0.000 0.000 task_2.py:8() +# 1 0.000 0.000 0.003 0.003 task_2.py:6() +# 1 0.000 0.000 0.003 0.003 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +# Вообще же все это очень похоже на попытку померить толщину лески метровой линейкой... +# С другой стороны проход по массиву цикл в цикле должен бы дать сложность, теоретически порядка O(x**2) diff --git a/Algorithmf&Data_Structures_4/task_2b.py b/Algorithmf&Data_Structures_4/task_2b.py new file mode 100644 index 0000000..13ee5cc --- /dev/null +++ b/Algorithmf&Data_Structures_4/task_2b.py @@ -0,0 +1,89 @@ +#2. Написать два алгоритма нахождения i-го по счёту простого числа. +# Первый - использовать алгоритм решето Эратосфена. Второй - без использования "решета". +# Проанализировать скорость и сложность алгоритмов. +# Примечание: Результаты анализа сохранить в виде комментариев в файле с кодом. +# Данный файл содержит решене без решета Эратосфена. +# +def find_prime(up_to): + primes = [2, 3] + nth_prime = 5 + for i in range(2, up_to): + prime = True + for curr_prime in primes: + if i % curr_prime == 0: + prime = False + if prime: + primes.append(i) + if len(primes) >= nth_prime: + print('{: >2d}е простое число = {: >2d}'.format(nth_prime, primes[nth_prime - 1])) + else: + print('В диапазоне от 2 до {: >2d} найдено менее {: >2d}-ти простых чисел'.format(int(up_to), int(nth_prime))) + return primes + + +primes = find_prime(1000) +# +#============================================================================================================ +#поиск среди 100 натуральных чисел +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2b.py +#5е простое число = 11 +# 34 function calls in 0.000 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.000 0.000 0.000 0.000 task_2b.py:1(find_prime) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects} +# 23 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.000 0.000 task_2b.py:1() +# 1 0.000 0.000 0.000 0.000 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +# +#============================================================================================================ +#поиск среди 10000 натуральных чисел +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2b.py +# 5е простое число = 11 +# 1238 function calls in 0.573 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.573 0.573 0.573 0.573 task_2b.py:1(find_prime) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 1227 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 1 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.573 0.573 task_2b.py:1() +# 1 0.000 0.000 0.573 0.573 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +#============================================================================================================ +#поиск среди 100 натуральных чисел +# +#C:\Users\Serg_\PycharmProjects\Algorithms&Data_Structures\Lesson_4>python -m cProfile -s time task_2b.py +#5е простое число = 11 +# 177 function calls in 0.008 seconds +# +# Ordered by: internal time +# +# ncalls tottime percall cumtime percall filename:lineno(function) +# 1 0.008 0.008 0.008 0.008 task_2b.py:1(find_prime) +# 1 0.000 0.000 0.000 0.000 {built-in method print} +# 166 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} +# 2 0.000 0.000 0.000 0.000 {built-in method charmap_encode} +# 2 0.000 0.000 0.000 0.000 cp866.py:18(encode) +# 1 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects} +# 1 0.000 0.000 0.008 0.008 task_2b.py:1() +# 1 0.000 0.000 0.008 0.008 {built-in method exec} +# 1 0.000 0.000 0.000 0.000 {built-in method len} +# 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} +#============================================================================================================ +# +# Можно предположить, что в данном случае имеется линейная зависимость т.е. O(n) \ No newline at end of file diff --git a/Algorithms&Data_Structures_5/task_1.py b/Algorithms&Data_Structures_5/task_1.py new file mode 100644 index 0000000..685f543 --- /dev/null +++ b/Algorithms&Data_Structures_5/task_1.py @@ -0,0 +1,34 @@ +#1. Пользователь вводит данные о количестве предприятий, их наименования +## и прибыль за 4 квартала для каждого предприятия. +# Программа должна определить среднюю прибыль (за год для всех предприятий) +# и вывести наименования предприятий, чья прибыль выше среднего +# и отдельно вывести наименования предприятий, чья прибыль ниже среднего. + +import collections + +fact_numb = int(input("Введите количество предприяний : ")) +fact_income = collections.defaultdict(int) +for i in range(fact_numb): + fact_name = input("введите название {: >2d}-го предприятия : ".format(i + 1)) + for j in range(1, 5): + profit = int(input("Введите его прибыль за {: >2d}-й квартал : ".format(j))) + fact_income[fact_name] += profit + print('I', fact_income[fact_name]) + fact_income[fact_name] /= 4 +all_fact_profit_sum = 0 +for key in fact_income.keys(): + all_fact_profit_sum += fact_income[key] +all_fact_average_profit = all_fact_profit_sum / fact_numb + +print("Средняя прибыль за год по всем предприятиям : ", all_fact_average_profit) + +print("Список предприятий с среднегодовой прибылью выше средней:") +for key in fact_income.keys(): + if fact_income[key] > all_fact_average_profit: + print(key, fact_income[key]) + +print("Список предприятий с среднегодовой прибылью ниже средней:") +for key in fact_income.keys(): + if fact_income[key] < all_fact_average_profit: + print(key, fact_income[key]) + diff --git a/Algorithms&Data_Structures_5/task_2.py b/Algorithms&Data_Structures_5/task_2.py new file mode 100644 index 0000000..c54c038 --- /dev/null +++ b/Algorithms&Data_Structures_5/task_2.py @@ -0,0 +1,126 @@ +#2. Написать программу сложения и умножения двух шестнадцатеричных чисел. +# При этом каждое число представляется как массив, элементы которого это цифры числа. +# +#Например, пользователь ввёл A2 и C4F. +#Сохранить их как [‘A’, ‘2’] и [‘C’, ‘4’, ‘F’] соответственно. +#Сумма чисел из примера: [‘C’, ‘F’, ‘1’]. +#Произведение - [‘7’, ‘C’, ‘9’, ‘F’, ‘E’]. + +DEBUGGING_RUN = False +import collections +import copy + +hex_values = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, + '9': 9, 'a': 10, 'b': 11, 'c': 12, 'd': 13, 'e': 14, 'f': 15, } + + +def value_to_hex(value): + keys = hex_values.keys() + values = hex_values.values() + for key in keys: + if hex_values[key] == value: + break + return key + +#================================================================================================================== +if not DEBUGGING_RUN: + print("Введите 1-е шестнадцатеричное число", end=' ') + hex_1_input = input("в виде строки символов[0-9]|[a-f], например: ab12345: ") + print("Введите 1-е шестнадцатеричное число", end=' ') + hex_2_input = input("в виде строки символов[0-9]|[a-f], например: ab12345: ") + operation = input("Введите символ операции +|* : ") +else: + operation = '+' + + hex_1_input = 'c4f' + hex_2_input = 'a2' + +#================================================================================================================== + +hex_1 = collections.deque(list((hex_1_input).lower())) +hex_2 = collections.deque(list((hex_2_input).lower())) + +#================================================================================================================== +def mult_hex(hex_1, hex_2): + hex_1c = copy.copy(hex_1) + hex_tmpresult = collections.deque([]) + hex_result = collections.deque([]) + hex_l_len = len(hex_1) + hex_2_len = len(hex_2) + for i in range(hex_l_len):# подготовка массивов для хранения промежуточных произведний + hex_tmpresult.append(collections.deque([])) + hex_result.append('0') + + for i in range(hex_l_len): + hex_dig_1 = hex_1c.pop() + carry = 0 + hex_2c = copy.copy(hex_2) + + for j in range(hex_2_len): + hex_dig_2 = hex_2c.pop() + res_dig = hex_values[hex_dig_1] * hex_values[hex_dig_2] + carry + if int(res_dig / 16) >= 1: + carry = int(res_dig / 16) + res_dig = res_dig % 16 + else: + carry = 0 + hex_tmpresult[i].appendleft(value_to_hex(res_dig)) + if carry != 0: + hex_tmpresult[i].appendleft(value_to_hex(carry)) + if i > 0: # компенсация того факта, что частичные умножения выполнялись без учета разряда множителей + for k in range(i): + hex_tmpresult[i].append('0') + for i in range(hex_l_len): + hex_result = sum_hex(hex_result, hex_tmpresult[i]) + #удалить незначащуе нули из старших разрядов + while hex_result[0] == '0': + hex_result.popleft() + return hex_result + + +#================================================================================================================== + +def sum_hex(hex_1, hex_2): + hex_1c = copy.copy(hex_1) + hex_2c = copy.copy(hex_2) + + #выравниваем числа по младшему (правому) разряду + if len(hex_1c) > len(hex_2c): + len_diff = len(hex_1c) - len(hex_2c) + for i in range(len_diff): + hex_2c.appendleft('0') + else: + len_diff = len(hex_2c) - len(hex_1c) + for i in range(len_diff): + hex_1c.appendleft('0') + #доплнительные нули для обработки переноса за старший разряд + hex_1c.appendleft('0') + hex_2c.appendleft('0') + + hex_result = collections.deque([]) + hex_len = len(hex_1c) + carry = 0 + for i in range(hex_len): + hex_dig_1 = hex_1c.pop() + hex_dig_2 = hex_2c.pop() + res_dig = hex_values[hex_dig_1] + hex_values[hex_dig_2] + carry + if res_dig >= 16: + res_dig -= 16 + carry = 1 + else: + carry = 0 + hex_result.appendleft(value_to_hex(res_dig)) + return hex_result + + +do = { + "+": sum_hex, + "*": mult_hex, +} + +result = do[operation](hex_1, hex_2) +print("Врезультате выполнения операции:") +print('\n', ''.join(list(hex_1)), operation, ''.join(list(hex_2)), ' = ', ''.join(list(result))) + + + diff --git a/Algorithms&Data_Structures_6/task_1.py b/Algorithms&Data_Structures_6/task_1.py new file mode 100644 index 0000000..fb42107 --- /dev/null +++ b/Algorithms&Data_Structures_6/task_1.py @@ -0,0 +1,78 @@ +#1. Подсчитать, сколько было выделено памяти под переменные в программах, разработанных +#на первых трех уроках. + +#8.ДЗ_3. Матрица 5x4 заполняется вводом с клавиатуры, кроме последних элементов строк. +# Программа должна вычислять сумму введенных элементов каждой строки и записывать ее +# в ее последнюю ячейку. В конце следует вывести полученную матрицу. + +import random +import sys +user_interaction = True +if not user_interaction: + print("\nВведите матрицу 5х4 из целых чисел, т.е. 4 раза по 5 чисел. ") + print("В конце ввода каждой строки из 5 чисел будет автоматически добавляться '0'. Не обращайте внмания!") + print("Если вообще не хотите вводить числа, введите 'S' вместо первого числа") + print("тогда матрица будет создана автоматически. И так начинаем:") + answer = input("Введите первое число или 'S': ") +else: + answer = 's' + +matrix = [[], [], [], []] +columns_numb = 5 +rows_numb = 4 +if answer.lower() == 's': + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(random.randint(1,20)) + else: + matrix[j].append(0) +else: + for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j].append(int(answer)) + answer = input("Введите следующее число: ") + else: + matrix[j].append(0) + +for j in range(0, rows_numb): + for i in range(0, columns_numb): + matrix[j][columns_numb] += matrix[j][i] +if not user_interaction: + print("\nВывод матрицы 5х4, последний 6й элемент каждой строки") + print(" - сумма всех элеменов данной строки матрицы:\n") + for j in range(0, rows_numb): + for i in range(0, columns_numb): + print(' |{: >3d} '.format(matrix[j][i]), end = '') + print (' | {: >3d} |'.format(matrix[j][columns_numb]), end = '') + print ('') +#======================================================================= + +if __name__ == "__main__": + def show_size(x, level=0): + print('\t'*level, 'type = {:s}'.format(x.__class__), 'size = {:d}'.format(sys.getsizeof(x)), 'object = ', x) + if hasattr(x, '__iter__'): + if hasattr(x, 'items'): + for y in x.items(): + show_size(y, level+1) + + elif not isinstance(x, str): + for y in x: + show_size(y, level+1) + + + print(show_size([[], [], []])) #первоначальный размер матрицы + print(show_size(matrix)) #окончательный размер матрицы + #сумма строк взаимодействия с пользователем + print (show_size("\n\nВведите матрицу 5х4 из целых чисел, т.е. 4 раза по 5 чисел. " \ + "В конце ввода каждой строки из 5 чисел будет автоматически добавляться '0'. " \ + "Не обращайте внмания! Если вообще не хотите вводить числа, введите 'S' " \ + "вместо первого числа тогда матрица будет создана автоматически. И так начинаем: " \ + "Введите первое число или 'S': Вывод матрицы 5х4, последний 6й элемент " \ + "каждой строки - сумма всех элеменов данной строки матрицы:\n")) +#============================================================================== +#Изначально под матрицу 5х4 резурвируется 48 байт +#после добавления в эту матрицу 20 элементов ее размер увеличивается до 52 байт +#очень большой объем занимают строки взаимодействия с пользователем около 870 байт +#можно предположить, что на этом фоне память, занимаемая переменными программы, +#врядли окажется сколь-нибудь существенной +#и того в конечном итоге программа расходовала около 1000 байт памяти \ No newline at end of file diff --git a/Algorithms&Data_Structures_7/task_1.py b/Algorithms&Data_Structures_7/task_1.py new file mode 100644 index 0000000..ba8d1d7 --- /dev/null +++ b/Algorithms&Data_Structures_7/task_1.py @@ -0,0 +1,35 @@ +# 1. Отсортировать по убыванию методом «пузырька» одномерный целочисленный массив, +# заданный случайными числами на промежутке [-100; 100). +# Вывести на экран исходный и отсортированный массивы. + +import random + +array_SIZE = 10 +#============================================================================== + +def buble_sort(array): + n = 1 + last_i = 1 + while n < len(array): + no_swaps = True + for i in range(len(array) - n): + if array[i] < array[i + 1]: + array[i], array[i + 1] = array[i + 1], array[i] + no_swaps = False + if no_swaps: + break # обменов не было массив отсортирован, продолжать нет смысла + n += 1 + +#============================================================================== + +if __name__ == "__main__": + array = [] + for i in range(array_SIZE): + array.append(random.randint(-100, 99)) + print("Исходный массив: ", end=' ') + print(array) + buble_sort(array) + print("Ссортированный массив:", end=' ') + print(array) + + diff --git a/Algorithms&Data_Structures_7/task_2.py b/Algorithms&Data_Structures_7/task_2.py new file mode 100644 index 0000000..172c855 --- /dev/null +++ b/Algorithms&Data_Structures_7/task_2.py @@ -0,0 +1,53 @@ +# 2. Отсортируйте по возрастанию методом слияния одномерный вещественный массив, +# заданный случайными числами на промежутке [0; 50). +# Выведите на экран исходный и отсортированный массивы. + + +import random + +array_SIZE = 10 + +# это не мой код, он взят с указанного далее сайта, сам я ничего прдумать не +# смог. Долго пытался понять, как он работает и почему не работает у меня. +# Причина неработоспособности было элементарна, но гоаорить о ней не хочется, +# Зато в коде разобрался. Было еще много других, но этот мне понравился больше +#===========http://www.cyberforum.ru/python/thread395180.html===================== +#================================================================================= + +def merge(left, right): + lst = [] + while left and right: + if left[0] < right[0]: + # в данном случае сортировка по возрастанию, для сортировки по убыванию + # нужно поменять знак равенства на обратный + lst.append(left.pop(0)) + else: + lst.append(right.pop(0)) + if left: + lst.extend(left) + if right: + lst.extend(right) + return lst + +#============================================================================== + +def merge_sort(lst): + length = len(lst) + if length >= 2: + mid = int(length / 2) + lst = merge(merge_sort(lst[:mid]), merge_sort(lst[mid:])) + return lst + +#============================================================================== + +if __name__ == "__main__": + array = [] + for i in range(array_SIZE): + array.append(random.uniform(0, 50 - 1e-100)) + print("Исходный массив: ", end=' ') + for number in array: + print('{: >7.4f}'.format(number), end=' ') + array = merge_sort(array) + print("\nОтсортированный массив:", end=' ') + for number in array: + print('{: >7.4f}'.format(number), end=' ') diff --git a/Algorithms&Data_Structures_7/task_3.py b/Algorithms&Data_Structures_7/task_3.py new file mode 100644 index 0000000..fc779e1 --- /dev/null +++ b/Algorithms&Data_Structures_7/task_3.py @@ -0,0 +1,31 @@ +# 3. Массив размером 2m + 1, где m – натуральное число, заполнен случайным образом. +# Найти в массиве медиану – элемент ряда, делящий его на две равные части: +# в одной находятся элементы, которые не меньше медианы, в другой – не больше медианы. +# Примечание: Задачу можно решить без сортировки исходного массива. +# Но если это слишком сложно, то используйте метод сортировки, который не рассматривался на уроках. + +import random +from task_1 import buble_sort + +m = 10 +array_SIZE = 2 * m + 1 +#================================================================================================== + + + + +if __name__ == "__main__": + array = [] + for i in range(array_SIZE): + array.append(random.randint(-100, 99)) + print("Исходный массив: ", end=' ') + print(array) + buble_sort(array) + # Применение здесь сортировки "пузырьком" - это не невнимательность. + # Я потратил много времени нак сортировку слиянием и на что-то еще меня уже не оставалось + print("Сортированный массив:", end=' ') + print(array) + mediana_indx = int((array_SIZE - -1) / 2) + print("Медиана: индекс= ", mediana_indx, "ее значение= ", array[mediana_indx]) + + diff --git a/HTML_CSS_les1/catalog_Lang&soft.html b/HTML_CSS_les1/catalog_Lang&soft.html new file mode 100644 index 0000000..92f284e --- /dev/null +++ b/HTML_CSS_les1/catalog_Lang&soft.html @@ -0,0 +1,22 @@ + + + + + Каталог книг по программному обеспечению и языкам программирования + + +

Книги по языкам программирования

+book Python books + +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet ducimus ipsam ipsum, iusto omnis optio possimus, provident, quas quasi quos sapiente similique. Error expedita fugiat incidunt inventore, iure iusto labore molestiae molestias nemo nisi nostrum odit officiis porro praesentium qui quidem quod rem repellendus repudiandae sed vero voluptas voluptatem voluptatibus.

+ +

Книги программному обеспечению

+ +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum illo quibusdam rationei> voluptatem! Accusamus accusantium aliquam at deserunt dolor doloremque, ea expedita necessitatibus quod sequi similique sint, sit, vitae! Ab accusantium aliquam consectetur deleniti dignissimos, doloremque ea eum fuga impedit iure laboriosam laborum magni minima molestias mollitia nulla perferendis porro quam quas quasi, qui quis ratione repellat reprehenderit repudiandae sed sequi soluta suscipit tempora tenetur vel vero voluptate voluptatibus? Atque, consectetur et magni nam pariatur provident quasi tempora tenetur voluptas.

+

+Вернуться на главную страницу +
+

Все права защищены.

+ + + \ No newline at end of file diff --git a/HTML_CSS_les1/catalog_hardwr.html b/HTML_CSS_les1/catalog_hardwr.html new file mode 100644 index 0000000..42295b1 --- /dev/null +++ b/HTML_CSS_les1/catalog_hardwr.html @@ -0,0 +1,21 @@ + + + + + Каталог книг по устройство компьютеров ("железо") + + +

Lorem ipsum dolor sit amet, consectetur adipisicing elit.

+book +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias, commodi natus. Molestias non repellendus totam!

+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam culpa dolore et, eveniet expedita modi soluta vel velit.

+

В случае отсутствия нужных Вам книг в нашем магазине Вы можете попытвться поискать их в интернете:

+

Например, с помошью:

+Поисковой систкмы Яндекс +

+Вернуться на главную страницу +
+

Все права защищены.

+ + + \ No newline at end of file diff --git a/HTML_CSS_les1/images/book.png b/HTML_CSS_les1/images/book.png new file mode 100644 index 0000000..63c9116 Binary files /dev/null and b/HTML_CSS_les1/images/book.png differ diff --git a/HTML_CSS_les1/images/mini_magick20180205-163-1111ov7.png b/HTML_CSS_les1/images/mini_magick20180205-163-1111ov7.png new file mode 100644 index 0000000..002eb19 Binary files /dev/null and b/HTML_CSS_les1/images/mini_magick20180205-163-1111ov7.png differ diff --git a/HTML_CSS_les1/index.html b/HTML_CSS_les1/index.html new file mode 100644 index 0000000..9a7ae58 --- /dev/null +++ b/HTML_CSS_les1/index.html @@ -0,0 +1,21 @@ + + + + + Книжный интернет магазин + + +

В нашем книжном магазине предствлены книги компьютерной тематике

+

+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. A accusamus alias amet at cumque deserunt doloribus eligendi exercitationem illo ipsa iure iusto magnam maiores maxime, molestias nihil nisi obcaecati porro possimus quasi quidem reiciendis reprehenderit sunt veritatis voluptates. Aliquid dolor dolorem dolores eum fuga nemo optio perspiciatis quas, saepe soluta. +

+

Списки наличных книг и аннотации к нипм можно промотреть перейдя по сссылкам в сылкам в каталоги по интересующей Вас тематике

+

Каталоги

+Устройство компьютеров ("железо") +

+Каталог книг по программному обеспечению и языкам программирования +
+

Все права защищены.

+ + + \ No newline at end of file diff --git a/Lesson4/SRHw04_easy.py b/Lesson4/SRHw04_easy.py new file mode 100644 index 0000000..80d81b9 --- /dev/null +++ b/Lesson4/SRHw04_easy.py @@ -0,0 +1,39 @@ +# ! + +# -1: +# , . +# , +# +# [1, 2, 4, 0] --> [1, 4, 16, 0] + +#============================================== + +L = [2, 10, -12, 2.5, 20, -11, 4, 4, 0] +lres = [x**2 for x in L] + +#============================================== + +# -2: +# . +# , . + +#============================================== +L1 = ["", "", "", "", "", "", "", "", "", "", ""] +L2 = ["", "", "", "", "", "", "", "", "", "", ""] +lres = [ x for x in L1 for y in L2 if x == y] + +#============================================== + +# -3: +# , . +# , : +# + 3 +# + +# + 4 + +#============================================== + +L = [2, 10, -12, 2.5, 20, 45, -11,39, 4, 4, 0, 12, 24, 9] +lres = [ x for x in L if (x>0) and not(x%3) and (x%4)] + +#============================================== diff --git a/Lesson4/SRHw04_hard.py b/Lesson4/SRHw04_hard.py new file mode 100644 index 0000000..7cddf59 --- /dev/null +++ b/Lesson4/SRHw04_hard.py @@ -0,0 +1,123 @@ +# Задание-1: +# Матрицы в питоне реализуются в виде вложенных списков: +# Пример. Дано: +matrix = [[1, 0, 8], + [3, 4, 1], + [0, 4, 2]] + +# Выполнить поворот (транспонирование) матрицы +# Пример. Результат: +# matrix_rotate = [[1, 3, 0], +# [0, 4, 4], +# [8, 1, 2]] + +# Суть сложности hard: Решите задачу в одну строку + +#==================================================================== + +res = list(zip(*matrix)) +#print( res ) +#res: [(1, 3, 0), (0, 4, 4), (8, 1, 2)] + +#==================================================================== + +# Задание-2: +# Найдите наибольшее произведение пяти последовательных цифр в 1000-значном числе. +# Выведите произведение и индекс смещения первого числа последовательных 5-ти цифр. +# Пример 1000-значного числа: +number = """ +73167176531330624919225119674426574742355349194934 +96983520312774506326239578318016984801869478851843 +85861560789112949495459501737958331952853208805511 +12540698747158523863050715693290963295227443043557 +66896648950445244523161731856403098711121722383113 +62229893423380308135336276614282806444486645238749 +30358907296290491560440772390713810515859307960866 +70172427121883998797908792274921901699720888093776 +65727333001053367881220235421809751254540594752243 +52584907711670556013604839586446706324415722155397 +53697817977846174064955149290862569321978468622482 +83972241375657056057490261407972968652414535100474 +82166370484403199890008895243450658541227588666881 +16427171479924442928230863465674813919123162824586 +17866458359124566529476545682848912883142607690042 +24219022671055626321111109370544217506941658960408 +07198403850962455444362981230987879927244284909188 +84580156166097919133875499200524063689912560717606 +05886116467109405077541002256983155200055935729725 +71636269561882670428252483600823257530420752963450""" + +#============================================================= +""" +number = "73167176531330624919225119674426574742355349194934"\ +"96983520312345607326239578318016984801869478851843"\ +"85861560789112949495459501737958331952853208805511"\ +"12540698747158523863050715693290963295227443043557"\ +"66896648950445244523161731856403098711121722383113"\ +"62229893423380308135336276614282806444486645238749"\ +"30358907296290491560440772390713810515859307960866"\ +"70172427121883998797908792274921901699720888093776"\ +"65727333001053367881220235421809751254540594752243"\ +"52584907711670556013604839586446706324415722155397"\ +"53697817977846174064955149290862569321978468622482"\ +"83972241375657056057490261407972968652414535100474"\ +"82166370484403199890008895243450658541227588666881"\ +"16427171479924442928230863465674813919123162824586"\ +"17866458359124566529476545682848912883142607690042"\ +"24219022671055626321111109370544217506941658960408"\ +"07198403850962455444362981230987879927244284909188"\ +"84580156166097919133875499200524063689912560717606"\ +"05886116467109405077541002256983155200055935729725"\ +"71636269561882670428252483600823257530420752963450" +""" +import re + +for i in range(1,6): + pattrn_str = str(i) + str(i+1) + str(i+2) + str(i+3) + str(i+4) + #print (pattrn_str) + result = pattern.search(number) + print (type(result)) + result_str = result.group() + start_at = result.start() + print(result_str, start_at, "print-0") + multipl = 1 + for j in range(0, len(result_str)): + print (i, multipl, int(result_str[j]), "print-1") + multipl = multipl * int(result_str[j]) + print (result_str, start_at, "print-2") +""" +#в исходном числе данный скрипт ничего не находит +#после добавлении во 2-й строке с 10й позиции числа '1234560' +#находит 2 паттерна и вычисляет их произведения, однако найти максимальное не получается +#как только очередной поиск оканчивается неудачей внешний цикл заканчивается с ошибкой: +#""ttributeError: 'NoneType' object has no attribute 'group'"" Попытки "нейтрализовать ее с помощью +проверок if (result != None) или if (type(result) == '_sre.SRE_Match') к успеху не привели... +#============================================================= + +# Задание-3 (Ферзи): +# Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били +# друг друга. Вам дана расстановка 8 ферзей на доске. +# Определите, есть ли среди них пара бьющих друг друга. +# Программа получает на вход восемь пар чисел, +# каждое число от 1 до 8 — координаты 8 ферзей. +# Если ферзи не бьют друг друга, выведите слово NO, иначе выведите YES. + +#============================================================= + +queens_set1 = [(1,2), (2,4), (3,6), (4,8),(5,3), (6,1), (7,7), (8,5),] # good set +#queens_set1 = [(1,2), (2,4), (3,3), (4,8),(5,3), (6,1), (7,7), (8,5),] # bad set +#queens_set2 = [(1,3), (2,8), (3,4), (4,7),(5,1), (6,6), (7,2), (8,5),] #good set +result = "NO" # ферзи на доске не бьют друг друга +for i in range(len(queens_set1)): + curr_queen = queens_set1[i] + #print (curr_queen) + for j in range(i+1, len(queens_set1)): + curr_queen + tested_queen = queens_set1[j] + if curr_queen[0] == tested_queen[0] or curr_queen[1] == tested_queen[1]: + result = "YES" #эти ферзи находятся на одной горизонтале или вертикале + elif abs(curr_queen[0]-tested_queen[0]) == abs(curr_queen[1]-tested_queen[1]): + result = "YES" #эти ферзи находятся на одной диагонали +print (result) + +#============================================================= diff --git a/Lesson4/SRHw04_normal.py b/Lesson4/SRHw04_normal.py new file mode 100644 index 0000000..194b600 --- /dev/null +++ b/Lesson4/SRHw04_normal.py @@ -0,0 +1,88 @@ + +# -1: +# , +# 1 . +# .. "mtMmEZUOmcq" ['mt', 'm', 'mcq'] +# : re . + +line = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysmNO'\ + 'GIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewVzK'\ + 'TUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSAHqn'\ + 'LxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIVjXa'\ + 'pzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnWete'\ + 'kUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfCvzQ'\ + 'WrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbRuXb'\ + 'JrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkmjCC'\ + 'EUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOnLfB'\ + 'tQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGSeuT'\ + 'SkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCfKCu'\ + 'UJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWHuXB'\ + 'qHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQNJFa'\ + 'XiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQoiQ'\ + 'zTYwZAiRwycdlHfyHNGmkNqSwXUrxGc' + +#=============================================================================== +import re +pattern = re.compile(r'[a-z]{2}([A-Z])[A-Z]{2}') +result = pattern.findall(line) +print (result) +""" +[line[i] for i in range(1,(len(line)-1)) if (65< ord(line[i] and ord(line[i])< 90) and +(97< ord(line[i-2]) and ord(line[i-2])< 122) and +(97< ord(line[i-1]) and ord(line[i-1])< 122) and +(65< ord(line[i+1]) and ord([line[i+1])< 90) and +#PyCharm ord([line[i+1])< 90) '] :"expected ','' or ']' +(65< ord(line[i+2]) and ord(line[i+2])< 90)] +# : ord(line[i+2])< 90) ']' ord(line[i+2])< 90) ")": "expected ')' or ']', "..." +""" + +#=============================================================================== + +# -2: +# , +# , - . +# .. +# "GAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLec" +# : ['AY', 'NOGI', 'P'] +# : re . + +line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ + 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ + 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ + 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\ + 'jXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnW'\ + 'etekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfC'\ + 'vzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbR'\ + 'uXbJrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkm'\ + 'jCCEUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOn'\ + 'LfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGS'\ + 'euTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCf'\ + 'KCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWH'\ + 'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\ + 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ + 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' +#=============================================================================== +iimport re +pattern = re.compile(r'[a-z]{2}([A-Z]*)[A-Z]{2}') +result = pattern.findall(line_2) +#print (result) +result2 = [x for x in result if x != ''] # : '*' +print(result2) +""" +[line_2[i] for i in range(2,(len(line_2)-2)) if (65< ord(line_2[i]) and ord(line_2[i])< 90) and +(97< ord(line_2[i-2]) and (ord(line_2[i-2])< 122) and +(97< ord(line_2[i-1]) and ord(line_2[i-1])< 122) and +(65< ord(line_2[i+1]) and ord([line_2[+1])< 90) and +(65< ord(line_2[i+2]) and ord(line_2[i+2])< 90)] +# , ???!!! :( +""" + + +#=============================================================================== + +# -3: +# , ( ) +# , +# 2500- . +# +# . \ No newline at end of file diff --git a/Lesson4/les4_normal-2.py b/Lesson4/les4_normal-2.py new file mode 100644 index 0000000..7dce0be --- /dev/null +++ b/Lesson4/les4_normal-2.py @@ -0,0 +1,40 @@ +# Задание-2: +# Вывести символы в верхнем регистре, слева от которых находятся +# два символа в нижнем регистре, а справа - два символа в верхнем регистре. +# Т.е. из строки +# "GAMkgAYEOmHBSQsSUHKvSfbmxULaysmNOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLec" +# нужно получить список строк: ['AY', 'NOGI', 'P'] +# Решить задачу двумя способами: с помощью re и без. + + + +line_2 = 'mtMmEZUOmcqWiryMQhhTxqKdSTKCYEJlEZCsGAMkgAYEOmHBSQsSUHKvSfbmxULaysm'\ + 'NOGIPHpEMujalpPLNzRWXfwHQqwksrFeipEUlTLeclMwAoktKlfUBJHPsnawvjPhfgewV'\ + 'fzKTUfSYtBydXaVIpxWjNKgXANvIoumesCSSvjEGRJosUfuhRRDUuTQwLlJJJDdkVjfSA'\ + 'HqnLxooisBDWuxIhyjJaXDYwdoVPnsllMngNlmkpYOlqXEFIxPqqqgAWdJsOvqppOfyIV'\ + 'jXapzGOrfinzzsNMtBIOclwbfRzytmDgEFUzxvZGkdOaQYLVBfsGSAfJMchgBWAsGnBnW'\ + 'etekUTVuPluKRMQsdelzBgLzuwiimqkFKpyQRzOUyHkXRkdyIEBvTjdByCfkVIAQaAbfC'\ + 'vzQWrMMsYpLtdqRltXPqcSMXJIvlBzKoQnSwPFkapxGqnZCVFfKRLUIGBLOwhchWCdJbR'\ + 'uXbJrwTRNyAxDctszKjSnndaFkcBZmJZWjUeYMdevHhBJMBSShDqbjAuDGTTrSXZywYkm'\ + 'jCCEUZShGofaFpuespaZWLFNIsOqsIRLexWqTXsOaScgnsUKsJxiihwsCdBViEQBHQaOn'\ + 'LfBtQQShTYHFqrvpVFiiEFMcIFTrTkIBpGUflwTvAzMUtmSQQZGHlmQKJndiAXbIzVkGS'\ + 'euTSkyjIGsiWLALHUCsnQtiOtrbQOQunurZgHFiZjWtZCEXZCnZjLeMiFlxnPkqfJFbCf'\ + 'KCuUJmGYJZPpRBFNLkqigxFkrRAppYRXeSCBxbGvqHmlsSZMWSVQyzenWoGxyGPvbnhWH'\ + 'uXBqHFjvihuNGEEFsfnMXTfptvIOlhKhyYwxLnqOsBdGvnuyEZIheApQGOXWeXoLWiDQN'\ + 'JFaXiUWgsKQrDOeZoNlZNRvHnLgCmysUeKnVJXPFIzvdDyleXylnKBfLCjLHntltignbQ'\ + 'oiQzTYwZAiRwycdlHfyHNGmkNqSwXUrxGC' + +""" +import re +pattern = re.compile(r'[a-z]{2}([A-Z]*)[A-Z]{2}') +result = pattern.findall(line_2) +#print (result) +result2 = [x for x in result if x != ''] # удаление пустых строк +print(result2) + +[line_2[i] for i in range(2,(len(line_2)-2)) if (65< ord(line_2[i]) and ord(line_2[i])< 90) and +(97< ord(line_2[i-2]) and (ord(line_2[i-2])< 122) and +(97< ord(line_2[i-1]) and ord(line_2[i-1])< 122) and +(65< ord(line_2[i+1]) and ord([line_2[+1])< 90) and +(65< ord(line_2[i+2]) and ord(line_2[i+2])< 90)] +""" diff --git a/Lesson5/SRHw05_easy.py b/Lesson5/SRHw05_easy.py new file mode 100644 index 0000000..361361f --- /dev/null +++ b/Lesson5/SRHw05_easy.py @@ -0,0 +1,81 @@ +# Задача-1: +# Напишите скрипт, создающий директории dir_1 - dir_9 в папке, +# из которой запущен данный скрипт. +# И второй скрипт, удаляющий эти папки. + +#============================================================= +import os +def change_dir(dir_path): + if not os.path.exists(dir_path): + result = 2 # change fault, the directory is not exists + return result + try: + os.chdir(dir_path) + result = 0 # directory was changed + except: + result = 1 # directory was not changed + return result + +def delete_dir(dir_path): + try: + os.rmdir(dir_path) + result = 0 # directory was deleted + except: + result = 1 # directory was not deleted + return result + +def make_dir(dir_path): + if os.path.exists(dir_path): + result = 2 # Error: a directory with the same name is already exists + return result + try: + os.mkdir(dir_path) + result = 0 # was created + except: + result = 1 # directory was not created + return result + +""" +#=1)========================================================== +import os +result = SRHw05_easy.make_dir('.\dir_1') +if result: + print ("создать директорию '.\dir_1' не удалось") + if result == 2: + print ("создать директория с таким именем уже существует") +print ("директория '.\dir_1' успешно создана") + +result = SRHw05_easy.make_dir('.\dir_9') +if result: + print ("создать директорию '.\dir_9' не удалось") + if result == 2: + print ("создать директория с таким именем уже существует") +print ("директория '.\dir_9' успешно создана") + +#=2)========================================================== +import os +if not os.path.exists('.\dir_1'): + print ("директория '.\dir_1' не существует удалять нечего") +else: + SRHw05_easy.delete_dir(r'.\dir_1') +if not os.path.exists('.\dir_1'): + print ("директория '.\dir_1' успешно удалена") +if not os.path.exists('.\dir_9'): + print ("директория '.\dir_9' не существует удалять нечего") +else: + SRHw05_easy.delete_dir(r'.\dir_9') +if not os.path.exists('.\dir_9'): + print ("директория '.\dir_9' успешно удалена") +#=========================================================== +""" +# Задача-2: +# Напишите скрипт, отображающий папки текущей директории. +#=========================================================== +import os +def list_dir(path): + return [ elem for elem in os.listdir(r'.')], [ elem for elem in os.listdir(r'.') if os.path.isdir(elem)] + #возвражается кореж (все элементы: только дитрктории) +#=========================================================== + +# Задача-3: +# Напишите скрипт, создающий копию файла, из которого запущен данный скрипт. \ No newline at end of file diff --git a/Lesson5/SRHw05_normal.py b/Lesson5/SRHw05_normal.py new file mode 100644 index 0000000..8219e62 --- /dev/null +++ b/Lesson5/SRHw05_normal.py @@ -0,0 +1,50 @@ +# Задача-1: +# Напишите небольшую консольную утилиту, +# позволяющую работать с папками текущей директории. +# Утилита должна иметь меню выбора действия, в котором будут пункты: +# 1. Перейти в папку +# 2. Просмотреть содержимое текущей папки +# 3. Удалить папку +# 4. Создать папку +# При выборе пунктов 1, 3, 4 программа запрашивает название папки +# и выводит результат действия: "Успешно создано/удалено/перешел", +# "Невозможно создать/удалить/перейти" + +# Для решения данной задачи используйте алгоритмы из задания easy, +# оформленные в виде соответствующих функций, +# и импортированные в данный файл из easy.py + +import os +import SRHw05_easy + +Sleted_item='9' +print( "РАБОТА С ПАПКАМИ ТЕКУЩЕЙ ДИРЕКТОРИИ") +print( "===================================") +print ("выберите интересующее Вас действие:") +while Sleted_item != '0': + print("Просмотреть содержимое папки - введите 1") + print("Перейти в папку - введите 2") + print("Удалить папку - введите 4") + print("Создать папку - введите 3") + print("Для выхода - введите 0") + Sleted_item= input("Введите Ваш выбор: ") + print(Sleted_item) + if Sleted_item == '1' : + dir_name = input ("Введите путь папки: ") + print ("Все элементы: ", SRHw05_easy.list_dir(r'.')[0]) + print ("Из них директории: ", SRHw05_easy.list_dir(r'.')[1]) + elif Sleted_item == '2': + dir_name = input ("Введите путь папки: ") + SRHw05_easy.change_dir(dir_name) + elif Sleted_item == '3': + dir_name = input("Введите путь папки: ") + SRHw05_easy.make_dir(dir_name) + elif Sleted_item == '4': + dir_name = input("Введите путь папки: ") + SRHw05_easy.delete_dir(dir_name) + elif Sleted_item == '0' : + pass + else: + print("Такого пункта меню нет") +print("Работа завершена") + diff --git a/Lesson5/les5_hard.py b/Lesson5/les5_hard.py new file mode 100644 index 0000000..3608ed7 --- /dev/null +++ b/Lesson5/les5_hard.py @@ -0,0 +1,181 @@ +# Задание-1: SRHw05_hard.py +# Доработайте реализацию программы из примера examples/5_with_args.py, +# добавив реализацию следующих команд (переданных в качестве аргументов): +# cp - создает копию указанного файла +# rm - удаляет указанный файл (запросить подтверждение операции) +# cd - меняет текущую директорию на указанную +# ls - отображение полного пути текущей директории +# путь считать абсолютным (full_path) - +# в Linux начинается с /, в Windows с имени диска, +# все остальные пути считать относительными. + +# Важно! Все операции должны выполняться в той директории, в который вы находитесь. +# Исходной директорией считать ту, в которой был запущен скрипт. + +# P.S. По возможности, сделайте кросс-платформенную реализацию. + +# 5_with_args.py +# Данный скрипт можно запускать с параметрами: +# python with_args.py param1 param2 param3 +import os +import sys +import re +import SRHw05_easy + +def print_help(): + print("help - получение справки") + print("-md - создание директории") + print("-cp - копировать, указанный файл") + print("-rm - удаление, указанного файла") + print("-dd - удаление, указанной директории") + print("-cd - перейти в указанную директорию") + print("-ls - отображение полного пути текущей директории") + print("ping - тестовый ключ") + +dir_path = ' ' +def is_abs_filename(file_or_dir): + # возвращает 1 если это абсолютная директория, и 0 если относительная + pattern = re.compile(r'[A-Z]:\)', re.IGNORECASE) + return pattern.match(file_or_dir) != None + +def make_dir(): + if not file_dir_name: + print("Необходимо указать имя директории вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + result = SRHw05_easy.make_dir(dir_path) + if result: + print (result) + print ('создать директорию {} не удалось'.format(file_dir_name)) + if result == 2: + print('директория с именем {} уже существует'.format(file_dir_name)) + if result == 0: + print('директория {} успешно создана'.format(file_dir_name)) + +def show_dir(): + dir_path = os.getcwd() + print ("текущая директория: ", dir_path) + print ("Содержимое директории:") + for elem in SRHw05_easy.list_dir(dir_path)[0]: + print(elem) + print ("Элементы сами являющиеся директориями: ") + for elem in SRHw05_easy.list_dir(dir_path)[1]: + print(elem) + +def del_dir(): + if not file_dir_name: + print("Необходимо указать имя директории вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + if not os.path.exists(dir_path): + print ('директория {} не существует, удалять нечего!'.format(file_dir_name)) + else: + print("Вы действительно хотите удалить директорию '{}'".format(file_dir_name)) + answer = input("Ведите 'Y', если 'да' или 'N', если нет:") + if answer =='N' or answer == 'N': + print ("удаление отменено!") + return + elif answer !='Y' and answer != 'y': + print ("некорректный ответ, удаление не будет выполнено!") + return + SRHw05_easy.delete_dir(dir_path) + if not os.path.exists(dir_path): + print ('директория {} успешно удалена'.format(file_dir_name)) + +def change_dir(): + if not file_dir_name: + print("Необходимо указать имя директории вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + result = SRHw05_easy.change_dir(dir_path) + if result: + print ('перейти в директорию {} не удалось'.format(file_dir_name)) + if result == 2: + print('директория с именем {} уже существует'.format(file_dir_name)) + if result == 0: + print('переход в директорию {} успешно совершен'.format(file_dir_name)) + +def copy_dir(): + if not file_dir_name: + print("Необходимо указать имя файла вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + print("файл будет сохранен с именем", dir_path+'.bak') + if os.path.exists(dir_path+'.bak'): + print('файл с именем {} уже существует'.format(file_dir_name)+'.bak') + print("В случае продолжения копирования его первоначальное содержимое будет удалено!") + answer = input("Ведите 'Y', если ВЫ хотите продолжить копирование или 'N', если нет:") + if answer =='N' or answer == 'N': + print ("Копирование отменено!") + return + elif answer !='Y' and answer != 'y': + print ("некорректный ответ, копирование не будет выполнено!") + return +#собственно копирование файла ее не реализовано! + +def remove_file(): + if not file_dir_name: + print("Необходимо указать имя файла вторым параметром") + return + if is_abs_filename(file_dir_name): + dir_path = file_dir_name + else: + dir_path = os.path.join(os.getcwd(), file_dir_name) + if os.path.isfile(file_dir_name): + print("Вы действительно хотите удалить файл {}".format(file_dir_name)) + answer = input("Ведите 'Y', если 'да' или 'N', если нет:") + if answer =='N' or answer == 'N': + print ("удаление отменено!") + return + elif answer !='Y' and answer != 'y': + print ("некорректный ответ, удаление не будет выполнено!") + return + os.remove(file_dir_name) + if not os.path.isfile(file_dir_name): + print ('файл {} успешно удален'.format(file_dir_name)) + + +def ping(): + print("pong") + +do = { + "-h": print_help, + "help": print_help, + "-md": make_dir, + "-cd": change_dir, + "-cp": copy_dir, + "-rm": remove_file, + "-dd": del_dir, + "-ls": show_dir, + "-ping": ping +} + +try: + file_dir_name = sys.argv[2] +except IndexError: + file_dir_name = None + +try: + key = sys.argv[1] +except IndexError: + key = None + + +if key: + if do.get(key): + do[key]() + else: + print("Задан неверный ключ") + print("Укажите ключ help или -h для получения справки") diff --git a/Lesson6/SRHW06_hard.py b/Lesson6/SRHW06_hard.py new file mode 100644 index 0000000..d163635 --- /dev/null +++ b/Lesson6/SRHW06_hard.py @@ -0,0 +1,68 @@ +# Задание-1: Решите задачу (дублированную ниже): + +# Дана ведомость расчета заработной платы (файл "data/workers"). +# Рассчитайте зарплату всех работников, зная что они получат полный оклад, +# если отработают норму часов. Если же они отработали меньше нормы, +# то их ЗП уменьшается пропорционально, а за заждый час переработки они получают +# удвоенную ЗП, пропорциональную норме. +# Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" + +# С использованием классов. +# Реализуйте классы сотрудников так, чтобы на вход функции-конструктора +# каждый работник получал строку из файла + +class Worker: + def __init__(self, name, surname, salary, position, norm_hours): + self.name = name + self.surname = surname + self.salary = int(salary) + self.position = position + self.norm_hours = int(norm_hours) + self.work_hours = 0 + + def read_work_hours(self): + with open('.\DATA\hours_of.txt', 'r', encoding='utf-8') as hours: + for i in hours.readlines(): + if i == "": + break + else: + curr_hours_data = [x for x in i.split(' ') if x != ''] + if curr_hours_data[0] == self.name and curr_hours_data[1] == self.surname: + self.work_hours = int(curr_hours_data[2]) + break + else: + continue + + def calc_salary(self): + real_work = self.work_hours/ self.norm_hours + return int((real_work * self.salary)) + + + def write_salary(self, salary): + with open('.\DATA\salary_for_all.txt', 'a', encoding='utf-8') as f: + f.write(self.name + ' ' + self.surname + ' ' + self.position + ' ' + str(salary)) + f.write('\n') + f.close() + + + +if __name__ == '__main__': + with open(r'.\data\workers.txt', 'r', encoding='UTF-8') as wokers: + print ('3', wokers) + for line in wokers.readlines(): + print('4', line) + if line == "": + + break + else: + splitted_line = [x for x in line.split(' ') if x != ''] + if splitted_line[0] == 'Имя': + continue #Это строка заголовка, пропустить ее + else: + workman = Worker(* splitted_line) + workman.read_work_hours() + salary = workman.calc_salary() + workman.write_salary(salary) + + + diff --git a/Lesson6/SRHw06_easy.py b/Lesson6/SRHw06_easy.py new file mode 100644 index 0000000..9018ac7 --- /dev/null +++ b/Lesson6/SRHw06_easy.py @@ -0,0 +1,86 @@ +# Задача-1: Написать класс для фигуры-треугольника, заданного координатами трех точек. +# Определить методы, позволяющие вычислить: площадь, высоту и периметр фигуры. + + +# Задача-2: Написать Класс "Равнобочная трапеция", заданной координатами 4-х точек. +# Предусмотреть в классе методы: +# проверка, является ли фигура равнобочной трапецией; +# вычисления: длины сторон, периметр, площадь. + +import math + +class Polygon: +#примает, хранит и обрабатывает координаты вершин многоугольника +#в виде кортежей (x,y), +# начиная от первой самой левой и нижней и далее по часовой чтрелке + polygon_vertices = () + def __init__(self, *vertices): + #сохранение координат вершин многоугльника + self.polygon_vertices = vertices + print ('0 -', self.polygon_vertices, len(self.polygon_vertices)) + + def sidesize(self, vert1, vert2): + #print('Ptint_A - ', vert1, vert2) + #вычисление длины стороны многоугольнка между вершинами 1 и 2 + #vetr1, vetr2, кординаты вершин 1 и 2 в виде (x,y) + #print ('print_B', math.sqrt((vert1[0]-vert2[0])**2 + (vert1[1] - vert2[1])**2)) + return math.sqrt((vert1[0]-vert2[0])**2 + (vert1[1] - vert2[1])**2) + + def polygon_perimeter(self): + self.perimeter = 0 + vetr_numb = len(self.polygon_vertices) + print ('Ptint_C - ', vetr_numb) + for i in range(vetr_numb-1): + self.perimeter += Polygon.sidesize(self, self.polygon_vertices[0], self.polygon_vertices[i]) + self.perimeter += Polygon.sidesize(self, self.polygon_vertices[i], self.polygon_vertices[i+1]) + perimetr += Polygon.sidesize(self, self.polygon_vertices[vetr_numb], self.polygon_vertices[0]) + print ('print_0', self.perimeter, self.polygon_vertices[0]) + return self.perimeter + +class Triangle(Polygon): + side1 = 0 + side2 = 0 + side3 = 0 + def triangle_area(self): + # вычисление площади треугольника по формуле Герона + half_perimeter = Polygon.polygon_perimeter(self)/2 + self.side1 = Polygon.sidesize(self, self.polygon_vertices[0], self.polygon_vertices[1]) + self.side2 = Polygon.sidesize(self, self.polygon_vertices[1], self.polygon_vertices[2]) + self.side3 = Polygon.sidesize(self, self.polygon_vertices[2], self.polygon_vertices[0]) + return math.sqrt(half_perimeter*(half_perimeter-side1)*(half_perimeter-side2)*(half_perimeter-side3)) + + def triangl_height(self): + return (self.triangle_area*2)/self.side1 + +#============================================================================================================ +class Isosceles_Tapezoid(Polygon): + side1 = 0 # левая боковая сторна + side2 = 0 # верхнее основание + side3 = 0 # правая боковая сторона + side4 = 0 # нижнее основание + area = 0 + hight = 0 + Tapezoid_perimeter = 0 + self.side1 = Polygon.sidesize(self, self.polygon_vertices[0], self.polygon_vertices[1]) + self.side2 = Polygon.sidesize(self, self.polygon_vertices[1], self.polygon_vertices[2]) + self.side3 = Polygon.sidesize(self, self.polygon_vertices[2], self.polygon_vertices[3]) + self.side4 = Polygon.sidesize(self, self.polygon_vertices[3], self.polygon_vertices[0]) + if self.side1 != self.side3: + check = False + + else: + check= True + self.Tapezoid_perimeter = Polygon.polygon_perimeter(self) + self.area = ((self.side2+self.side4)/2)* math.sqrt(self.side1**2 - ((self.side2 - self.side4)**2)/4) + self.hight = self.area / ((self.side2+self.side4)/2) + + + +if __name__ == '__main__': + tri1 = Triangle((0,0),(3,4),(6,0),) + print (tri1.polygon_perimeter, tri1.triangle_area, tri1.triangl_height) + #IsoTrap = Isosceles_Tapezoid((0,0), (3,4), (9,4), (12,0),) + #print(IsoTrap.area, IsoTrap.hight, IsoTrap.area.Tapezoid_perimeter) + + + diff --git a/Lesson7/SRHw7_loto.py b/Lesson7/SRHw7_loto.py new file mode 100644 index 0000000..fb7ff57 --- /dev/null +++ b/Lesson7/SRHw7_loto.py @@ -0,0 +1,125 @@ +#!/usr/bin/python3 + +""" +== Лото == + +Правила игры в лото. + +Игра ведется с помощью специальных карточек, на которых отмечены числа, +и фишек (бочонков) с цифрами. + +Количество бочонков — 90 штук (с цифрами от 1 до 90). + +Каждая карточка содержит 3 строки по 9 клеток. В каждой строке по 5 случайных цифр, +расположенных по возрастанию. Все цифры в карточке уникальны. Пример карточки: + +-------------------------- + 9 43 62 74 90 + 2 27 75 78 82 + 41 56 63 76 86 +-------------------------- + +В игре 2 игрока: пользователь и компьютер. Каждому в начале выдается +случайная карточка. + +Каждый ход выбирается один случайный бочонок и выводится на экран. +Также выводятся карточка игрока и карточка компьютера. + +Пользователю предлагается зачеркнуть цифру на карточке или продолжить. +Если игрок выбрал "зачеркнуть": + Если цифра есть на карточке - она зачеркивается и игра продолжается. + Если цифры на карточке нет - игрок проигрывает и игра завершается. +Если игрок выбрал "продолжить": + Если цифра есть на карточке - игрок проигрывает и игра завершается. + Если цифры на карточке нет - игра продолжается. + +Побеждает тот, кто первый закроет все числа на своей карточке. + +Пример одного хода: + +Новый бочонок: 70 (осталось 76) +------ Ваша карточка ----- + 6 7 49 57 58 + 14 26 - 78 85 +23 33 38 48 71 +-------------------------- +-- Карточка компьютера --- + 7 87 - 14 11 + 16 49 55 88 77 + 15 20 - 76 - +-------------------------- +Зачеркнуть цифру? (y/n) + +Подсказка: каждый следующий случайный бочонок из мешка удобно получать +с помощью функции-генератора. + +Подсказка: для работы с псевдослучайными числами удобно использовать +модуль random: http://docs.python.org/3/library/random.html + +""" +import random +import sys + +cask_MAX_NUMBER = 90 + +class Card(): + def __init__(self, name): + self.card_owners_name = name + self.card_lines = [[],[],[]] + for i in range(0,3): + for j in range(0,9): + self.card_lines[i].append(' ') + self.all_allowed_numbers = [x for x in range(1,cask_MAX_NUMBER+1)] + random.shuffle( self.all_allowed_numbers ) + + for j in range(0,3): + self.line = self.all_allowed_numbers[j*10: j*10+5] + del self.all_allowed_numbers[j*10: j*10+5] + self.line = sorted(self.line) + random.seed() + for x in range (0,5): + numb_ins = False + while not numb_ins: + k = random.randint(0,8) + if self.card_lines[j][k] == ' ': + self.card_lines[j][k] = self.line[x] + numb_ins = True + else: + numb_ins = False #выбраная ячейка уже занята, попробавать еще раз + pass + pass + + def _str__(self): + self.header = '{:-^37}\n'.format(self.card_owners_name) + self.full_card = '' + for i in range(0,3): + main_part = '|' + for j in range(0,9): + if self.card_lines[i][j] == ' ': + main_part += ' |' + else: + main_part += ('{: >3}'.format(self.card_lines[i][j]) +'|') + main_part +='\n' + self.full_card += main_part + self.full_card = self.header + self.full_card + '='*37 + return ('\n' + self.full_card) + + def check_number_in_card(self, cask_to_check): + for i in range(0,2): + if cask_to_check in self.card_lines[i]: + cask_found = True + cask_index1 = i + cask_index2 = self.card_lines[i].index(cask_to_check) + else: + cask_found = False + cask_index1 = 0 + cask_index2 = 0 + return cask_found, cask_index1, cask_index2 + + + +if __name__ == '__main__': + card1 = Card("игрок") + card2 = Card("компьютер") + print (card1) + print(card2) diff --git a/Lesson7/test2.py b/Lesson7/test2.py new file mode 100644 index 0000000..f024205 --- /dev/null +++ b/Lesson7/test2.py @@ -0,0 +1,132 @@ +import random +import sys + +cask_MAX_NUMBER = 90 +curr_cask = 0 +card_lines = [[],[],[]] +#========================================================================== + +def prepare_card(): + for i in range(0,3): + for j in range(0,9): + card_lines[i].append(' ') + all_allowed_numbers = [x for x in range(1,cask_MAX_NUMBER+1)] + random.shuffle( all_allowed_numbers ) + + for j in range(0,3): + line = all_allowed_numbers[j*10: j*10+5] + del all_allowed_numbers[j*10: j*10+5] + line = sorted(line) + random.seed() + for x in range (0,5): + numb_ins = False + while not numb_ins: + k = random.randint(0,8) + if card_lines[j][k] == ' ': + card_lines[j][k] = line[x] + numb_ins = True + else: + numb_ins = False #выбраная ячейка уже занята, попробавать еще раз + +#========================================================================== + # def _str__(self): +def print_card(): + card_owners_name = "игрок" + header = '{:-^37}\n'.format(card_owners_name) + + full_card = '' + for i in range(0,3): + main_part = '|' + for j in range(0,9): + if card_lines[i][j] == ' ': + main_part += ' |' + else: + main_part += ('{: >3}'.format(card_lines[i][j]) +'|') + main_part +='\n' + full_card += main_part + pass + full_card = header + full_card + '='*37 + print('\n') + print (full_card) + + +def casks_bag(): + random.seed() + #return curr_cask = random.randint(1,cask_MAX_NUMBER) + #получить заведомо сущнствующий номер на карте, для проверки + for i in range(0,2): + for j in range(0,9): + if card_lines[i][j] != ' ': + curr_cask = card_lines[i][j] + break + #casks_bag() + print("извечен боченокс номером: ", curr_cask) + return curr_cask + + +def check_number_in_card(): + for i in range(0,2): + if curr_cask in card_lines[i]: + cask_found = True + cask_index1 = i + cask_index2 = card_lines[i].index(curr_cask) + else: + cask_found = False + cask_index1 = 0 + cask_index2 = 0 + return cask_found, cask_index1, cask_index2 + +def erase_number(*check_result): + if check_result[0]: + card_lines[check_result[1]][check_result[2]] = ' ' + +#================================================================================ + +if __name__ == '__main__': + game_On = True + prepare_card() + while game_On: + print_card() + + curr_cask = casks_bag() + print (curr_cask) + + answer_again = True + print("На Вашей карточке есть такой номер, и Вы хотите его зачеркнуть?") + print("Если Вы ошибетесь и решите зачеркнуть несуществующий у Вас номер,") + print("то Вы проиграете!") + while answer_again: + answer = input("И так Ваше решение? Зачеркнуть номер? 'Да' или 'Нет' Y/N :") + if (answer.lower() != 'y' and answer.lower() != 'n'): + print("Введен некорректный символ : '", answer, "'") + print("Повторите ввод!") + else: + answer_again = False + answer = answer.lower() + + check_result = check_number_in_card() + if check_result[0]: + print("Номер найден на карте!", "строка= ", check_result[1]+1, "позиция =", check_result[2]+1) + else: + print("Номер на карте не найден!") + + + + if answer =='y': + if check_result[0]: + erase_number(*check_result) + print_card() + else: + print("Такого номера на карте нет; Вы проиграли!") + game_On = False + + answer = input("Вы хотите продолжать? 'Да' или 'Нет' Y/N :") + if (answer.lower() != 'y' and answer.lower() != 'n'): + print("Введен некорректный символ : '", answer, "'") + print("Повторите ввод!") + else: + answer_again = False + answer = answer.lower() + if answer == 'n': + print("Игра закончена!") + break \ No newline at end of file diff --git a/Lesson8/DATA/app.id b/Lesson8/DATA/app.id new file mode 100644 index 0000000..8d5ec61 --- /dev/null +++ b/Lesson8/DATA/app.id @@ -0,0 +1 @@ +b1b15e88fa797225412429c1c50c122a diff --git a/Lesson8/DATA/city.list.json.gz b/Lesson8/DATA/city.list.json.gz new file mode 100644 index 0000000..726be8e Binary files /dev/null and b/Lesson8/DATA/city.list.json.gz differ diff --git a/Lesson8/DATA/weather.json b/Lesson8/DATA/weather.json new file mode 100644 index 0000000..9b63448 --- /dev/null +++ b/Lesson8/DATA/weather.json @@ -0,0 +1 @@ +{"coord":{"lon":37.62,"lat":55.75},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],"base":"stations","main":{"temp":3,"pressure":1023,"humidity":93,"temp_min":3,"temp_max":3},"visibility":10000,"wind":{"speed":2,"deg":220},"clouds":{"all":0},"dt":1538287200,"sys":{"type":1,"id":7325,"message":0.0039,"country":"RU","sunrise":1538278228,"sunset":1538320042},"id":524901,"name":"Moscow","cod":200} \ No newline at end of file diff --git a/Lesson8/SQLite.py b/Lesson8/SQLite.py new file mode 100644 index 0000000..dd904a8 --- /dev/null +++ b/Lesson8/SQLite.py @@ -0,0 +1,8 @@ + +#import + +def open_SQLite_Data_Base(name): + return True + +def save_data_into_database(data): + return True diff --git a/Lesson8/export_openweather.py b/Lesson8/export_openweather.py new file mode 100644 index 0000000..b0cdced --- /dev/null +++ b/Lesson8/export_openweather.py @@ -0,0 +1,38 @@ +import json +import sys +from openweather import * +import SQLite + + +print('sys.argv = ', sys.argv) + +#if __name__ == '__main__': +export_type = sys.argv[1] +file_export_to = sys.argv[2] +city = sys.argv[3] +if file_export_to == "": + print ("необходимо задать имя файла лия сохранения результатов") +#city = sys.argv[3] +if city == "": + print ("необходимо указать город, чьей погодой интересуетесь") +else: + city = "Moscow" + + +get_openweather_map_city_list() + +check_result = check_city_in_base(city) + +if check_result[0]: + print ("OK! ", city," is in base, city ID: ", check_result[1]) + get_weather(check_result[1]) + with open(r'.\data\weather.json', 'r', encoding="utf-8") as fweath: + weather = json.loads(fweath.read()) + print (weather) + for key in weather: + print(key, weather[key]) +#===================================================== +# работа с базой данных требует отдельной реализации +#===================================================== + + diff --git a/Lesson8/openweather.py b/Lesson8/openweather.py new file mode 100644 index 0000000..e1d67d5 --- /dev/null +++ b/Lesson8/openweather.py @@ -0,0 +1,58 @@ +import json +import gzip +import os +def get_openweather_map_city_list(): + if not os.path.exists(r".\data\city.list.json"): + #===================================================== + inF = gzip.GzipFile(r".\data\city.list.json.gz", 'rb') + s = inF.read() + inF.close() + outF = open(r".\data\city.list.json", 'wb') + outF.write(s) + outF.close() + #===================================================== + return True + +def check_city_in_base(city_to_find): + city_to_find = "Moscow" + found_dict = [] + with open(r'.\data\city.list.json', 'r', encoding="utf-8") as fc: + data = json.loads(fc.read()) + for i in range (len(data)): + if data[i]["name"] == city_to_find: + found_dict.append(i) + if found_dict == "": + print("город в базе не найден") + elif len(found_dict) == 1: + city_ID = data[found_dict[0]]["id"] + else: + print ("В базе найдено", len(found_dict), "города с таким названием") + print("Необходимо уточнить страну!") + for j in range(0,len(found_dict)): + print (j+1, data[found_dict[j]]["name"], data[found_dict[j]]["country"], data[found_dict[j]]["coord"]) + answer = int(input("введите номер строки из приведенного выше списка: ")) + city_ID = data[found_dict[answer-1]]["id"] + return (True, city_ID) + + +def get_weather(city_ID): + appidF = open(r'.\data\app.id', 'r') + appID = appidF.readline() + print(appID) + url = ' http://api.openweathermap.org/data/2.5/weather?id=' + url += str(city_ID) + url += '&units=metric&appid=' + url += appID + #=================================================================== + # собственно чтение погоды для города с сайта openweathermap.org, + # #еще не реализовано, + #полученый файл записывается в r'.\data\weather.json' + #=================================================================== + + #=================================================================================== + # + # также требуется дополнительная реализация работы с базой SQLite в файле: SQLite.py + # if DB_id = open_SQLite_Data_Base(openweathermap): + # save_data_into_database(DB_id, data) + # + #=================================================================================== diff --git a/Level2_lesson_1/file.txt b/Level2_lesson_1/file.txt new file mode 100644 index 0000000..a46978b --- /dev/null +++ b/Level2_lesson_1/file.txt @@ -0,0 +1,48 @@ +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» +«сетевое программирование» +«сокет» +«декоратор» \ No newline at end of file diff --git a/Level2_lesson_1/ping.txt b/Level2_lesson_1/ping.txt new file mode 100644 index 0000000..50ea55c --- /dev/null +++ b/Level2_lesson_1/ping.txt @@ -0,0 +1,28 @@ + + ⠬ wide-youtube.l.google.com [173.194.73.198] 32 ⠬ : +⢥ 173.194.73.198: ᫮ =32 ६=15 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=15 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=14 TTL=48 +⢥ 173.194.73.198: ᫮ =32 ६=15 TTL=48 + +⨪ Ping 173.194.73.198: + ⮢: ࠢ = 19, 祭 = 19, ﭮ = 0 + (0% ) +ਡ⥫쭮 ६ ਥ-। : + 쭮 = 14ᥪ, ᨬ쭮 = 15 ᥪ, । = 14 ᥪ +Control-C diff --git a/Level2_lesson_1/task_1.py b/Level2_lesson_1/task_1.py new file mode 100644 index 0000000..4b26693 --- /dev/null +++ b/Level2_lesson_1/task_1.py @@ -0,0 +1,24 @@ +#1. Каждое из слов «разработка», «сокет», «декоратор» представить в строковом формате +#и проверить тип и содержание соответствующих переменных. +# Затем с помощью онлайн-конвертера преобразовать строковые представление в формат Unicode +# и также проверить тип и содержимое переменных. + +str_1 = "разработка" +print(str_1) +print(type(str_1)) +print(str_1.encode('utf-8')) +print(type(str_1.encode('utf-8'))) +print('='*80) + +str_2 = "сокет" +print(str_2) +print(type(str_2)) +print(str_2.encode('utf-8')) +print(type(str_2.encode('utf-8'))) +print('='*80) + +str_3 = "декоратор" +print(str_3) +print(type(str_3)) +print(str_3.encode('utf-8')) +print(type(str_3.encode('utf-8'))) diff --git a/Level2_lesson_1/task_2.py b/Level2_lesson_1/task_2.py new file mode 100644 index 0000000..d51c207 --- /dev/null +++ b/Level2_lesson_1/task_2.py @@ -0,0 +1,21 @@ +#2. Каждое из слов «class», «function», «method» записать в байтовом типе +# без преобразования в последовательность кодов (не используя методы encode и decode) +# и определить тип, содержимое и длину соответствующих переменных. + +str_1 = b"class" +print(str_1) +print(type(str_1)) +print('length = ', len(str_1)) +print('='*80) + +str_2 = b"function" +print(str_2) +print(type(str_2)) +print('length = ', len(str_2)) +print('='*80) + +str_3 = b"method" +print(str_3) +print(type(str_3)) +print('length = ', len(str_3)) +print('='*80) diff --git a/Level2_lesson_1/task_3.py b/Level2_lesson_1/task_3.py new file mode 100644 index 0000000..c585710 --- /dev/null +++ b/Level2_lesson_1/task_3.py @@ -0,0 +1,23 @@ +#3. Определить, какие из слов «attribute», «класс», «функция», «type» невозможно записать в байтовом типе. + +from sys import getdefaultencoding +str_1 = "attribute" +str_2 = "класс" +str_3 = "функцция" +str_4 = "type" +print("Defaultencoding = ", getdefaultencoding()) +print(str_1.encode("ascii", errors='ignore')) +print(str_1.encode("ascii", errors='replace')) +print('='*80) + +print(str_2.encode("ascii", errors='ignore')) +print(str_2.encode("ascii", errors='replace')) +print('='*80) + +print(str_3.encode("ascii", errors='ignore')) +print(str_3.encode("ascii", errors='replace')) +print('='*80) + +print(str_4.encode("ascii", errors='ignore')) +print(str_4.encode("ascii", errors='replace')) +print('='*80) diff --git a/Level2_lesson_1/task_4.py b/Level2_lesson_1/task_4.py new file mode 100644 index 0000000..22d4977 --- /dev/null +++ b/Level2_lesson_1/task_4.py @@ -0,0 +1,50 @@ +#4. Преобразовать слова «разработка», «администрирование», «protocol», «standard» из строкового представления +# в байтовое и выполнить обратное преобразование (используя методы encode и decode). + +str_1 = "разработка" +print(str_1) +print(type(str_1)) +str_1b = str_1.encode('utf-8') +print("encoded = ", str_1b) +print(type(str_1b)) +str_1d = str_1b.decode('utf-8') +print("decoded = ", str_1d) +print(type(str_1d)) +print("str_1 == str_1d :", str_1 == str_1d) +print('='*80) + +str_2 = "администрирование" +print(str_2) +print(type(str_2)) +str_2b = str_2.encode('utf-8') +print("encoded = ", str_2b) +print(type(str_2b)) +str_2d = str_2b.decode('utf-8') +print("decoded = ", str_2d) +print(type(str_2d)) +print("str_2 == str_2d :", str_2 == str_2d) +print('='*80) + +str_3 = "protocol" +print(str_3) +print(type(str_3)) +str_3b = str_3.encode('utf-8') +print("encoded = ", str_3b) +print(type(str_3b)) +str_3d = str_3b.decode('utf-8') +print("decoded = ", str_3d) +print(type(str_3d)) +print("str_3 == str_3d :", str_3 == str_3d) +print('='*80) + +str_4 = "standard" +print(str_4) +print(type(str_4)) +str_4b = str_4.encode('utf-8') +print("encoded = ", str_4b) +print(type(str_4b)) +str_4d = str_4b.decode('utf-8') +print("decoded = ", str_4d) +print(type(str_4d)) +print("str_4 == str_4d :", str_4 == str_4d) +print('='*80) diff --git a/Level2_lesson_1/task_5.py b/Level2_lesson_1/task_5.py new file mode 100644 index 0000000..b9c75e7 --- /dev/null +++ b/Level2_lesson_1/task_5.py @@ -0,0 +1,13 @@ +#5. Выполнить пинг веб-ресурсов yandex.ru, youtube.com +# и преобразовать результаты из байтовового в строковый тип на кириллице. + +ping_file = open(r'ping.txt', 'r') +for line in ping_file: + print(line.encode('utf-8', errors='replace').decode('cp866')) + #ни одна из использованных кодовых таблиц: + # koi8_r, cp866, windows-1251, cp819, + #не дали положительного результата. Кириллица MS-DOS в списке отсутствует + # + #print(line.decode('cp866').encode('utf-8')) + # показанная Вами на уроке на экране монитора приведенная выше строка + # неизменно выдавала онибку: 'str' object has no attribute 'decode' diff --git a/Level2_lesson_1/task_6.py b/Level2_lesson_1/task_6.py new file mode 100644 index 0000000..27b1a1a --- /dev/null +++ b/Level2_lesson_1/task_6.py @@ -0,0 +1,7 @@ +#6. Создать текстовый файл test_file.txt, заполнить его тремя строками: +#«сетевое программирование», «сокет», «декоратор». Проверить кодировку файла по умолчанию. +#Принудительно открыть файл в формате Unicode и вывести его содержимое. + +file = open(r'file2.txt', encoding='utf-8') +for line in file: + print(line) diff --git a/Level2_lesson_2/file.yaml b/Level2_lesson_2/file.yaml new file mode 100644 index 0000000..5a4580d --- /dev/null +++ b/Level2_lesson_2/file.yaml @@ -0,0 +1,6 @@ +1: Sergey R. +2: 20000€ +3: + 1: 100€ + 2: 50 + 3: 1 diff --git a/Level2_lesson_2/main_data.csv b/Level2_lesson_2/main_data.csv new file mode 100644 index 0000000..a70a585 --- /dev/null +++ b/Level2_lesson_2/main_data.csv @@ -0,0 +1,5 @@ +Изготовитель системы,Название ОС,Код продукта,Тип системы +Изготовитель системы,Название ОС,Код продукта,Тип системы +LENOVO,Microsoft Windows 7 Профессиональная ,00971-OEM-1982661-00231,x64-based PC +ACER,Microsoft Windows 10 Professional,00971-OEM-1982661-00231,x64-based PC +DELL,Microsoft Windows 8.1 Professional,00971-OEM-1982661-00231,x86-based PC diff --git a/Level2_lesson_2/order.json b/Level2_lesson_2/order.json new file mode 100644 index 0000000..ce885b4 --- /dev/null +++ b/Level2_lesson_2/order.json @@ -0,0 +1,7 @@ +{ + "buyer": "Sergey", + "data": "2018, 2, 10", + "item": "computer", + "price": "20000", + "quantity": 1 +} \ No newline at end of file diff --git a/Level2_lesson_2/task_1.py b/Level2_lesson_2/task_1.py new file mode 100644 index 0000000..1f8bc1d --- /dev/null +++ b/Level2_lesson_2/task_1.py @@ -0,0 +1,71 @@ +""" +1. Задание на закрепление знаний по модулю CSV. Написать скрипт, осуществляющий выборку +определенных данных из файлов info_1.txt, info_2.txt, info_3.txt и формирующий новый +«отчетный» файл в формате CSV. Для этого: +a. Создать функцию get_data(), в которой в цикле осуществляется перебор файлов с +данными, их открытие и считывание данных. В этой функции из считанных данных +необходимо с помощью регулярных выражений извлечь значения параметров +«Изготовитель системы», «Название ОС», «Код продукта», «Тип системы». Значения +каждого параметра поместить в соответствующий список. Должно получиться четыре +списка — например, os_prod_list, os_name_list, os_code_list, os_type_list. В этой же +функции создать главный список для хранения данных отчета — например, main_data +— и поместить в него названия столбцов отчета в виде списка: «Изготовитель +системы», «Название ОС», «Код продукта», «Тип системы». Значения для этих +столбцов также оформить в виде списка и поместить в файл main_data (также для +каждого файла); +b. Создать функцию write_to_csv(), в которую передавать ссылку на CSV-файл. В этой +функции реализовать получение данных через вызов функции get_data(), а также +сохранение подготовленных данных в соответствующий CSV-файл; +c. Проверить работу программы через вызов функции write_to_csv(). +""" +import csv +import re +import copy + + +def get_data(): + # имена подсписков в списке 'result_lists' + os_prod_list = 0 + os_name_list = 1 + os_code_list = 2 + os_type_list = 3 + + result_lists = [[], [], [], []] # списки для хранения промежуточных результатов чтения + main_data = [[], [], [], []] # списки формирования окончательных результатов + + csv_header = ['Изготовитель системы', 'Название ОС', 'Код продукта', 'Тип системы'] + + pattern = re.compile(r'^(\w[^:]+)+:\s+([^:\n]+)\s*$') + #pattern = re.compile(r'^(\w[^:]+).*:\s+([^:\n]+)\s*$') + + for file in ['info_1.txt', 'info_2.txt', 'info_3.txt']: + with open(file, 'r') as curr_file: + for curr_line in curr_file: + if pattern.match(curr_line) != None: + patterns = pattern.findall(curr_line) + for i in range(len(csv_header)): + if patterns[0][0] == csv_header[i]: + result_lists[i].append(patterns[0][1]) + break + #==================================================================================== + + zipped_elems = zip(result_lists[0], result_lists[1], result_lists[2], result_lists[3]) + main_data[0] = copy.copy(list(csv_header)) + i = 1 + for elem in zipped_elems: + main_data[i] = copy.copy(list(elem)) + i += 1 + return main_data + + +def write_to_csv(data_to_csv, filename): + with open(filename, 'w', encoding='utf8') as csv_out_file: + csv_file_writer = csv.writer(csv_out_file, delimiter=',') + csv_file_writer.writerow(data_to_csv[0]) + for i in range(len(data_to_csv)): + csv_file_writer.writerow(data_to_csv[i]) + return None + + +if __name__ == "__main__": + write_to_csv(get_data(), 'main_data.csv') diff --git a/Level2_lesson_2/task_2.py b/Level2_lesson_2/task_2.py new file mode 100644 index 0000000..f02f2ed --- /dev/null +++ b/Level2_lesson_2/task_2.py @@ -0,0 +1,59 @@ +""" +2. Задание на закрепление знаний по модулю json. Есть файл orders в формате JSON с +информацией о заказах. Написать скрипт, автоматизирующий его заполнение данными. Для +этого: +a. Создать функцию write_order_to_json(), в которую передается 5 параметров — товар +(item) , количество (quantity), цена (price), покупатель (buyer) , дата (date). Функция +должна предусматривать запись данных в виде словаря в файл orders.json. При +записи данных указать величину отступа в 4 пробельных символа; +b. Проверить работу программы через вызов функции write_order_to_json() с передачей +в нее значений каждого параметра. +""" +import json + + +order1 = { + 'item':'computer', + 'price':'20000', + 'quantity': 1, + 'buyer':'Sergey', + 'data':"2018, 2, 10",} +order2 = { + 'item':'printer', + 'price':'10000', + 'quantity': 1, + 'buyer':'Ivan', + 'data':"2017, 11, 20",} + +order3 = { + 'item':'mouse', + 'price':'3000', + 'quantity': 2, + 'buyer':'Tatiana', + 'data':"2017, 8, 5",} +orders = [order1, order2, order3] + +def write_order_to_json(item, price, quantity, buyer, data, filename): + dict_to_json ={ + 'item' : item, + 'price': price, + 'quantity': quantity, + 'buyer': buyer, + 'data': data, + } + print('dict_to_json: ', dict_to_json) + with open( filename, 'w+' ) as json_file: + json.dump(dict_to_json, json_file, sort_keys= True , indent= 4) + +def read_order_from_json(filename): + with open( filename, 'r', encoding="utf-8" ) as json_file: + python_data = json.load(json_file) + return python_data + + + +if __name__ == '__main__': + #print(orders) + write_order_to_json(order1['item'], order1['price'], order1['quantity'], \ + order1['buyer'], order1['data'], 'order.json') + print(read_order_from_json('order.json')) diff --git a/Level2_lesson_2/task_3.py b/Level2_lesson_2/task_3.py new file mode 100644 index 0000000..5169034 --- /dev/null +++ b/Level2_lesson_2/task_3.py @@ -0,0 +1,38 @@ +""" +3. Задание на закрепление знаний по модулю yaml. Написать скрипт, +автоматизирующий сохранение данных в файле YAML-формата. Для этого: +a. Подготовить данные для записи в виде словаря, в котором первому ключу +соответствует список, второму — целое число, третьему — вложенный словарь, где +значение каждого ключа — это целое число с юникод-символом, отсутствующим в +кодировке ASCII (например, €); +b. Реализовать сохранение данных в файл формата YAML — например, в файл +file.yaml. При этом обеспечить стилизацию файла с помощью параметра +default_flow_style, а также установить возможность работы с юникодом: +allow_unicode = True; +c. Реализовать считывание данных из созданного файла и проверить, +совпадают ли они с исходными. +""" + +import yaml + + +def write_to_yaml_file(data_to_yanl, yaml_file_name, fl_unicode): + with open(yaml_file_name, 'w', encoding='utf8') as yaml_file: + yaml.dump(data_to_yaml, yaml_file, default_flow_style=False, + allow_unicode=fl_unicode) + + +def read_from_yaml_file(yaml_file_name): + with open(yaml_file_name, 'r', encoding='utf8') as yaml_file: + return yaml.load(yaml_file) + + +if __name__ == '__main__': + data_to_yaml = {1: 'Sergey R.', 2: '20000€', + 3: {1: '100€', 2: 50, 3: 1, }} + write_to_yaml_file(data_to_yaml, 'file.yaml', True) + data_from_file = read_from_yaml_file('file.yaml') + print("В файл передано : ", data_to_yaml) + print("Из файла прочитано: ", data_from_file) + print("Прочитанные данные совпадают с исходными: ", data_to_yaml == + data_from_file) diff --git a/Level2_lesson_3/Client.py b/Level2_lesson_3/Client.py new file mode 100644 index 0000000..b67502f --- /dev/null +++ b/Level2_lesson_3/Client.py @@ -0,0 +1,44 @@ +# Программа клиента для отправки приветствия серверу и получения ответа +import sys +from socket import * +from datetime import datetime +import json + + +def client(IP_addr, port=777): + s = socket(AF_INET, SOCK_STREAM) # Создать сокет TCP + s.connect((IP_addr, int(port))) # соединиться с сервером + + timestamp = str(datetime.now()) + authen_msg = { + "action": "authenticate", + "time": timestamp, + "user": { + "account_name": "C0deMaverick", + "password": "CorrectHorseBatterStaple" + } + } + json_autent_msg = json.dumps(authen_msg) + s.send(json_autent_msg.encode('utf-8')) + data = s.recv(1000000) + server_answer = json.loads(data) + + print('Ответ сервера: ', data.decode('utf-8'), ', длиной ', + len(data), 'байт получен') + + if server_answer["response"] == 200: # код ответа сервера == 'OK!' + timestamp = str(datetime.now()) + presence_msg = {"action": "presence", "time": timestamp, + "type": "status", + "user": {"account_name": "CodeMaverick", + "status": "Yep, I am here!"}} + json_presence_msg = json.dumps(presence_msg) + s.send(json_presence_msg.encode('utf-8')) + else: + pass + + s.close() + + +if __name__ == "__main__": + client('127.0.0.1', 8080) diff --git a/Level2_lesson_3/Server.py b/Level2_lesson_3/Server.py new file mode 100644 index 0000000..e132625 --- /dev/null +++ b/Level2_lesson_3/Server.py @@ -0,0 +1,38 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json + + +def check_user_authority(user): + pass + return True + + +def server(IP_addr, port=777): + s = socket(AF_INET, SOCK_STREAM) # Создает сокет TCP + s.bind((IP_addr, int(port))) # Присваивает IP аддрес и порт + s.listen(5) # Переход в режим ожидания запросов; + # одновременно обслуживается не более + # 5 запросов + while True: + print('Before accept()') + client, addr = s.accept() + print('After accept()') + data = client.recv(1000000) + print('Сообщение: ', data.decode('utf-8'), 'длиной: ', len(data), + ' байт, было отправлено клиентом: ', addr) + client_query = json.loads(data) + if client_query["action"] == "authenticate": + if check_user_authority(client_query["user"]): + asnswer_msg = {"response": 200, "alert": "Connection allowed"} + json_snswer_msg = json.dumps(asnswer_msg) + else: + pass + + client.send(json_snswer_msg.encode('utf-8')) + client.close() + + +if __name__ == "__main__": + server('127.0.0.1', 8080) diff --git a/Level2_lesson_5/Client.py b/Level2_lesson_5/Client.py new file mode 100644 index 0000000..9000f1e --- /dev/null +++ b/Level2_lesson_5/Client.py @@ -0,0 +1,63 @@ +# Программа клиента для отправки приветствия серверу и получения ответа +import sys +from socket import * +from datetime import datetime +import json +import logging + +#cleint_log = logging.getLogger('messager') # для совместного логгирования +#в общий лог +cleint_log = logging.getLogger('client') +cleint_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(" + "message)s ") +client_file_handl = logging.FileHandler(r".\log\client_log.py", 'a', + encoding='utf-8') +client_file_handl.setFormatter(format) +cleint_log.addHandler(client_file_handl) +#======================================================================= + + +def client(IP_addr, port=777): + cleint_log.info('Запуск клиентской программы') + s = socket(AF_INET, SOCK_STREAM) # Создать сокет TCP + s.connect((IP_addr, int(port))) # соединиться с сервером + + timestamp = str(datetime.now()) + cleint_log.info('Запрос клиента на подключение к серверу и авторизацию') + authen_msg = { + "action": "authenticate", + "time": timestamp, + "user": { + "account_name": "C0deMaverick", + "password": "CorrectHorseBatterStaple" + } + } + json_autent_msg = json.dumps(authen_msg) + s.send(json_autent_msg.encode('utf-8')) + data = s.recv(1000000) + cleint_log.info( + 'Получение ответа сервера с разрешением или запретом подключения') + server_answer = json.loads(data) + + print('Ответ сервера: ', data.decode('utf-8'), ', длиной ', + len(data), 'байт получен') + + if server_answer["response"] == 200: # код ответа сервера == 'OK!' + timestamp = str(datetime.now()) + presence_msg = {"action": "presence", "time": timestamp, + "type": "status", + "user": {"account_name": "CodeMaverick", + "status": "Yep, I am here!"}} + cleint_log.info('Посылка клиентом сервисного сообщения о присутствии') + json_presence_msg = json.dumps(presence_msg) + s.send(json_presence_msg.encode('utf-8')) + else: + pass + + s.close() + cleint_log.info('Клиентская программа закрыта') + + +if __name__ == "__main__": + client('127.0.0.1', 8080) diff --git a/Level2_lesson_5/Server.py b/Level2_lesson_5/Server.py new file mode 100644 index 0000000..15c4d7d --- /dev/null +++ b/Level2_lesson_5/Server.py @@ -0,0 +1,68 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json +import logging + +#serv_log = logging.getLogger('messager') # для совместного логгирования в +#общий лог +serv_log = logging.getLogger('server') +serv_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(filename)s - %(levelname)s - %(" + "message)s ") +serv_file_handl = logging.FileHandler(r".\log\server_log.py", 'a', + encoding='utf-8') +serv_file_handl.setFormatter(format) +serv_log.addHandler(serv_file_handl) +#======================================================================= + + +def check_user_authority(user): + if True: + serv_log.info("Проверка авторизации, соединение разрешено") + return True + else: + serv_log.critical("Проверка авторизации, в соединении отказано") + return False + + +def server(IP_addr, port=777): + serv_log.info('Запуск сервера') + s = socket(AF_INET, SOCK_STREAM) # Создает сокет TCP + s.bind((IP_addr, int(port))) # Присваивает IP аддрес и порт + s.listen(5) # Переход в режим ожидания запросов; + # одновременно обслуживается не более + # 5 запросов + while True: + print('Before accept()') + client, addr = s.accept() + print('After accept()') + data = client.recv(1000000) + print('Сообщение: ', data.decode('utf-8'), 'длиной: ', len(data), + ' байт, было отправлено клиентом: ', addr) + serv_log.info('Получено сообщение от клиента') + client_query = json.loads(data) + if client_query["action"] == "authenticate": + if check_user_authority(client_query["user"]): + asnswer_msg = {"response": 200, "alert": "Connection allowed"} + json_snswer_msg = json.dumps(asnswer_msg) + serv_log.info("Клиенту передано разрешение на соединение") + else: + pass + + client.send(json_snswer_msg.encode('utf-8')) + + try : + # имитация ошибки в работк сервера + raise ValueError("connection parameters error") + except ValueError: + serv_log.warning("Ошибка в параметрах связи, работоспособность " + "восстановлена") + + client.close() + cleint_log.info('Сервер закрыт') + + +if __name__ == "__main__": + server('127.0.0.1', 8080) + diff --git a/Level2_lesson_5/client_log.py b/Level2_lesson_5/client_log.py new file mode 100644 index 0000000..9b92ae7 --- /dev/null +++ b/Level2_lesson_5/client_log.py @@ -0,0 +1,20 @@ +2018-11-02 13:19:43,236 - Client.py - INFO - Запуск клиентской программы +2018-11-02 13:19:43,237 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 13:19:43,238 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 13:19:43,238 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 13:19:43,238 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:04:00,582 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:04:00,583 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:04:00,584 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:04:00,584 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:04:00,584 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:05:56,675 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:05:56,676 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:05:56,677 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:05:56,677 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:05:56,677 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:11:27,586 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:11:27,587 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:11:27,588 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:11:27,588 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:11:27,588 - Client.py - INFO - Клиентская программа закрыта diff --git a/Level2_lesson_5/messager_log.py b/Level2_lesson_5/messager_log.py new file mode 100644 index 0000000..fcfe911 --- /dev/null +++ b/Level2_lesson_5/messager_log.py @@ -0,0 +1,20 @@ +2018-11-02 13:18:07,437 - Server.py - INFO - Запуск сервера +2018-11-02 13:18:10,567 - Client.py - INFO - Запуск клиентской программы +2018-11-02 13:18:10,568 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 13:18:10,568 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 13:18:10,568 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 13:18:10,568 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 13:18:10,569 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 13:18:10,569 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 13:18:10,569 - Client.py - INFO - Клиентская программа закрыта +2018-11-02 16:09:01,880 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:10:09,475 - Server.py - INFO - Запуск сервера +2018-11-02 16:10:12,836 - Client.py - INFO - Запуск клиентской программы +2018-11-02 16:10:12,837 - Client.py - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-02 16:10:12,838 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:10:12,838 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:10:12,838 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:10:12,838 - Server.py - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-02 16:10:12,838 - Client.py - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-02 16:10:12,839 - Client.py - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-02 16:10:12,839 - Client.py - INFO - Клиентская программа закрыта diff --git a/Level2_lesson_5/server_log.py b/Level2_lesson_5/server_log.py new file mode 100644 index 0000000..7474e77 --- /dev/null +++ b/Level2_lesson_5/server_log.py @@ -0,0 +1,18 @@ +2018-11-02 13:19:40,456 - Server.py - INFO - Запуск сервера +2018-11-02 13:19:43,237 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 13:19:43,237 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 13:19:43,238 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:03:56,564 - Server.py - INFO - Запуск сервера +2018-11-02 16:04:00,583 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:04:00,584 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:04:00,584 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:05:53,099 - Server.py - INFO - Запуск сервера +2018-11-02 16:05:56,676 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:05:56,676 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:05:56,676 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:05:56,677 - Server.py - WARNING - Ошибка в параметрах связи работоспособность восстановлена +2018-11-02 16:11:24,200 - Server.py - INFO - Запуск сервера +2018-11-02 16:11:27,587 - Server.py - INFO - Получено сообщение от клиента +2018-11-02 16:11:27,587 - Server.py - INFO - Проверка авторизации, соединение разрешено +2018-11-02 16:11:27,587 - Server.py - INFO - Клиенту передано разрешение на соединение +2018-11-02 16:11:27,587 - Server.py - WARNING - Ошибка в параметрах связи, работоспособность восстановлена diff --git a/Level2_lesson_6/Client.py b/Level2_lesson_6/Client.py new file mode 100644 index 0000000..b9c0ded --- /dev/null +++ b/Level2_lesson_6/Client.py @@ -0,0 +1,63 @@ +# Программа клиента для отправки приветствия серверу и получения ответа +import sys +from socket import * +from datetime import datetime +import json +import logging +from main_logger import log + +#cleint_log = logging.getLogger('messager') # для совместного логгирования +#в общий лог +cleint_log = logging.getLogger('client') +cleint_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(levelname)s - %(""message)s ") +client_file_handl = logging.FileHandler(r".\log\client.log", 'a',encoding='utf-8') +client_file_handl.setFormatter(format) +cleint_log.addHandler(client_file_handl) +#======================================================================= + + +@log +def client(IP_addr, port=777): + cleint_log.info('Запуск клиентской программы') + s = socket(AF_INET, SOCK_STREAM) # Создать сокет TCP + s.connect((IP_addr, int(port))) # соединиться с сервером + + timestamp = str(datetime.now()) + cleint_log.info('Запрос клиента на подключение к серверу и авторизацию') + authen_msg = { + "action": "authenticate", + "time": timestamp, + "user": { + "account_name": "C0deMaverick", + "password": "CorrectHorseBatterStaple" + } + } + json_autent_msg = json.dumps(authen_msg) + s.send(json_autent_msg.encode('utf-8')) + data = s.recv(1000000) + cleint_log.info( + 'Получение ответа сервера с разрешением или запретом подключения') + server_answer = json.loads(data) + + print('Ответ сервера: ', data.decode('utf-8'), ', длиной ', + len(data), 'байт получен') + + if server_answer["response"] == 200: # код ответа сервера == 'OK!' + timestamp = str(datetime.now()) + presence_msg = {"action": "presence", "time": timestamp, + "type": "status", + "user": {"account_name": "CodeMaverick", + "status": "Yep, I am here!"}} + cleint_log.info('Посылка клиентом сервисного сообщения о присутствии') + json_presence_msg = json.dumps(presence_msg) + s.send(json_presence_msg.encode('utf-8')) + else: + pass + + s.close() + cleint_log.info('Клиентская программа закрыта') + + +if __name__ == "__main__": + client('127.0.0.1', 8080) diff --git a/Level2_lesson_6/Server.py b/Level2_lesson_6/Server.py new file mode 100644 index 0000000..e347844 --- /dev/null +++ b/Level2_lesson_6/Server.py @@ -0,0 +1,65 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json +import logging +from main_logger import log + +serv_log = logging.getLogger('server') +serv_log.setLevel(logging.INFO) +format = logging.Formatter("%(asctime)s - %(levelname)s - %(""message)s ") +serv_file_handl = logging.FileHandler(r".\log\server.log", 'a', + encoding='utf-8') +serv_file_handl.setFormatter(format) +serv_log.addHandler(serv_file_handl) +#======================================================================= + +def check_user_authority(user): + if True: + serv_log.info("Проверка авторизации, соединение разрешено") + return True + else: + serv_log.critical("Проверка авторизации, в соединении отказано") + return False + +@log +def server(IP_addr, port=777): + serv_log.info('Запуск сервера') + s = socket(AF_INET, SOCK_STREAM) # Создает сокет TCP + s.bind((IP_addr, int(port))) # Присваивает IP аддрес и порт + s.listen(5) # Переход в режим ожидания запросов; + # одновременно обслуживается не более + # 5 запросов + while True: + print('Before accept()') + client, addr = s.accept() + print('After accept()') + data = client.recv(1000000) + print('Сообщение: ', data.decode('utf-8'), 'длиной: ', len(data), + ' байт, было отправлено клиентом: ', addr) + serv_log.info('Получено сообщение от клиента') + client_query = json.loads(data) + if client_query["action"] == "authenticate": + if check_user_authority(client_query["user"]): + asnswer_msg = {"response": 200, "alert": "Connection allowed"} + json_snswer_msg = json.dumps(asnswer_msg) + serv_log.info("Клиенту передано разрешение на соединение") + else: + pass + + client.send(json_snswer_msg.encode('utf-8')) + + try : + # имитация ошибки в работк сервера + raise ValueError("connection parameters error") + except ValueError: + serv_log.warning("Ошибка в параметрах связи, работоспособность " + "восстановлена") + + client.close() + cleint_log.info('Сервер закрыт') + + +if __name__ == "__main__": + server('127.0.0.1', 8080) + diff --git a/Level2_lesson_6/client.log b/Level2_lesson_6/client.log new file mode 100644 index 0000000..6f80a5f --- /dev/null +++ b/Level2_lesson_6/client.log @@ -0,0 +1,30 @@ +2018-11-06 15:21:49,122 - INFO - Запуск клиентской программы +2018-11-06 15:21:49,122 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:21:49,138 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:21:49,138 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:21:49,138 - INFO - Клиентская программа закрыта +2018-11-06 15:44:56,921 - INFO - Запуск клиентской программы +2018-11-06 15:44:56,921 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:44:56,921 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:44:56,921 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:44:56,921 - INFO - Клиентская программа закрыта +2018-11-06 15:46:11,614 - INFO - Запуск клиентской программы +2018-11-06 15:46:11,614 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:46:11,614 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:46:11,614 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:46:11,614 - INFO - Клиентская программа закрыта +2018-11-06 15:49:25,349 - INFO - Запуск клиентской программы +2018-11-06 15:49:25,349 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:49:25,349 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:49:25,349 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:49:25,349 - INFO - Клиентская программа закрыта +2018-11-06 15:50:18,623 - INFO - Запуск клиентской программы +2018-11-06 15:50:18,623 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:50:18,623 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:50:18,623 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:50:18,623 - INFO - Клиентская программа закрыта +2018-11-06 15:52:40,568 - INFO - Запуск клиентской программы +2018-11-06 15:52:40,568 - INFO - Запрос клиента на подключение к серверу и авторизацию +2018-11-06 15:52:40,568 - INFO - Получение ответа сервера с разрешением или запретом подключения +2018-11-06 15:52:40,568 - INFO - Посылка клиентом сервисного сообщения о присутствии +2018-11-06 15:52:40,568 - INFO - Клиентская программа закрыта diff --git a/Level2_lesson_6/main_logger.log b/Level2_lesson_6/main_logger.log new file mode 100644 index 0000000..37284a9 --- /dev/null +++ b/Level2_lesson_6/main_logger.log @@ -0,0 +1,2 @@ +2018-11-06 15:52:37,741 - INFO - Программа: server запущена с параметрами: ('127.0.0.1', 8080), {} +2018-11-06 15:52:40,568 - INFO - Программа: client запущена с параметрами: ('127.0.0.1', 8080), {} diff --git a/Level2_lesson_6/main_logger.py b/Level2_lesson_6/main_logger.py new file mode 100644 index 0000000..324f5bb --- /dev/null +++ b/Level2_lesson_6/main_logger.py @@ -0,0 +1,24 @@ +# программа сервера для получения приветствия от клиента и отпраки ответа +import sys +from socket import * +import json +import logging +from functools import wraps + +#======================================================================= +def log(func): + @wraps(func) + def wrapper(*args, **kwargs): + print(func.__name__) + main_logger_log = logging.getLogger('main_logger') + main_logger_log.setLevel(logging.INFO) + format = logging.Formatter("%(asctime)s - %(levelname)s - %(""message)s ") + serv_file_handl = logging.FileHandler(r".\log\main_logger.log", 'a', + encoding='utf-8') + serv_file_handl.setFormatter(format) + main_logger_log.addHandler(serv_file_handl) + main_logger_log.info("Программа: "+func.__name__+" запущена с параметрами: " + +str(args)+', '+str(kwargs)) + return func(*args, **kwargs) + return wrapper +#======================================================================= diff --git a/Level2_lesson_6/server.log b/Level2_lesson_6/server.log new file mode 100644 index 0000000..7b3862d --- /dev/null +++ b/Level2_lesson_6/server.log @@ -0,0 +1,30 @@ +2018-11-06 15:21:45,860 - INFO - Запуск сервера +2018-11-06 15:21:49,122 - INFO - Получено сообщение от клиента +2018-11-06 15:21:49,122 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:21:49,122 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:21:49,138 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:44:54,456 - INFO - Запуск сервера +2018-11-06 15:44:56,921 - INFO - Получено сообщение от клиента +2018-11-06 15:44:56,921 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:44:56,921 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:44:56,921 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:46:09,270 - INFO - Запуск сервера +2018-11-06 15:46:11,614 - INFO - Получено сообщение от клиента +2018-11-06 15:46:11,614 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:46:11,614 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:46:11,614 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:49:22,829 - INFO - Запуск сервера +2018-11-06 15:49:25,349 - INFO - Получено сообщение от клиента +2018-11-06 15:49:25,349 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:49:25,349 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:49:25,349 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:50:15,360 - INFO - Запуск сервера +2018-11-06 15:50:18,623 - INFO - Получено сообщение от клиента +2018-11-06 15:50:18,623 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:50:18,623 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:50:18,623 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена +2018-11-06 15:52:37,741 - INFO - Запуск сервера +2018-11-06 15:52:40,568 - INFO - Получено сообщение от клиента +2018-11-06 15:52:40,568 - INFO - Проверка авторизации, соединение разрешено +2018-11-06 15:52:40,568 - INFO - Клиенту передано разрешение на соединение +2018-11-06 15:52:40,568 - WARNING - Ошибка в параметрах связи, работоспособность восстановлена diff --git a/Level2_lesson_7/Strange_name_output.rar b/Level2_lesson_7/Strange_name_output.rar new file mode 100644 index 0000000..2cc26ec Binary files /dev/null and b/Level2_lesson_7/Strange_name_output.rar differ diff --git a/Level2_lesson_7/echo_client_select.py b/Level2_lesson_7/echo_client_select.py new file mode 100644 index 0000000..5044641 --- /dev/null +++ b/Level2_lesson_7/echo_client_select.py @@ -0,0 +1,27 @@ +# Программа клиента, отправляющего/читающего простые текстовые сообщения на сервер + +from socket import * +from select import select +import sys + +localhost = '127.0.0.1' +ADDRESS = (localhost, 10000) + +def echo_client(): + # Начиная с Python 3.2 сокеты имеют протокол менеджера контекста + # При выходе из оператора with сокет будет авторматически закрыт + with socket(AF_INET, SOCK_STREAM) as sock: # Создать сокет TCP + sock.connect(ADDRESS) # Соединиться с сервером + while True: + msg = input('Ваше сообщение: ') + if msg == 'exit': + #послать общее сообщение + msg = "Общее сообщение" + break + sock.send(msg.encode('ascii')) # Отправить! + data = sock.recv(1024).decode('ascii') + print('Ответ:', data) + + +if __name__ == '__main__': + echo_client() \ No newline at end of file diff --git a/Level2_lesson_7/echo_lissten_client_select.py b/Level2_lesson_7/echo_lissten_client_select.py new file mode 100644 index 0000000..71a6572 --- /dev/null +++ b/Level2_lesson_7/echo_lissten_client_select.py @@ -0,0 +1,24 @@ +# Программа клиента, отправляющего/читающего простые текстовые сообщения на сервер + +from socket import * +from select import select +import sys + +localhost = '127.0.0.1' +ADDRESS = (localhost, 10000) + +def echo_listen_client(): + # Начиная с Python 3.2 сокеты имеют протокол менеджера контекста + # При выходе из оператора with сокет будет авторматически закрыт + with socket(AF_INET, SOCK_STREAM) as sock: # Создать сокет TCP + sock.connect(ADDRESS) # Соединиться с сервером + while True: + data = sock.recv(1024).decode('ascii') + print('Ответ:', data) + if data == 'stop': + break + + + +if __name__ == '__main__': + echo_listen_client() \ No newline at end of file diff --git a/Level2_lesson_7/echo_server_select.py b/Level2_lesson_7/echo_server_select.py new file mode 100644 index 0000000..72e45fa --- /dev/null +++ b/Level2_lesson_7/echo_server_select.py @@ -0,0 +1,83 @@ +# -------- Эхо-сервер, обрабатывающий "одновременно" несколько клиентов ------- +# Обработка клиентов осуществляется функцией select + +import select +from socket import socket, AF_INET, SOCK_STREAM + + +localhost = '127.0.0.1' + +def read_requests(r_clients, all_clients): + ''' Чтение запросов из списка клиентов + ''' + responses = {} # Словарь ответов сервера вида {сокет: запрос} + + for sock in r_clients: + try: + data = sock.recv(1024).decode('ascii') + responses[sock] = data + except: + print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername())) + all_clients.remove(sock) + + return responses + + +def write_responses(requests, w_clients, all_clients): + ''' Эхо-ответ сервера клиентам, от которых были запросы + ''' + + for sock in w_clients: + if sock in requests: + try: + # Подготовить и отправить ответ сервера + resp = requests[sock].encode('ascii') + # Эхо-ответ сделаем чуть непохожим на оригинал + test_len = sock.send(resp.upper()) + except: # Сокет недоступен, клиент отключился + print('Клиент {} {} отключился'.format(sock.fileno(), sock.getpeername())) + sock.close() + all_clients.remove(sock) + + +def mainloop(): + ''' Основной цикл обработки запросов клиентов + ''' + address = (localhost, 10000) + clients = [] + + s = socket(AF_INET, SOCK_STREAM) + s.bind(address) + s.listen(5) + s.settimeout(0.2) # Таймаут для операций с сокетом + while True: + try: + conn, addr = s.accept() # Проверка подключений + except OSError as e: + pass # timeout вышел + else: + print("Получен запрос на соединение от %s" % str(addr)) + clients.append(conn) + finally: + # Проверить наличие событий ввода-вывода + wait = 0 + r = [] + w = [] + try: + r, w, e = select.select(clients, clients, [], wait) + except: + pass # Ничего не делать, если какой-то клиент отключился + + requests = read_requests(r, clients) # Сохраним запросы клиентов + + #получение списка подключившихся клиентов + # готовых при этом принять сообщение + # connected_and_ready_accept = [cli for cli in clients if cli in w] + + for cli in connected_and_ready_accept: + write_responses(requests, connected_and_ready_accept, + clients) # Выполним отправку ответов клиентам + + +print('Эхо-сервер запущен!') +mainloop() \ No newline at end of file diff --git a/Level2_lesson_8/thread_client_serv2.py b/Level2_lesson_8/thread_client_serv2.py new file mode 100644 index 0000000..92572ab --- /dev/null +++ b/Level2_lesson_8/thread_client_serv2.py @@ -0,0 +1,158 @@ +# ======================= Потоки и многозадачность ============================ +# ---------------- Обзор возможностей модуля threading ------------------ + +# Сервер и клиент обрабатывающие соединения в потоках + + +import socket +import time +from threading import Thread +import sys + +class SockHandler(): + ''' Базовый класс для работы с сокетом + ''' + def __init__(self, sock): + self.sock = sock + self.is_alive = False + + def __call__(self): + ''' Класс-наследник должен выставить флаг is_alive = True ''' + raise NotImplemented + + def stop(self): + self.is_alive = False + + +class TimeServer(SockHandler): + ''' Класс для отправки времени через заданные интервалы + ''' + def __init__(self, sock, timeout): + super().__init__(sock) + self.timeout = timeout + + def __call__(self): + self.is_alive = True + ''' + while True: + if not self.is_alive: + break + time.sleep(self.timeout) + ''' + data = str(time.ctime()) + self.sock.send(data.encode('utf-8')) + + +class ConsoleHandler(SockHandler): + ''' Обработчик ввода из консоли + ''' + def __call__(self): + while True: + data = self.sock.recv(1024).decode('utf-8') + if data: + msg = '\n' + data + ' >> ' + data = input(msg) + if data == 'exit': + break + else: + data = input(msg) + self.sock.sendall(data.encode('utf-8')) + + +class Receiver(SockHandler): + ''' Класс-получатель информации из сокета + ''' + def __call__(self): + print('\n') + self.is_alive = True + while True: + if not self.is_alive: + break + data = self.sock.recv(1024).decode('utf-8') + data = '\n' + data.upper() + self.sock.send(data.encode('utf-8')) + if data: + msg = '\n >> ' + data + print(msg) + pass + else: + break + + +class Server: + ''' Класс сервера. + Слушает сеть. Периодически отправляет клиенту текущее время. + ''' + def __init__(self, ip, port): + self.ip = ip + self.port = port + + def start_serve(self): + self.serv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.serv_sock.bind((self.ip, self.port)) + self.serv_sock.listen(1) + print('wainting for client...') + client, addr = self.serv_sock.accept() + + print('client has come :)') + listener = Receiver(client) + th_listen = Thread(target=listener) + th_listen.daemon = True + + sender = TimeServer(client, 5) + th_sender = Thread(target=sender) + th_sender.daemon = True + + th_listen.start() + th_sender.start() + + while True: + if not th_listen.is_alive: + break + if not th_sender.is_alive: + break + + self.serv_sock.close() + + +class Client: + ''' Класс клиента. Подключается к серверу, отправляет данные из консоли + ''' + def __init__(self, ip, port): + self.ip = ip + self.port = port + + def start_session(self): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect((self.ip, self.port)) + + listener = Receiver(self.sock) + th_listen = Thread(target=listener) + th_listen.daemon = True + + sender = ConsoleHandler(self.sock) + th_sender = Thread(target=sender) + th_sender.daemon = True + + th_listen.start() + th_sender.start() + + while True: + if not th_listen.is_alive: + break + if not th_sender.is_alive: + break + + self.sock.close() + + +if __name__ == '__main__': + import sys + if sys.argv[1] == 'c': + client = Client('localhost', 7777) + client.start_session() + elif sys.argv[1] == 's': + server = Server('localhost', 7777) + server.start_serve() + else: + print('wrong option') \ No newline at end of file diff --git a/ReadMe.txt b/ReadMe.txt new file mode 100644 index 0000000..831f00f --- /dev/null +++ b/ReadMe.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/SRHw03_easy.py b/SRHw03_easy.py new file mode 100644 index 0000000..2d23d07 --- /dev/null +++ b/SRHw03_easy.py @@ -0,0 +1,50 @@ +# Задание-1: +# Напишите функцию, округляющую полученное произвольное десятичное число +# до кол-ва знаков (кол-во знаков передается вторым аргументом). +# Округление должно происходить по математическим правилам (0.6 --> 1, 0.4 --> 0). +# Для решения задачи не используйте встроенные функции и функции из модуля math. + +#def my_round(number, ndigits): + # pass +#===================================================== + def my_round(number, ndigits): + numb1 = number * (10**ndigits) + int_part = numb1//1 + rational_part = numb1 - int_part + if (rational_part >= 0.5): + int_part +=1 + result = int_part/(10**ndigits) + return result + + +print(my_round(2.1234567, 5)) +print(my_round(2.1999967, 5)) +print(my_round(2.9999967, 5)) + +#===================================================== + +# Задание-2: +# Дан шестизначный номер билета. Определить, является ли билет счастливым. +# Решение реализовать в виде функции. +# Билет считается счастливым, если сумма его первых и последних цифр равны. +# !!!P.S.: функция не должна НИЧЕГО print'ить +# +#===================================================== + +def lucky_ticket(ticket_number): + + def sum_digits(digits_str): + sum1 = 0 + for i in range(len(digits_str)): + sum1 += int(digits_str[i]) + return sum1 + + if len(ticket_number)%2: + print ("Ошибка: чтобы проверить счастливый это номер билета или нет,он должен иметь четное количество цифр") + return False + numb_str = '%6s' % ticket_number + return sum_digits(numb_str[0:4]) == sum_digits(numb_str[3:]) + +print(lucky_ticket(123006)) +print(lucky_ticket(12321)) +print(lucky_ticket(436751)) \ No newline at end of file diff --git a/SRHw03_hard.py b/SRHw03_hard.py new file mode 100644 index 0000000..8629224 --- /dev/null +++ b/SRHw03_hard.py @@ -0,0 +1,111 @@ +# Задание-1: +# Написать программу, выполняющую операции (сложение и вычитание) с простыми дробями. +# Дроби вводятся и выводятся в формате: +# n x/y ,где n - целая часть, x - числитель, у - знаменатель. +# Дроби могут быть отрицательные и не иметь целой части, или иметь только целую часть. +# Примеры: +# Ввод: 5/6 + 4/7 (всё выражение вводится целиком в виде строки) +# Вывод: 1 17/42 (результат обязательно упростить и выделить целую часть) +# Ввод: -2/3 - -2 +# Вывод: 1 1/3 + +# Конечно, хорошо бы воспользовать регулятные выражения, но я пока, увы, слаб... +$и до упрощения тоже не добрался +""" +print("введите строку выражения с простыми дробями: дробь +(или)- дробь") +expression = input("дроби в формате n x/y ,где n - целая часть(не обязательная), x - числитель, у - знаменатель: ") +""" +expression = '2 5/6 + 3 4/7' + +def analyse_fraction(fraction_str): + whole = 0 # предполагаем, сто целой части нет + if (' ' in fraction_str): + #дробь имеет целую часть + whole =int(fraction_str.split(' ')[0]) + rational_part = fraction_str.split(' ')[1] + else: + rational_part = fraction_str + if ('/' in rational_part): + fr1 = rational_part.split('/') + divident = int(fr1[0]) + divisor = int(fr1[1]) + else: + whole = int(rational_part) + divident = 1 + divisor = 1 + return (whole, divident, divisor) + +splitted_expression = expression.split(' ') +if not ('/' in splitted_expression[0]): + #splitted_expression[0] - это целая часть дроби + fraction1 = splitted_expression[0]+' '+ splitted_expression[1] + sign_of_operation = splitted_expression[2] +else: + fraction1 = splitted_expression[0] + sign_of_operation = splitted_expression[1] +if (not('/' in splitted_expression[-2])) and (splitted_expression[-2]!='+'and (splitted_expression[-2]!= '-')): + #splitted_expression[-2] - это возможно целая часть второй дроби + fraction2 = splitted_expression[-2] +' '+ splitted_expression[-1] +else: + fraction2 = splitted_expression[-1] +fraction1_parts = analyse_fraction(fraction1) +#print(fraction1_parts) +fraction2_parts = analyse_fraction(fraction2) +#print(fraction2_parts) +if (sign_of_operation == '+') or (sign_of_operation == '-'): + operand1 = (fraction1_parts[1]*fraction2_parts[2]) + operand2 = (fraction2_parts[1]*fraction1_parts[2]) + if (sign_of_operation == '+'): + work_result_divident = operand1 + operand2 + else: + work_result_divident = operand1 - operand2 + result_divisor = fraction2_parts[2]*fraction1_parts[2] + whole_result = fraction1_parts[0] + fraction2_parts[0] + (work_result_divident//result_divisor) + result_divident = (work_result_divident % result_divisor) + print (expression, " = ", whole_result, result_divident,"/", result_divisor) + +#=================================================== + +# Задание-2: +# Дана ведомость расчета заработной платы (файл "data/workers"). +# Рассчитайте зарплату всех работников, зная что они получат полный оклад, +# если отработают норму часов. Если же они отработали меньше нормы, +# то их ЗП уменьшается пропорционально, а за заждый час переработки +# они получают удвоенную ЗП, пропорциональную норме. +# Кол-во часов, которые были отработаны, указаны в файле "data/hours_of" + + +# Задание-3: +# Дан файл ("data/fruits") со списком фруктов. +# Записать в новые файлы все фрукты, начинающиеся с определенной буквы. +# Т.е. в одном файле будут все фрукты на букву “А”, во втором на “Б” и т.д. +# Файлы назвать соответственно. +# Пример имен файлов: fruits_А, fruits_Б, fruits_В …. +# Важно! Обратите внимание, что нет фруктов, начинающихся с некоторых букв. +# Напишите универсальный код, который будет работать с любым списком фруктов +# и распределять по файлам в зависимости от первых букв, имеющихся в списке фруктов. +# Подсказка: +# Чтобы получить список больших букв русского алфавита: +# print(list(map(chr, range(ord('А'), ord('Я')+1)))) + +#=================================================== + +fruits=[] +for line in open(r'.\data\fruits.txt', 'r'): + fruits.append(line) + fruits.sort() +files_names = {} +for fruit in (fruits): + files_names[fruit[0]] = [('open_'+fruit[0]), False, fruit[0]] +for fruit in (fruits): + if not files_names[fruit[0]][1]: + #Значение False, т.е. файл для буквы "А" еще не открыт, открыть! + files_names[fruit[0]][0] = open(r'.\data\file_'+files_names[fruit[0]][2]+'.txt', 'w') + files_names[fruit[0]][1] = True + files_names[fruit[0]][0].write(fruit) + else: + files_names[fruit[0]][0].write(fruit) + +for key in files_names: + files_names[key][0].flush() + files_names[key][0].close() \ No newline at end of file diff --git a/SRHw03_normal.py b/SRHw03_normal.py new file mode 100644 index 0000000..19c6624 --- /dev/null +++ b/SRHw03_normal.py @@ -0,0 +1,74 @@ +# Задание-1: +# Напишите функцию, возвращающую ряд Фибоначчи с n-элемента до m-элемента. +# Первыми элементами ряда считать цифры 1 1 + +#===================================================== + +def fibonacci(n, m): + fibonacci_serie = [] + def fib(n): + if n<2: + return n + curr = fib(n-1) + fib(n-2) + return curr + for i in range(n, m): + fibonacci_serie.append(fib(i)) + return fibonacci_serie + +#===================================================== + +# Задача-2: +# Напишите функцию, сортирующую принимаемый список по возрастанию. +# Для сортировки используйте любой алгоритм (например пузырьковый). +# Для решения данной задачи нельзя использовать встроенную функцию и метод sort() + +#===================================================== + +def sort_to_max(origin_list): + new_list = origin_list[:] + for i in range(1,(len(new_list)-1)): + for j in range((len(new_list)-i)): + if int(new_list[j]) > int(new_list[j+1]): + (new_list[j]), (new_list[j+1]) = (new_list[j+1]), (new_list[j]) + return new_list + +sort_to_max([2, 10, -12, 2.5, 20, -11, 4, 4, 0]) +#===================================================== + +# Задача-3: +# Напишите собственную реализацию стандартной функции filter. +# Разумеется, внутри нельзя использовать саму функцию filter. + +#===================================================== + +def my_filter(function, iterable): + new_list =[] + for i in range(len(iterable)-1): + if function(iterable[i]): + new_list.append(iterable[i]) + return new_list + +#print(my_filter((lambda x: (x > 0)), [2, 10, -12, 2.5, 20, -11, 4, 4, 0])) + +#===================================================== + +# Задача-4: +# Даны четыре точки А1(х1, у1), А2(x2 ,у2), А3(x3 , у3), А4(х4, у4). +# Определить, будут ли они вершинами параллелограмма. + +""" +print("Введите, координаты 4х точек") +a1_x,a1_y = input("Введите координату 1й точки через ',': x,y : ") +a2_x,a2_y = input("Введите координату 1й точки через ',': x,y : ") +a3_x,a3_y = input("Введите координату 1й точки через ',': x,y : ") +a4_x,a4_y = input("Введите координату 1й точки через ',': x,y : ") +""" +a1_x,a1_y = 2,4 +a2_x,a2_y = 2,4 +a3_x,a3_y = 6,3 +a4_x,a4_y = 6,3 +#параллелограмм - это четырехугольник противоположные стороны которого попарно равны +if (abs(a1_x - a4_x) == abs(a2_x - a3_x)) and (abs(a1_y - a4_y) == abs(a2_y - a3_y)): + print ("данные точки являются вершинами параллелограмма") +else: + print ("данные точки не являются вершинами параллелограмма") diff --git a/SRhw02_easy.py b/SRhw02_easy.py new file mode 100644 index 0000000..5826f4e --- /dev/null +++ b/SRhw02_easy.py @@ -0,0 +1,65 @@ + +# -1: +# . +# , , +# . + +# : +# : ["", "", "", ""] +# : +# 1. +# 2. +# 3. +# 4. + +# : .format() + +#========================================================= + +fruits = ["", "", "", ""] +n_fruits = len(fruits) +i=0 +while i < n_fruits: + print ('%d %s' % ((i+1), fruits[i])) + i +=1 + +#========================================================= + +# -2: +# . +# , . + +#========================================================= + +list1 =[1, 2, 4, 5, 6, 2, 5, 2, 10, 25, 3, 8, 7] +list2 =[1, 2, 4, 5, 6, 2, 5, 2] +l1 = set(list1) +l2 = set(list2) +list1a = list(l1 - l2) +print(" =", list1) +print(" =", list2) +print(" , : ", list1a) + +#========================================================= + + +# -3: +# . +# , : +# , 4, , . +#========================================================= + +l =[1, 2, 4, 5, 6, 2, 5, 2, 10, 25, 3, 8, 7] +l2 = [] +i = 0 +while i < len(l): + a = int(l[i]) + if (a%2): + l2.append(a*2) + else: + l2.append(a/4) + i+=1 +print (" :", l) +print(":", l2) + +#========================================================= diff --git a/SRhw02_hard.py b/SRhw02_hard.py new file mode 100644 index 0000000..126d946 --- /dev/null +++ b/SRhw02_hard.py @@ -0,0 +1,78 @@ +# Задание-1: уравнение прямой вида y = kx + b задано в виде строки. +# Определить координату y точки с заданной координатой x. + +equation = 'y = -12x + 11111140.2121' +x = 2.5 +# вычислите и выведите y + +#Результатом вычисления по любому будет: y=11111140.212 10^1 первого слагаемого и 10^6 второго +#но, если как в армии:: "выполнить и доложить", то: +a = 'y = -12x + 11111140.2121' +c=a.split('x') +a1 = float(c[0].split('= ')[1]) +b = float(c[1].split('+ ')[1]) +x = 2.5 +y = a1*x + b +print (y) +#======================================================================= + +# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'. +# Проверить, корректно ли введена дата. +# Условия корректности: +# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31) +# (в зависимости от месяца, февраль не учитываем) +# 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12 +# 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999 +# 4. Длина исходной строки для частей должна быть в соответствии с форматом +# (т.е. 2 символа для дня, 2 - для месяца, 4 - для года) + +# Пример корректной даты +date = '01.11.1985' + +# Примеры некорректных дат +date = '01.22.1001' +date = '1.12.1001' +date = '-2.10.3001' + +#======================================================================= +# Задачу не понял, не ясно по какому правилу приводить месяц в диапазон от1 до 12 +#перевести остаок в годы и добавить к числу лет? А куда переводит год 3001, +#он уже в целый и в доложном дипазоне?... +#======================================================================= + + +# Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня) +# +# Вавилонцы решили построить удивительную башню — +# расширяющуюся к верху и содержащую бесконечное число этажей и комнат. +# Она устроена следующим образом — на первом этаже одна комната, +# затем идет два этажа, на каждом из которых по две комнаты, +# затем идёт три этажа, на каждом из которых по три комнаты и так далее: +# ... +# 12 13 14 +# 9 10 11 +# 6 7 8 +# 4 5 +# 2 3 +# 1 +# +# Эту башню решили оборудовать лифтом --- и вот задача: +# нужно научиться по номеру комнаты определять, +# на каком этаже она находится и какая она по счету слева на этом этаже. +# +# Входные данные: В первой строчке задан номер комнаты N, 1 ≤ N ≤ 2 000 000 000. +# +# Выходные данные: Два целых числа — номер этажа и порядковый номер слева на этаже. +# +# Пример: +# Вход: 13 +# Выход: 6 2 +# +# Вход: 11 +# Выход: 5 3 + +#======================================================================= +#К сожалению решить не успеваю, ;о( +#Пока сдаю все, что успел решить, +#может успею позде, если задача не будет разбираться на уроке +#======================================================================= diff --git a/SRhw02_normal.py b/SRhw02_normal.py new file mode 100644 index 0000000..ff2dc5d --- /dev/null +++ b/SRhw02_normal.py @@ -0,0 +1,131 @@ + +# -1: +# , , , +# , +# +# +# : : [2, -5, 8, 9, -25, 25, 4] : [3, 5, 2] + +#========================================== + +import math +l =[1, 2, 4, -5, -6, 2, 8, 9, 10, 25, 3, 8, 7] +l2 = [] +i = 0 +while i < len(l): + if l[i]>0: + a = math.sqrt(l[i]) + b = '%3.3f' %a + c = b.split('.') + decimal_part = int(c[1]) + if (decimal_part == 0): + l2.append(int(c[0])) + i+=1 +print (" :", l) +print(":", l2) + +#========================================== + +# -2: dd.mm.yyyy, : 02.11.2013. +# , : 2013 . +# (2000 , 2010 ) + +datas_names = { +1: "", +2: "", +3: "", +4: "", +5: "", +6: "", +7: "", +8: "", +9: "", +10: "", +11: "", +12: "", +13: "", +14: "", +15: "", +16: "", +17: "", +18: "", +19: "", +20: "", +30: "", +} + +month_names = { +1: "", +2: "", +3: "", +4: "", +5: "", +6: "", +7: "", +8: "", +9: "", +10: "", +11: "", +12: "", +} + +data = "02.11.2013" +data2 = data.split('.') +day = int(data2[0]) +month = int(data2[1]) +if (day<20): + day_text = datas_names[day] +elif ( 20 <= day < 32 ): + day2 = (int(day/10))*10 + day3 = int(day%10) + if (day3 == 0): + day_text = datas_names[day2][:-1] +"" + else: + day_text = datas_names[day2] +" "+ datas_names[day3] +full_data = day_text +" "+ month_names[month] +" "+ data2[2] +" " +print (" dd.mm.yyyy:", data) +print (" :", full_data) + +#========================================== + +# -3: , +# -100 100. n - . +# : +# randint() random + +#========================================== + +import random +a = [] +n = 10 +for i in range( n ): + a.append(random.randint(-100,100)) +print (a) +#========================================== + +# -4: , . +# , : +# ) : +# , 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 = [] +for elem in lst: + if (not (elem in lst2)): + lst2.append(elem) +print (lst2) +#=)======================================== +lst = [1, 2, 4, 5, 6, 2, 5, 2] +l = [] +lst2 =[] +for i in range (0, len(lst)-1): + l.append([lst[i], lst.count(lst[i])]) +for i in range (0, len(l)-1): + if (l[i][1]==1): + lst2.append(l[i][0]) +print (lst2) +#========================================== +