使用Python 3.2将字符串转换为浮点数

3

这个程序的目的是基于用户输入,显示总和、平均值、最大值和最小值。

count=0.0
Sum=0.0
average=0.0
data=float(input("Enter a number or just ENTER to quit:"))
Min=data
Max=data

while data!="":
    count+=1
    number=float(data)
    Sum+=number
    average=Sum/count

    if data<Min:
        Min=data
    if data>Max:
        Max=data
    data=float(input("Enter a number or just ENTER to quit:"))

print(count,("numbers entered."))
print("Sum:",Sum)
print("Average:",average)
print("Min:",Min)
print("Max:",Max)

问题在第20行: data=float(input("输入一个数字或按回车退出:"))
当我按回车结束循环时,它会报错说无法将字符串转换为浮点数。我做错了什么?

在提示符处按下<ENTER>键的结果被传递给float(),但它无法转换空字符串。将该行更改为data=input("输入一个数字或按ENTER退出:") - Steven Rumbalski
5个回答

3

首先,你不应该立即将其转换为float。另外,在Python中这也不是使用do..while循环的方法。

while True:
    data = input('Enter a number or ENTER to quit: ')
    if not data: break

    data = float(data)
    # ...

这样,您就不必重复编写代码,也不必不必要地延长"data"名称的生命周期。

我并没有看到在实际使用while循环条件上存在任何问题?为什么要使用True,然后手动break呢? - agf
如果你尝试这样做,你会发现它仍然出错。input()调用实际上引发了异常。 - Chriszuma
2
@Chriszuma:不,这是Python 3,而不是Python 2。在3中,“input”等效于2中的“raw_input”。 - Cat Plus Plus
我认为在带有 while data: 的循环之前增加一个额外的 data = input(prompt) 比使用 while True:if not data: break 更清晰和更符合 Python 风格。另一种可能的解决方案是:在循环之前将 data 设置为 True - agf
@agf:你可以提出异议,但这是大多数人实现do-while循环的方式。条件仍然是循环的一部分,没有重复的代码。其他解决方案或多或少都不太自然。 - Cat Plus Plus
显示剩余2条评论

2

默认情况下,input 的数据类型是 字符串。按下 ENTER 将返回一个空字符串,无法转换为浮点数,因为空字符串没有可转换的内容,这就导致了错误。以下是两种解决此错误的方法。

解决方案 1

不要直接将输入转换为浮点数,而是在将输入值赋给任何变量时进行转换。

data=input("Enter a number or just ENTER to quit:")

在循环之前添加以下语句以处理用户在未输入任何数字的情况下退出的条件。
if not data: # If user wants to exit without entering any number
    Max = 0
    Min = 0
else:  # Cast the inputs by user to float
    Max = float(data)
    Min = float(data)

最后,在循环内部的开头添加以下行。
data = float(data)

完整代码

count=0.0
Sum=0.0
average=0.0
data=input("Enter a number or just ENTER to quit:")
if not data:
    Max = 0
    Min = 0
else:
    Max = float(data)
    Min = float(data)

while data!='':
    data = float(data)
    count+=1 
    number=float(data)
    Sum+=number
    average=Sum/count

    if data<Min:
        Min=data
    if data>Max:
        Max=data
    data=input("Enter a number or just ENTER to quit:")

print(count,("numbers entered."))
print("Sum:",Sum)
print("Average:",average)
print("Min:",Min)
print("Max:",Max)

解决方案2

你可以为空输入设置默认值。由于你将输入转换为浮点数,因此可以将任何数字设置为空输入的默认值。 但是,我不建议这样做,因为如果用户输入与默认值相同的数字,则循环将被终止。 在下面的示例中,我只修改了你代码的两行,并将空输入的默认值设置为0。

count=0.0
Sum=0.0
average=0.0
data=float(input("Enter a number or just ENTER to quit:") or 0)
Min=data
Max=data

while data!=0:
    count+=1
    number=float(data)
    Sum+=number
    average=Sum/count

    if data<Min:
        Min=data
    if data>Max:
        Max=data
    data=float(input("Enter a number or just ENTER to quit:") or 0)

print(count,("numbers entered."))
print("Sum:",Sum)
print("Average:",average)
print("Min:",Min)
print("Max:",Max)

1

float() 函数对于空输入会引发异常,你必须捕获这个异常才能让循环按照预期工作。以下是最简单的修复方法:

在 Python 2.x 中,实际上是 input() 调用引发了异常,而不是 float()。因此,如果你使用的是 Python 2.x,我的解决方案是唯一可行的。

while True:
    count+=1
    Sum+=data
    average=Sum/count

    if data<Min:
        Min=data
    if data>Max:
        Max=data
    try:
      data=float(input("Enter a number or just ENTER to quit:"))
    except:
      break

看一下 number=float(data)。输入中的 float 完全没有必要,所以 try / except (不是 catch) 也是不必要的。 - agf
请注意他的代码中有两个转换为浮点数的操作。他只需要在while循环的顶部进行一次转换即可。 - Steven Rumbalski
@Chriszuma:嗡嗡声!你不能在表达式中进行赋值。 - Steven Rumbalski
在Python 2中,正确的解决方案不是使用try/ except,而是使用raw_input - agf
@agf 是的,那是一个更好的解决方案。请注意我的措辞选择“最简单” - 意思是对程序的修改最少。 - Chriszuma

1
你的变量名不正确,因为 summinmax 都是函数。将它们改成不同的名称,例如 "datasum"、"datamin" 和 "datamax",这样程序就不会将它们与函数混淆了。保留 html 标签。

0

Python默认只接受字符串格式的输入。不要在Python中进行直接类型转换,例如将字符串转换为浮点数。这会立即导致错误。 将字符串转换为浮点数的最佳方法是:

string_data = input("enter the data")
enter the data 123
string_data '123'
float_data = float(string_data)
float_data 123.0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接