0

我正在从事小型 python 工资单项目,您可以在其中输入员工姓名、工资和工作时间。当我为工资输入输入小数时,由于我的异常处理,我得到“无效输入”。为什么小数返回无效?另外,我怎样才能循环这个程序,以便在用户键入“完成”之前保持相同的 3 个问题?任何帮助将不胜感激!谢谢!

import cPickle

def getName():
    strName="dummy"
    lstNames=[]
    strName=raw_input("Enter employee's Name: ")
    lstNames.append(strName.title() + " \n")


def getWage():
    lstWage=[]
    strNum="0"
    blnDone=False
    while blnDone==False: #loop to stay in program until valid data is entered
        try:
            intWage=int(raw_input("Enter employee's wage: "))
            if intWage >= 6.0 and intWage <=20.0:
                lstWage.append(float(strNum)) #convert to float
                blnDone=True
            else:
                print "Wage must be between $6.00 and $20.00"
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"


def getHours():
    lstHours=[]
    blnDone=False
    while blnDone==False: #loop to stay in program until valid data is entered
        try:
            intHrs=int(raw_input("Enter number of hours worked: "))
            if intHrs >= 1.0 and intHrs <=60.0:
                blnDone=True
            else:
                print "Hours worked must be 1 through 60."
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"

def getDone():
    strDone=""
    blnDone=False
    while blnDone==False:
        try:
            srtDone=raw_input("Type \"DONE\" if you are finished entering names, otherwise press enter: ")
            if strDone.lower()=="done":
                blnDone=True
            else:
                print "Type another empolyee name"
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"


##### Mainline ########

strUserName=getName()
strWage=getWage()
strHours=getHours()
srtDone1=getDone()
4

5 回答 5

3

这是它的核心:

>>> int("4.3")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '4.3'

如果字符串不是整数,则不能将其转换为整数。所以当你这样做时,intWage=int(raw_input("Enter employee's wage: "))它会抛出ValueError. 也许您应该将其直接转换为float.

于 2012-03-28T13:31:01.767 回答
2

因为您将输入转换为int

intWage=int(raw_input("Enter employee's wage: "))
于 2012-03-28T13:30:48.580 回答
1

您假设工资是一个整数,根据定义,它没有小数位。试试这个:

intWage=float(raw_input("Enter employee's wage: "))
于 2012-03-28T13:31:02.950 回答
1

尝试使用

intWage=int(float(raw_input("Enter employee's wage: ")))

这将接受一个十进制数作为输入。

于 2015-08-18T16:04:53.873 回答
0

带有浮点数的错误

正如其他人之前所说,您假设输入将是一个浮点数。使用float()eval()代替int()

intWage = float(raw_input("Enter employee's wage: "))

或使用input()代替int(raw_input())

intWage = input("Enter employee's wage:")

两者都会完成同样的事情。哦,改成intWage至少floatWage,甚至更好,不要使用匈牙利符号。

编码

至于你的代码,我做了几件事:

  • 使用break和/或return终止循环而不是跟踪布尔值(这是breakandcontinue语句的全部目的)
  • 改为intWage_floatWage
  • 以更简洁的方式重写了数字比较(x <= y and x >= z可以写成z >= x >= y
  • 添加了返回语句。我不明白您为什么不自己放置它们,除非您想分配NonestrUserName,strWagestrHours)
  • 在询问员工详细信息时,根据您的要求添加了一个循环。
  • 修改getDone()为使用循环。

import cPickle

def getName():
    strName = "dummy"
    lstNames = []
    strName = raw_input("Enter employee's Name: ")
    lstNames.append(strName.title() + " \n")
    return strName

def getWage():
    lstWage = []
    strNum = "0"
    while True:                                                #Loop to stay in program until valid data is entered
        try:
            floatWage = float(raw_input("Enter employee's wage: "))
            if 6.0 <= floatWage <= 20.0:
                lstWage.append(floatWage)
                return floatWage
            else:
                print "Wage must be between $6.00 and $20.00"
        except ValueError:                                     #Catches ValueErrors from conversion to float
            print "Invalid entry"

def getHours():
    lstHours = []
    while True:                                                #loop to stay in program until valid data is entered
        try:
            intHrs=int(raw_input("Enter number of hours worked: "))
            if 1.0 <= intHrs <= 60.0:
                return intHrs
            else:
                print "Hours worked must be 1 through 60."
        except ValueError:                                     #Catches ValueErrors from conversion to int
            print "Invalid entry"

def getDone():
    strDone = ""
    while True:
        srtDone = raw_input('Type "DONE" if you are finished entering names, otherwise press enter: ')
        if strDone.strip().lower() == "done":
            return True
        else:
            print "Type another empolyee name"

while not getDone():
    strUserName = getName()
    strWage = getWage()
    strHours = getHours()

break和的一个例子continue

循环内的break语句 ( forand while) 终止循环并跳过所有“else”子句(如果有的话)。

这些continue语句跳过循环中的其余代码并继续循环,就好像什么都没发生一样。

构造中的else子句在for...else循环用尽所有项目并正常退出时执行其代码块,即,当它没有被break什么终止时。

for no in range(2, 10):
    for factor in range(2, no):
        if no % factor == 0:
            if factor == 2:
                print "%d is even" % no
                continue  
                # we want to skip the rest of the code in this for loop for now
                # as we've already done the printing
            print "%d = %d * %d" % (no, factor, n/x)
            break 
           # We've asserted that the no. isn't prime, 
           # we don't need to test the other factors
    else:
        # if 'break' wasn't called
        # i.e., if the loop fell through w/o finding any factor
        print no, 'is a prime number'
于 2012-03-28T14:24:25.117 回答