NameError:全局名称' totaloverpay'没有定义

时间:2014-03-24 15:48:14

标签: python python-2.7

我刚开始上大学,我正在为我的大学课写这段代码而且它一直在发送错误。任何启蒙都会有所帮助,也许问题是我半睡半醒。

这是代码

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()

4 个答案:

答案 0 :(得分:1)

totaloverplay未在其所引用的main下面的任何函数中定义,或者作为全局变量定义。如果您希望它是全局的,请在主要功能范围之外定义它。

答案 1 :(得分:1)

你不应该养成使用global的习惯;这通常表明你正走向错误的方向。相反,使用函数参数和return语句传递显式所需的变量。此外,不要传递他们不需要完成工作的函数参数,并且更喜欢默认参数或显式常量来“魔术数字”。例如:

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_):

答案 2 :(得分: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)
  

输出:

     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

答案 3 :(得分: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