【问题标题】:Converting string to float with Python 3.2使用 Python 3.2 将字符串转换为浮点数
【发布时间】:2011-10-04 19:30:20
【问题描述】:

此程序的目的是显示基于使用的输入的总和、平均值、最大值和最小值。

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 退出:"))

当我按 ENTER 结束循环时,它说它无法将字符串转换为浮点数和错误。我做错了什么??????

【问题讨论】:

  • 在提示符下按 的结果被传递给float(),它无法转换空字符串。将该行更改为data=input("Enter a number or just ENTER to quit:")

标签: python


【解决方案1】:

好吧,您不应该立即转换为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:这就是 Python 中惯用的 do...while。使用while cond:,您有代码重复(参见例如 OP sn-p)。
  • @agf:大概是为了避免在while循环之前重复提示。
  • 如果你试试这个,你会发现还是报错。 input() 调用实际上引发了异常。
  • @Chriszuma:不,这是 Python 3,而不是 Python 2。3 中的 input 相当于 2 中的 raw_input
【解决方案2】:

默认input的数据类型为string。按 ENTER 将返回一个无法转换为浮点数的空字符串,因为该字符串是空的并且没有要转换的内容,这会产生错误。以下是处理此错误的两种解决方案。

解决方案 1

不要将input直接转换为float,而是在将input的值赋给任意变量时进行转换。

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)

【讨论】:

    【解决方案3】:

    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)input 上的 float 完全没有必要,因此 try / except (not catch) 也是不必要的。
    • 请注意,他的代码中有两个要浮动的转换。他只需要while 循环顶部的那个。
    • @Chriszuma: bzzt!您不能在表达式中进行赋值。
    • Python 2 的正确解决方案不是使用try/except,而是使用raw_input
    • @agf 是的,这是一个更好的解决方案。请注意我选择的措辞“最简单”——意思是对程序的修改最少。
    【解决方案4】:

    你的变量名不正确,因为sum, minmax都是函数。将它们改为“datasum”、“datamin”、“datamax”等不同的名称,以免程序与函数混淆。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-25
        • 2019-07-10
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多