2014-03-24 58 views
0

我剛開始上大學,我正在爲我的大學課程編寫此代碼,並一直髮送錯誤。任何啓蒙會有所幫助,也許問題是我已經睡着了。NameError:全球名稱'totaloverpay'未定義

這裏是

def main(): 
    overtime = int(0) 
    totaloverpay = float(0) 
    hours = int(input('How many hours did you work? NOTE** Hours can not exceed 86 or be less than 8 ')) 
    while hours > 86 or hours < 8: 
     print('ERROR: Insufficient input. Try again') 
     hours = int(input('How many hours did you work? NOTE** Hours can not exceed 86 or be less than 8 ')) 

    payrate = float(input('What is the payrate per hour for this employee? NOTE** Payrate can not exceed $50.00 or be less than $7.00 ')) 
    while payrate > 50.00 or payrate < 7.00: 
      print('ERROR: Insufficient input. Try again') 
      payrate = float(input('What is the payrate per hour for this employee? NOTE** Payrate can not exceed $50.00 or be less than $7.00 ')) 

    workhours(hours, payrate, overtime) 
def workhours(hours, payrate, overtime): 
    if hours > 40: 
     overtime = (hours - 40) * -1 
    else: 
     regtime = hours + 0 
    paydistribution(hours, payrate, regtime, overtime) 
def paydistribution(hours, payrate, regtime, overtime): 
    if hours >= 40: 
     halfrate = float(payrate * 0.5) 
     overpay = halfrate + payrate 
     totaloverpay = float(overpay * hours) 
    if hours < 40: 
     regpay = hours * payrate 

    display(hours, payrate, regpay, regtime, overtime) 
def display(hours, payrate, regpay, regtime, overtime): 
    total = float(regpay + totaloverpay) 

    print('  Payroll Information') 
    print('Payrate  :', format(payrate, '0.2f')) 
    print('Regular Hours :', format(regtime)) 
    print('Overtime Hours:', format(overtime)) 
    print('Regular Pay :', format(regpay, '6.2f')) 
    print('Overtime Pay :', format(totaloverpay, '7.2f')) 
    print('Total Pay  :', format(total, '7.2f')) 

main() 
+2

在未來,如果你得到一個錯誤,當您運行您的代碼,請在您的帖子中包含錯誤消息。如果我們不需要通過代碼來查看任何看起來錯誤的代碼,它會使問題變得更快更容易。 – Michelle

回答

1

totaloverplay未在下面主要任何功能,其中它被稱爲或作爲全局變量定義的代碼。如果您希望它是全局的,請將其定義在主函數的範圍之外。

+2

*如果您希望它是全局的,請將其定義在主函數範圍之外*注意:需要進行其他更改。 –

1

你不應該養成使用global的習慣;這通常表明你正朝着錯誤的方向前進。相反,使用函數參數和返回語句顯式傳遞所需的變量。另外,不要傳遞他們不需要的函數參數來完成他們的工作,而是將默認參數或顯式常量選爲「幻數」。例如:

def workhours(hours, threshold=40): 
    if hours > threshold: 
     overtime = hours - threshold 
     regtime = threshold 
    else: 
     overtime = 0 
     regtime = hours 
    return regtime, overtime 

def paydistribution(payrate, regtime, overtime, otrate=1.5): 
    regpay = regtime * payrate 
    overpay = overtime * payrate * otrate 
    return regpay, overpay 

現在main可以撥打:

regtime, overtime = workhours(hours) 
regpay, overpay = paydistribution(payrate, regtime, overtime) 
display(hours, payrate, regpay, regtime, overtime) 

這樣可以使流動主要是在main而讓其他功能做只是他們的任務的特定位。

在你的位置上,我還會考慮有一個單獨的函數來接受用戶輸入,它循環直到它們提供可接受的東西。一個適當的定義,例如:

def user_input(prompt, min_, max_): 
1

這看起來像一個巨大的用例爲class而不是依賴於函數式編程。

from decimal import Decimal # more precision than floating point 

MINIMUM_WAGE = Decimal("7.25") 
OVERTIME_RATE = Decimal("1.5") 

class Employee(object): 
    def __init__(self,first,last,MI="",payrate=MINIMUM_WAGE): 
     self.first = first.capitalize() 
     self.last = last.capitalize() 
     self.MI = MI.upper() 
     if not MI.endswith("."): self.MI += "." 
     self.payrate = payrate 
     self.hours = 0 
    @property 
    def name(self, reversed_=False): 
     return "{} {} {}".format(self.first,self.MI,self.last) 
    @property 
    def alphabetize(self): 
     return "{}, {}".format(self.last, self.first) 

    def payroll(self,numweeks=1): 
     regularhours = min(40*numweeks,self.hours) 
     OThours = max(0,self.hours-regularhours) 
     regularpay = regularhours * self.payrate 
     OTpay = round(OThours * self.payrate * OVERTIME_RATE,2) 
     return {"reghours":regularhours, 
       "overtime":OThours, 
       "regpay":regularpay, 
       "OTpay":OTpay, 
       "total":regularpay + OTpay} 

    def sethoursworked(self,amt): 
     self.hours = amt 

def display(employee): 
    payrollinfo = employee.payroll() 
    print("{:^30}".format("Payroll Information")) 
    print("{:>30}".format(employee.name)) 
    print("Payrate:{:>22}".format(employee.payrate)) 
    print("Hours:{:>24}".format(payrollinfo['reghours'])) 
    print("Overtime Hours:{:>15}".format(payrollinfo['overtime'])) 
    print("Regular Pay:{:>18}".format(payrollinfo['regpay'])) 
    print("Overtime Pay:{:>17}".format(payrollinfo['OTpay'])) 
    print("-"*30) 
    print("Total Pay:{:>20}".format(payrollinfo['total'])) 

Adam = Employee("Adam","Smith","D") 
Adam.sethoursworked(51) 

display(Adam) 

OUTPUT:

 Payroll Information  
       Adam D. Smith 
Payrate:     7.25 
Hours:      40 
Overtime Hours:    11 
Regular Pay:   290.00 
Overtime Pay:   119.62 
------------------------------ 
Total Pay:    409.62 
0

這裏是另一個清理後的版本:

from textwrap import dedent 
import sys 

if sys.hexversion < 0x3000000: 
    # Python 2.x 
    inp = raw_input 
else: 
    # Python 3.x 
    inp = input 

MIN_HOURS = 8. 
MAX_HOURS = 86. 
MIN_RATE = 7. 
MAX_RATE = 50. 
OVERTIME_CUTOFF = 40. 
OVERTIME_BONUS = 0.5 

def get_float(prompt, lo=None, hi=None): 
    while True: 
     try: 
      val = float(inp(prompt)) 
      if lo is not None and val < lo: 
       print("Value must be >= {}".format(lo)) 
      elif hi is not None and val > hi: 
       print("Value must be <= {}".format(hi)) 
      else: 
       return val 
     except ValueError: 
      print("Please enter a number") 

def main(): 
    hours = get_float("How many hours did you work? ", MIN_HOURS, MAX_HOURS) 
    rate = get_float("What is the hourly payrate? ", MIN_RATE, MAX_RATE) 

    time  = min(hours, OVERTIME_CUTOFF) 
    pay  = time * rate 
    overtime = max(0., hours - OVERTIME_CUTOFF) 
    overpay = overtime * rate * (1. + OVERTIME_BONUS) 

    print(dedent(""" 
      Payroll Information 
     Payrate  : $ {rate:>7.2f} 
     Regular Hours : {time:>4.0f} h 
     Regular Pay : $ {pay:>7.2f} 
     Overtime Hours: {overtime:>4.0f} h 
     Overtime Pay : $ {overpay:>7.2f} 
     Total Pay  : $ {total:>7.2f} 
    """).format(rate=rate, time=time, pay=pay, overtime=overtime, overpay=overpay, total=pay+overpay)) 

if __name__=="__main__": 
    main() 

它運行像

How many hours did you work? 46 
What is the hourly payrate? 11 

    Payroll Information 
Payrate  : $ 11.00 
Regular Hours :  40 h 
Regular Pay : $ 440.00 
Overtime Hours:  6 h 
Overtime Pay : $ 99.00 
Total Pay  : $ 539.00 
相關問題