#python #for-loop #oop #object
#python #для цикла #ооп #объект
Вопрос:
Я хотел бы повторить некоторое количество объектов, извлечь числа и подсчитать накопленный итог. Это то, что у меня есть:
print ('Calculating Commmissions with objects')
class SalesReps:
count = 0
def __init__( self , name , sales , commission) :
self.name = name
self.sales = sales
self.commission = commission
SalesReps.count = 1
def name_performance_pay( self ) :
return self.name
return self.sales
return self.commission
s1=SalesReps ('BAnderson', 15685.75, 1568.68)
s2=SalesReps ('GBates', 13856.80, 1385.68)
s3=SalesReps ('MBerger', 18560.44, 1437.04)
s4=SalesReps ('JCarter', 14375.86, 1437.59)
s5=SalesReps ('VChambers', 15963.45, 1596.35)
print('We have ', SalesReps.count, 'sales reps.n')
for rep in range(1, 5):
print(s[rep].name, s[rep].sales, s[rep].comission, 'n')
totalSales = totalSales s[rep].sales
totalCommissions = totalCommissions s[rep].commision
print ('Our total sales were ', totalSales, 'and our total commissions paid was ', totalCommissions, '.n)
Это то, что я получаю:
Traceback (most recent call last):
File "/home/jrw/Documents/bp.py", line 23, in <module>
print(s[rep].name, s[rep].sales, s[rep].comission, 'n')
NameError: name 's' is not
Есть ли в Python другое соглашение о подписке? Я этого не нашел.
Комментарии:
1. что такое
s
?2. s1 != s[rep] ..не то же самое. Я бы предложил поместить их в массив и выполнить цикл.
3. Добавьте свои
SalesReps
объекты в список, а затем выполните итерацию по этому списку4.
s = [s1,s2,s3,s4,s5]
?
Ответ №1:
Вы назвали пять несвязанных переменных ( s1
, s2
, s3
, …), вы не создали ни одной list
именованной s
, поэтому вы не можете указывать нижний индекс s
(его нет s
). Измените код, который инициализирует s1
и company, чтобы создать одно list
имя s
, и это было бы намного ближе к работе:
s = [SalesReps ('BAnderson', 15685.75, 1568.68),
SalesReps ('GBates', 13856.80, 1385.68),
SalesReps ('MBerger', 18560.44, 1437.04),
SalesReps ('JCarter', 14375.86, 1437.59),
SalesReps ('VChambers', 15963.45, 1596.35)]
for rep in range(len(s)):
сделал бы это, хотя это не было бы Pythonic ( for i in range(len(someseq)):
в принципе, это всегда неправильный способ сделать это). Более питонический подход сделал бы цикл:
for rep in s:
print(rep.name, rep.sales, rep.commission, 'n')
totalSales = rep.sales
totalCommissions = rep.commission
прямое повторение содержимого списка, а не допустимых индексов с повторной индексацией.
Ответ №2:
Это модификация с помощью pythonic way.
- Используйте
len(s)
вместоSalesReps.count
. - Используйте
sum
вместо plus в операторе for.
print ('Calculating Commmissions with objects')
class SalesReps:
def __init__( self , name , sales , commission) :
self.name = name
self.sales = sales
self.commission = commission
def name_performance_pay( self ) :
return self.name
return self.sales
return self.commission
s=[SalesReps ('BAnderson', 15685.75, 1568.68),
SalesReps ('GBates', 13856.80, 1385.68),
SalesReps ('MBerger', 18560.44, 1437.04),
SalesReps ('JCarter', 14375.86, 1437.59),
SalesReps ('VChambers', 15963.45, 1596.35)]
print('We have ', len(s), 'sales reps.n')
totalSales = sum(r.sales for r in s)
totalCommissions = sum(r.commission for r in s)
print ('Our total sales were ', totalSales, 'and our total commissions paid was ', totalCommissions, '.n')