-2

这是我的程序。我正在为七名员工创建工资单。我试图实现一个循环,它从 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 位不同的员工,我必须为其创建 #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 模块的格式是否正确,还是有更好的方法来解决这个问题?

4

3 回答 3

1

上面有while num < 8:你说的行num ==1。相反,它应该是num = 1,并且应该与while语句内联,如下所示:

num = 1
while num < 8:

这就是为什么没有任何print语句执行的原因。因为num没有被重置为小于 8。

于 2013-07-08T17:37:47.200 回答
0

此外,可以帮助您避免错误的风格点(它为您完成初始化和递增计数器变量的繁琐工作),您可以这样做:

for num in range(1,8):
   ...
   print num
   ...
于 2013-07-08T17:45:10.667 回答
0

此代码可能无法按预期工作。你重复第一个循环 7 次,重新绑定相同的变量并且什么都不做。最后,您获得了员工 7 的价值观。然后您重复第二个循环 7 次,每次使用员工 7 的值。(然后,由于您的缩进不正确,您不会为 >= 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:
        # ...

但请注意,您实际上并没有将密钥用于任何事情,因此您还必须使用 alist而不是 a 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同时,如果您使用and ,则不会出现缩进问题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,然后您将在接下来的 15 小时内额外支付 150%,而不是额外的 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)

这就是你的整个程序。

于 2013-07-08T17:55:39.553 回答