Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions Урок 5. Практическое задание/task_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,131 @@

Предприятия, с прибылью ниже среднего значения: Копыта
"""
from collections import namedtuple
from operator import itemgetter, attrgetter
from statistics import mean

Corp = namedtuple('Corporation', 'name qr total')

num_corp = int(input('Введите количество предприятий для расчета прибыли: '))

data = []
for _ in range(num_corp):
corp_name = input('Введите название предприятия: ')
rev_inp = input(
'Через пробел введите прибыль'
+ 'данного предприятия за каждый квартал\n'
+ '(Всего 4 квартала): ')

qr = [float(f) for f in rev_inp.split(' ')]
data.append(Corp(corp_name, qr, sum(qr)))

aver = mean(c.total for c in data)

data.sort(key=attrgetter('total'))
print(f'Средняя годовая прибыль всех предприятий: {aver:.2f}')
print(
'Предприятия, с прибылью выше среднего значения:',
' '.join(c.name for c in data if c.total >= aver))
print(
'Предприятия, с прибылью ниже среднего значения:',
' '.join(c.name for c in data if c.total < aver))

# ---
# Введите количество предприятий для расчета прибыли: 2
# Введите название предприятия: Рога
# Через пробел введите прибыль данного предприятия за каждый квартал
# (Всего 4 квартала): 235 345634 55 235
# Введите название предприятия: Копыта
# Через пробел введите прибыль данного предприятия за каждый квартал
# (Всего 4 квартала): 345 34 543 34
# Средняя годовая прибыль всех предприятий: 173557.50
# Предприятия, с прибылью выше среднего значения: Рога
# Предприятия, с прибылью ниже среднего значения: Копыта
# ---

# вариант, когда данные лежат в csv-файле
csvtext = """\
Company,Q1,Q2,Q3,Q4
SAUDI ARABIAN OIL COMPANY,62.47,25.37,44.2,51.75
APPLE,11.25,11.25,12.67,28.75
MICROSOFT CORPORATION,10.75,11.2,13.89,15.46
ALPHABET,6.84,6.96,11.24,15.23
AMAZON.COM,2.54,5.24,6.33,13.18
FACEBOOK,4.9,5.18,7.84,11.22
ALIBABA GROUP HOLDING,3.16,46.43,26.52,79.43
BERKSHIRE HATHAWAY,29.16,-49.75,26.29,30.41
TENCENT,20.38,21.58,28.89,30.15
J P MORGAN CHASE & CO,2.85,4.68,9.44,12.1"""

data = sorted(
(
(n, sum(map(float, d)))
for n, *d in (
row.split(',')
for i, row in enumerate(csvtext.split('\n'))
if i > 0)),
key=itemgetter(1), reverse=True)
aver = mean(map(itemgetter(1), data))

print(f'Среднее значение годовой прибыли: {aver:.2f} млрд. USD')
print()
print('Компании, заработавшие больше среднего:')
print('\n'.join(f'{n}: {v:.2f}' for n, v in data if v >= aver))
print()
print('Компании, заработавшие меньше среднего:')
print('\n'.join(f'{n}: {v:.2f}' for n, v in data if v < aver))
print()
# ---
# Среднее значение годовой прибыли: 71.74 млрд. USD
#
# Компании, заработавшие больше среднего:
# SAUDI ARABIAN OIL COMPANY: 183.79
# ALIBABA GROUP HOLDING: 155.54
# TENCENT: 101.00
#
# Компании, заработавшие меньше среднего:
# APPLE: 63.92
# MICROSOFT CORPORATION: 51.30
# ALPHABET: 40.27
# BERKSHIRE HATHAWAY: 36.11
# FACEBOOK: 29.14
# J P MORGAN CHASE & CO: 29.07
# AMAZON.COM: 27.29
# ---

# Это решение задачи на pandas
import pandas
from io import StringIO
qr = pandas.read_csv(StringIO(csvtext))
qr['Y2020'] = qr[['Q1', 'Q2', 'Q3', 'Q4']].sum(axis=1)
qr.sort_values('Y2020', ascending=False, inplace=True)
aver = qr['Y2020'].mean()

print(f'Среднее значение годовой прибыли: {aver:.2f} млрд. USD')
print()
print('Компании, заработавшие больше среднего:')
print(qr[qr.Y2020 >= aver][['Company', 'Y2020']].to_string(index=False))
print()
print('Компании, заработавшие меньше среднего:')
print(qr[qr.Y2020 < aver][['Company', 'Y2020']].to_string(index=False))
print()
# ---
# Среднее значение годовой прибыли: 71.74 млрд. USD
#
# Компании, заработавшие больше среднего:
# Company Y2020
# SAUDI ARABIAN OIL COMPANY 183.79
# ALIBABA GROUP HOLDING 155.54
# TENCENT 101.00
#
# Компании, заработавшие меньше среднего:
# Company Y2020
# APPLE 63.92
# MICROSOFT CORPORATION 51.30
# ALPHABET 40.27
# BERKSHIRE HATHAWAY 36.11
# FACEBOOK 29.14
# J P MORGAN CHASE & CO 29.07
# AMAZON.COM 27.29
# ---
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

выполнено
применили коллекции. как и требовалось

168 changes: 168 additions & 0 deletions Урок 5. Практическое задание/task_2.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,171 @@
Также попробуйте решить задачу вообще без collections и применить только ваши знания по ООП
(в частности по перегрузке методов)
"""

from collections import deque

HEXES = list('0123456789ABCDEF')
INTS = {
'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}


# я знаю про int(x, 16), но в изобретении велосипеда
# надо быть последовательным
def hex2int(hex):
return sum(16**i * INTS[d] for i, d in enumerate(reversed(hex)))


def int2hex(hex, base=16):
# хотя можно было обойтись reversed(list)
ret = deque()
while True:
if hex == 0:
break
ret.appendleft(HEXES[hex % base])
hex //= base
return list(ret)


class Hex:
def __init__(self, arg):
if isinstance(arg, int):
self.digits = int2hex(arg)
elif isinstance(arg, str):
self.digits = list(arg.upper())
elif isinstance(arg, list):
self.digits = [d.upper() for d in arg]
else:
raise ValueError("Invalid initialization type")

def __repr__(self):
return f'Hex({repr(self.digits)})'

def __str__(self):
return ''.join(self.digits)

def __int__(self):
return hex2int(self.digits)

def __add__(self, other):
return Hex(int(self) + int(other))

def __mul__(self, other):
return Hex(int(self) * int(other))


h1 = Hex('A2')
h2 = Hex('C4F')
print(h1 + h2)
print(h1 * h2)
# ---
# CF1
# 7C9FE
# ---

# Если выше была просто необязательная часть, то дальше уже
# полная отсебятина. Теперь калькулятор разбирает целую строчку.
# Создание мини-языка по моему мнению является одним из
# полезнейших упражнений для освоения алгоритмов и
# структур данных. Если бы в geekbrains практиковались
# курсовые работы, я выбрал бы эту тему.

# Пример работы:
# > 7+7
# 7 + 7 = E
# > 7*7
# 7 * 7 = 31
# > dead + beef
# DEAD + BEEF = 19D9C


class HexParser:
def __init__(self):
self.digits = []
self.hex = None

def __bool__(self):
return bool(self.digits)

def __str__(self):
return str(self.digits)

def accept(self, c):
if c in INTS:
self.digits.append(c)
return True
else:
if bool(self):
self.hex = Hex(self.digits)
return False


OPS = {
'+': lambda x, y: x + y,
'*': lambda x, y: x * y
}


class OpParser:
def __init__(self):
self.sym = None
self.op = None

def __bool__(self):
return self.sym is not None

def __str__(self):
return str(self.sym)

def accept(self, c):
if (self.sym is None) and (c in OPS):
self.sym = c
self.op = OPS[c]
return True
return False


def parse(stream, parsers):
for p in parsers:
while True:
try:
c = stream.popleft()
if not p.accept(c):
stream.appendleft(c)
break
except IndexError:
p.accept('')
break


class Calc:
def __init__(self):
print('Type "exit" to quit')

def loop(self, inp):
if inp == 'exit':
return False
# Это грамматика языка, пока лишь последовательность элементов
grammar = [HexParser(), OpParser(), HexParser()]
# В настоящем языке должны быть две очереди:
# символы -> токены -> AST
# Здесь же только одна очередь
stream = deque(inp.replace(' ', '').upper())
parse(stream, grammar)
h1, op, h2 = grammar
if all(grammar):
# Здесь должна быть обработка AST, но у меня пока
# только обработка последовательности
print(
f'{h1.hex} {op.sym} {h2.hex} = '
+ str(Hex(op.op(int(h1.hex), int(h2.hex)))))
else:
print("Ошибка в выражении")
return True


calc = Calc()
while calc.loop(input('> ')):
pass
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

выполнено

Loading