Skip to content

Commit 248b033

Browse files
author
pavel.vyukov
committed
L6 WEB + L5 teacher's HW
1 parent c5d529e commit 248b033

8 files changed

+229
-1
lines changed

L5_collection_list_etc/L5_HW/less_5_task_2.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ def decimal_2_hex(decimal_list):
5757
else:
5858
in_memory = 0
5959
sum_num.append(my_sum % 16)
60-
60+
if in_memory > 0:
61+
sum_num.append(in_memory)
6162
# меняем порядок элементов и приводим каждый элемент массива к hex строке
6263
sum_num.reverse()
6364
sum_num = decimal_2_hex(sum_num)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# Пользователь вводит данные о количестве предприятий,
2+
# их наименования и прибыль за квартал для каждого.
3+
# Программа должна определить среднюю прибыль и
4+
# вывести наименования предприятий, чья прибыль выше среднего.
5+
# Отдельно вывести наименования предприятий, чья прибыль ниже среднего.
6+
7+
from collections import namedtuple, deque
8+
9+
QUARTERS = 4
10+
Company = namedtuple('Company', ['name', 'quarters', 'profit'])
11+
all_companies = set()
12+
13+
num = int(input("Введите количество предприятий: "))
14+
total_profit = 0
15+
for i in range(1, num + 1):
16+
profit = 0
17+
quarters = []
18+
name = input(f'Введите название предприятия {i}: ')
19+
20+
for j in range(QUARTERS):
21+
quarters.append(int(input(f'Прибыль за {j + 1}-й квартал: ')))
22+
profit += quarters[j]
23+
24+
comp = Company(name=name, quarters=tuple(quarters), profit=profit)
25+
26+
all_companies.add(comp)
27+
total_profit += profit
28+
29+
average = total_profit / num
30+
31+
print(f'\nСредняя прибыль = {average}')
32+
33+
# вариант 1
34+
print(f'\nПредприятя с прибылью выше среднего:')
35+
for comp in all_companies:
36+
if comp.profit > average:
37+
print(f'Компания {comp.name} заработала {comp.profit}')
38+
# print(comp.quarters[0]) # так можно получить доступ к нужной четверти.
39+
40+
print(f'\nПредприятя с прибылью ниже среднего:')
41+
for comp in all_companies:
42+
if comp.profit < average:
43+
print(f'Компания {comp.name} заработала {comp.profit}')
44+
45+
46+
# вывод результат с использованием очереди - вариант 2
47+
print('*' * 50)
48+
sort_comp = deque([None])
49+
for comp in all_companies:
50+
if comp.profit > average:
51+
sort_comp.append(comp)
52+
elif comp.profit < average:
53+
sort_comp.appendleft(comp)
54+
55+
text = 'меньше'
56+
for comp in sort_comp:
57+
if comp is None:
58+
text = 'больше'
59+
else:
60+
print(f'Компания {comp.name} заработала {text}, чем средняя прибыль - {comp.profit}')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# цикл вместо дублирования 4 строчек кода
2+
from collections import namedtuple
3+
4+
all_comp = []
5+
Comp = namedtuple('Comp', 'name, p1, p2, p3, p4, total')
6+
num = int(input('num = '))
7+
for i in range(num):
8+
name = input('name = ')
9+
spam = []
10+
# p1 = input()
11+
# p2 = input()
12+
# p3 = input()
13+
# p4 = input()
14+
for j in range(1, 5):
15+
spam.append(int(input(f'{j} = ')))
16+
all_comp.append(Comp(name, *spam, sum(spam)))
17+
18+
print(all_comp)
19+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# 2. Написать программу сложения и умножения двух шестнадцатеричных чисел. При этом каждое число представляется
2+
# как массив, элементы которого это цифры числа. Например, пользователь ввёл A2 и C4F. Сохранить их как [‘A’, ‘2’]
3+
# и [‘C’, ‘4’, ‘F’] соответственно. Сумма чисел из примера: [‘C’, ‘F’, ‘1’], произведение - [‘7’, ‘C’, ‘9’, ‘F’, ‘E’].
4+
5+
from collections import deque
6+
7+
BASE = 16
8+
9+
HEX_NUMBERS = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
10+
'A', 'B', 'C', 'D', 'E', 'F')
11+
12+
BIN_NUMBERS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5,
13+
'6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11,
14+
'C': 12, 'D': 13, 'E': 14, 'F': 15}
15+
16+
17+
def sum_hex(first, second):
18+
"""
19+
Изменяемые объекты передаются по ссылке
20+
Используем копию, чтобы не ломать оригинал
21+
"""
22+
first = first.copy()
23+
second = second.copy()
24+
25+
if len(second) > len(first):
26+
first, second = second, first
27+
28+
second.extendleft('0' * (len(first) - len(second)))
29+
30+
result = deque()
31+
overflow = 0
32+
while len(first) != 0:
33+
first_num = BIN_NUMBERS[first.pop()]
34+
second_num = BIN_NUMBERS[second.pop()]
35+
36+
result_num = first_num + second_num + overflow
37+
38+
if result_num >= BASE:
39+
overflow = 1
40+
result_num -= BASE
41+
else:
42+
overflow = 0
43+
44+
result.appendleft(HEX_NUMBERS[result_num])
45+
46+
if overflow == 1:
47+
result.appendleft('1')
48+
49+
return result
50+
51+
52+
def mult_hex(first, second):
53+
first = first.copy()
54+
second = second.copy()
55+
56+
if len(second) > len(first):
57+
first, second = second, first
58+
59+
second.extendleft('0' * (len(first) - len(second)))
60+
result = deque('0')
61+
62+
while len(second) != 0:
63+
second_num = BIN_NUMBERS[second.pop()]
64+
65+
spam = deque('0')
66+
for _ in range(second_num):
67+
spam = sum_hex(spam, first)
68+
69+
spam.extend('0' * (len(first) - len(second) - 1))
70+
result = sum_hex(result, spam)
71+
72+
return result
73+
74+
75+
a = deque(input('Введите первое число в hex формате (только цифры от 0 до f): ').upper())
76+
b = deque(input('Введите второе число в hex формате (только цифры от 0 до f): ').upper())
77+
78+
# z = hex(int('a2', 16) + int('c4f', 16)) - плохой подход на два балла
79+
print(f'{list(a)} + {list(b)} = {list(sum_hex(a, b))}')
80+
print(f'{a} * {b} = {mult_hex(a, b)}') # специально убрал список, чтобы показать как хранится

L6_dynamic_memory/L6_WEB/task_1.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
my_list = [1]
2+
my_list.extend([2, 3, 4])
3+
my_list.insert(1, 5)
4+
spam = my_list.pop()
5+
eggs = my_list.pop()
6+
my_list.remove(5)
7+
8+
allocated = 0
9+
for new_size in range(1000):
10+
if allocated < new_size:
11+
new_allocated = (new_size >> 3) + (3 if new_size < 9 else 6)
12+
allocated = new_size + new_allocated
13+
print(f'{new_size}\t{allocated}')

L6_dynamic_memory/L6_WEB/task_2.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import sys
2+
3+
a = 42.0
4+
b = a
5+
c = a
6+
print(sys.getrefcount(a))
7+
8+
print(sys.getrefcount('eegrwegerg'))
9+
10+
print(sys.getsizeof(a))
11+
12+
def show(x):
13+
print(f'type={type(x)}, size={sys.getsizeof(x)}, obj={x}')
14+
if hasattr(x, '__iter__'):
15+
if hasattr(x, 'items'):
16+
for key, value in x.items():
17+
show(key)
18+
show(value)
19+
elif not isinstance(x, str):
20+
for item in x:
21+
show(item)
22+
23+
24+
show(a)
25+
26+
d = [i for i in range(10)]
27+
show(d)
28+
e = tuple(d)
29+
show(e)
30+
f = {str(i): i for i in range(10)}
31+
show(f)
32+
g = set(d)
33+
show(g)
34+

L6_dynamic_memory/L6_WEB/task_3.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import sys
2+
import ctypes
3+
import struct
4+
5+
a = 42
6+
b = a
7+
8+
print(id(a))
9+
print(sys.getsizeof(a))
10+
print(ctypes.string_at(id(a), sys.getsizeof(a)))
11+
print(struct.unpack('HHLHHh', ctypes.string_at(id(a), sys.getsizeof(a))))
12+
print(id(int))
13+
14+
15+
a = 'Hello'
16+
17+
print(id(a))
18+
print(sys.getsizeof(a))
19+
print(ctypes.string_at(id(a), sys.getsizeof(a)))
20+
print(struct.unpack('HHLHHHHHHHh' + 'c' * 6, ctypes.string_at(id(a), sys.getsizeof(a))))
21+
print(id(str))

0 commit comments

Comments
 (0)