这是我的计划。有7名员工为我创建了一个paystub。我试图实现一个循环,它从num = 1开始,一直到num = 7.然而,当我运行程序时,没有任何东西被打印出来。想法?
#initalize all variables
medPremiere = 400
fedRate = .20
stateRate = .05
FICA = .08
retirement = .06
**Tax rates and such**
#the processing module
num = 1
while num < 8:
if num ==1:
empNum = 1
empName = 'billybob'
hours = 40
rate = 50
num = num + 1
if num ==2:
empNum = 2
empName = 'superman'
hours = 55
rate = 40
num = num + 1
if num ==3:
empNum = 3
empName = 'hulk'
hours = 60
rate = 60
num = num + 1
if num ==4:
empNum = 4
empName = 'scoobie'
hours = 45
rate = 80
num = num + 1
if num ==5:
empNum = 5
empName = 'Sherry'
hours = 66
rate = 30
num = num + 1
if num ==6:
empNum = 6
empName = 'doctor'
hours = 88
rate = 90
num = num + 1
if num ==7:
empNum = 7
empName = 'ironman'
hours = 77
rate = 70
num = num + 1
这些是7个不同的员工,我必须为其创建paystubs #the calc模块
#calculate gross pay
num ==1
while num < 8:
They get payed overtime and double overtime so I have to account for how many hours each employee has worked. Less than 41 hours they get payed regular, 41-60 hours they get paid overtime and more than 61 hours they get payed double overtime.
if hours <41:
gross = rate*hours
fedTax = gross*fedRate
stateTax = gross*stateRate
F = gross*FICA
K = gross*retirement
netPay = gross - fedTax - stateTax - F - K - medPremiere
print('Gross pay: ', gross)
print('Federal tax @ 20%: ', fedTax)
print('State tax @ 5%: ', stateTax)
print('FICA @ 8%: ', F)
print('401K @ 6%: ', K)
print('Net pay: $', netPay)
num = num + 1
在这里,我试图让它返回到顶部的数字列表,并为下一位员工提取信息。
if hours < 61:
gross = (40*hours) + (hours - 40)(1.5)(rate)
fedTax = gross*fedRate
stateTax = gross*stateRate
F = gross*FICA
K = gross*retirement
netPay = gross - fedTax - stateTax - F - K - medPremiere
print('Gross pay: ', gross)
print('Federal tax @ 20%: ', fedTax)
print('State tax @ 5%: ', stateTax)
print('FICA @ 8%: ', F)
print('401K @ 6%: ', K)
print('Net pay: $', netPay)
num = num + 1
if hours > 61:
gross = 40*hours + (hours-40)(1.5)(rate) + (hours - 60)(2)(rate)
fedTax = gross*fedRate
stateTax = gross*stateRate
F = gross*FICA
K = gross*retirement
netPay = gross - fedTax - stateTax - F - K - medPremiere
print('Gross pay: ', gross)
print('Federal tax @ 20%: ', fedTax)
print('State tax @ 5%: ', stateTax)
print('FICA @ 8%: ', F)
print('401K @ 6%: ', K)
print('Net pay: $', netPay)
num = num + 1
break
calc模块是否格式正确,还是有更好的方法来解决这个问题?
答案 0 :(得分:1)
在while num < 8:
行的上方,您说num ==1
。这应该是num = 1
,并且应该与while
语句内联,如下所示:
num = 1
while num < 8:
这就是为什么print
语句都没有执行的原因;因为num
未重置为小于8。
答案 1 :(得分:0)
另外,一个可以帮助你避免错误的风格点(它可以为你做初始化和递增计数器变量的脏工作),你可以这样做:
for num in range(1,8):
...
print num
...
答案 2 :(得分:0)
此代码无法按预期工作。你经历了第一次循环7次,重新绑定相同的变量,什么都不做。最后,你得到了员工7的价值观。然后,每次使用员工7的值进行第二次循环7次。 (然后,由于您的缩进不正确,因此对于&gt; = 41小时的员工,您不会执行任何操作,因此您不会做任何7次。)
这是构建程序的一种非常尴尬的方法,如果重组它,修复它会容易得多。
首先,如果你想循环[1,8]中的所有数字,请使用for
循环:
for num in range(1, 8):
这会删除许多额外代码,你可能会出错 - 包括你实际上出错的那些。
接下来,您需要为每位员工实际执行某些操作。当可以将第一个循环移动到一个函数中并在每个循环之后放置yield empNum, empName, hours, rate, num
时,这会使事情变得比它们需要的复杂得多。你想要的是一个可以用数字调用的函数,只返回该数字的正确值。那么你根本不需要循环。
但是如果你使用正确的数据结构,那么这个函数已经为你编写了:它只是索引。
例如,如果用这个替换第一个循环:
employees = {}
employees[1] = dict(empNum = 1,
empName = 'billybob',
hours = 40,
rate = 50)
employees[2] = dict(empNum = 2,
# etc.
...然后第二个循环可以这样做:
for employee in employees.values():
if employee['hours'] < 41:
gross = employee['rate'] * employee['hours']
fedTax = gross*fedRate
stateTax = gross*stateRate
F = gross*FICA
K = gross*retirement
netPay = gross - fedTax - stateTax - F - K - medPremiere
print('Gross pay: ', gross)
print('Federal tax @ 20%: ', fedTax)
print('State tax @ 5%: ', stateTax)
print('FICA @ 8%: ', F)
print('401K @ 6%: ', K)
print('Net pay: $', netPay)
if employee['hours'] < 61:
# ...
但请注意,您实际上并未使用这些键,因此您必须使用list
代替dict
。 (这样,您还可以保证始终按照创建它们的顺序迭代员工。)例如:
employees = [
dict(empNum = 1,
empName = 'billybob',
hours = 40,
rate = 50),
dict(empNum = 2,
# etc.
现在,您不需要for employee in employees.values():
,只需for employee in employees:
。
同时,如果您使用elif
和else
,则无法进行缩进问题。在这段代码中:
if employee['hours'] < 41:
gross = employee['rate'] * employee['hours']
# ... a bunch more code
if employee['hours'] < 61:
gross = employee['rate'] * employee['hours']
# ... a bunch more code
if employee['hours'] > 61:
gross = employee['rate'] * employee['hours']
...所有内容都会编译并运行,但是你永远无法进入最后一个块,因为小时数不能少于41,也不能超过60.但是在这段代码中:
if employee['hours'] < 41:
gross = employee['rate'] * employee['hours']
# ... a bunch more code
elif employee['hours'] < 61:
gross = employee['rate'] * employee['hours']
# ... a bunch more code
elif employee['hours'] > 61:
gross = employee['rate'] * employee['hours']
如果缩进错误,您将获得SyntaxError
,因为与if
处于同一级别的elif
没有,这更容易调试。
接下来,请注意61不低于41,或低于61,或高于61,因此任何工作61小时的人都不会发生任何事情。你可以通过>= 61
进行最后一次检查来解决这个问题。或者,更简单地说,只使用else
代替elif
。
接下来,每当你编写相同的代码行超过两次时,你应该寻找一种方法来重构它。几乎所有细节在三种情况下都是相同的;只有第一行不同。除了更难阅读之外,重复代码也更难以正确,更难维护。例如,在某些时候,您将遇到一个错误,并将其修复为一个副本而不是其他两个副本。
另外,你不能通过邻接它们来乘以Python中的两个数字;您需要使用*
运算符,如下所示:
gross = 40*hours + (hours - 40) * 1.5 * rate + (hours - 60) * 2 * rate
最后,你的方程是错误的。如果某人工作50个小时,你将以每小时1美元的价格支付他们40小时,因为你忘了将第一个任期乘以rate
,然后你将为他们支付150%的额外费用。 15个小时而不是额外的50%。
全部放在一起,用上面的词典列表替换第一个循环,然后用这个替换第二个循环:
for employee in employees:
gross = rate * hours
if hours > 40:
gross += rate * (hours - 40) * 0.5 * rate
if hours > 60:
gross += rate * (hours - 60) * 0.5 * rate
fedTax = gross*fedRate
stateTax = gross*stateRate
F = gross*FICA
K = gross*retirement
netPay = gross - fedTax - stateTax - F - K - medPremiere
print('Gross pay: ', gross)
print('Federal tax @ 20%: ', fedTax)
print('State tax @ 5%: ', stateTax)
print('FICA @ 8%: ', F)
print('401K @ 6%: ', K)
print('Net pay: $', netPay)
这就是你的整个计划。