使用带计数器的循环

时间:2013-07-08 17:34:50

标签: python loops counter

这是我的计划。有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模块是否格式正确,还是有更好的方法来解决这个问题?

3 个答案:

答案 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:


同时,如果您使用elifelse,则无法进行缩进问题。在这段代码中:

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)

这就是你的整个计划。