Python, Методы и атрибуты
Продолжаю изучать Python
Застрял на задачке: Реализовать копилку, пополняемую центами и долларами, начальная сумма в копилке 1 доллар и 1 цент
class PiggyBank:
def __init__(self, dollars, cents):
self.dollars = dollars
self.cents = cents
def add_money(self, deposit_dollars, deposit_cents):
if deposit_cents + self.cents >= 100:
self.cents = deposit_cents % 100
self.dollars += deposit_cents // 100
else:
self.cents += deposit_cents
return(self.dollars, self.cents)
Выводит: Тестовый вход: 0 99 Правильный выход: 2 0
Вывод вашего кода: 1 99
Не могу найти ошибку
Ответы (4 шт):
Можно немного упростить Ваш код:
class PiggyBank:
def __init__(self, dollars, cents):
self.dollars = dollars
self.cents = cents
def add_money(self, deposit_dollars, deposit_cents):
self.dollars += deposit_dollars + (self.cents + deposit_cents) // 100
self.cents = (self.cents + deposit_cents) % 100
return(self.dollars, self.cents)
bank = PiggyBank(1, 1)
bank.add_money(0, 99)
print(bank.__dict__) # {'dollars': 2, 'cents': 0}
bank.add_money(1, 0)
print(bank.__dict__) # {'dollars': 3, 'cents': 0}
bank.add_money(1, 1)
print(bank.__dict__) # {'dollars': 4, 'cents': 1}
Ваш же код нужно доработать учетом долларов и правильным пересчетом центов:
def add_money(self, deposit_dollars, deposit_cents):
if deposit_cents + self.cents >= 100:
self.dollars += deposit_dollars + (deposit_cents + self.cents) // 100
self.cents = (deposit_cents + self.cents) % 100
else:
self.cents += deposit_cents
self.dollars += deposit_dollars
return(self.dollars, self.cents)
Попробуйте так
class PiggyBank:
def __init__(self, dollars, cents):
self.dollars = dollars
self.cents = cents
def add_money(self, deposit_dollars, deposit_cents):
_cents = deposit_cents + self.cents
print(f'deposit_dollars={deposit_dollars}, '
f'deposit_cents={deposit_cents}, _cents={_cents}') #
if _cents >= 100:
# self.cents = deposit_cents % 100
self.cents = _cents % 100 # +++
# self.dollars += deposit_cents // 100
self.dollars += deposit_dollars + (_cents // 100) # +++
else:
self.cents += deposit_cents
self.dollars += deposit_dollars # +++
return self.dollars, self.cents
piggyBank = PiggyBank(1, 99)
print(f'${piggyBank.dollars},{piggyBank.cents}')
print(piggyBank.add_money(2, 5))
print(f'${piggyBank.dollars},{piggyBank.cents}')
print(piggyBank.add_money(1, 0))
print(f'${piggyBank.dollars},{piggyBank.cents}')
print(piggyBank.add_money(3, 3))
print(f'${piggyBank.dollars},{piggyBank.cents}')
Думаю, правильнее с точки зрения чистоты кода добавить метод для конвертации валют и вызывать его при добавлении. Так же можно было бы проперти атрибут результата сделать и вызывать его там.
class PiggyBank:
def __init__(self, dollars=1, cents=1):
self.dollars = dollars
self.cents = cents
def add_money(self, deposit_dollars=0, deposit_cents=0):
self.dollars += deposit_dollars
self.cents += deposit_cents
self.conversion()
def conversion(self):
if self.cents >= 100:
count_dollars = self.cents // 100
self.cents -= count_dollars*100
self.dollars += count_dollars
def __repr__(self):
return f'{self.dollars} dollars {self.cents} cents'
bank = PiggyBank()
bank.add_money(0, 99)
print(bank) # выход: 2 dollars 0 cents
Кроме того, что вот так, напрямую лазить в объект - не очень хорошо, можно написать еще короче и экономнее. Хотя, конечно, на вкус и цвет..
class PiggyBank:
def __init__(self, dollars, cents):
self.accumulation = dollars+cents*0.01
def add_money(self, deposit_dollars, deposit_cents):
self.accumulation += deposit_dollars
self.accumulation += deposit_cents*0.01
return()
def how_rich_i_am(self):
print (f"{int(self.accumulation//1)} dollars {int(self.accumulation%1*100)} cents.")
return()
Имеем:
bank = PiggyBank(1, 1)
bank.how_rich_i_am()
bank.add_money(0, 99)
bank.how_rich_i_am()
Получаем:
1 dollars 1 cents.
2 dollars 0 cents.