【问题标题】:Can you use float numbers in this for loop?你可以在这个 for 循环中使用浮点数吗?
【发布时间】:2017-02-04 11:51:48
【问题描述】:

我需要一些帮助。 我试图让我的 for 循环使用小数,但我的代码不接受浮点数,我不知道下一步该做什么。谁能指出我哪里出错了?

这是一个用于将摄氏温度转换为华氏温度的代码,用户定义的步长(Delta)。这里是:

def main():

    # Handshake
    print("This program will convert a range of Celsius degrees to")
    print("Fahrenheit degrees based on your input.")

    # Ask and read low end of range
    Rangelow = eval(input("Enter the low end of your range: "))

    # Ask and read top end of range
    Rangehigh = 1 + eval(input("Enter the high end of your range: "))

    # Ask and read Delta
    Delta = eval(input("Enter the Delta for your range: "))

    #Display output
    print("Celsius to Fahrenheit by", Delta)
    for i in range(Rangelow, Rangehigh, Delta):
        print(i, "               ", 9/5 * i + 32)



main()

这是我的意思的一个例子:

该程序会将摄氏温度范围转换为 华氏度根据您的输入。 输入范围的低端:3.8 输入范围的高端:14.7 输入范围的 Delta:1.1 摄氏到华氏1.1 回溯(最近一次通话最后): 文件“C:\Users\jarre\Desktop\Python Programs\Conversion.py”,第 27 行,在 主要的() 文件“C:\Users\jarre\Desktop\Python Programs\Conversion.py”,第 22 行,在 main 对于范围内的 i(Rangelow,Rangehigh + 1,Delta): TypeError: 'float' 对象不能被解释为整数

我应该注意到问题似乎在于输入,在输入转换后输出没有问题抛出一个小数。

【问题讨论】:

  • 当你说“我的代码不接受浮点数”时,这是什么意思?如果有追溯,请编辑您的问题并添加它。
  • 查看文档:docs.python.org/2/library/functions.html...The arguments must be plain integers.
  • 旁注:请不要在用户提供的输入中使用eval。如果您期望float,则使用float 而不是eval。如果您想允许intfloat(或任何Python 文字),您可以使用ast.literal_eval,它可以安全地处理任意Python 文字,而不会让您执行任意代码。
  • @ShadowRanger float 只会导致错误:Traceback(最近一次调用最后一次):文件“C:\Users\jarre\Desktop\Python Programs\Conversion.py”,第 27 行,在 main() 文件“C:\Users\jarre\Desktop\Python Programs\Conversion.py”,第 22 行,在 main for i in range(Rangelow, Rangehigh + 1, Delta): TypeError: 'float' object cannot be解释为整数
  • @Jarbcd:这是一个旁注是有原因的。使用float 是您可能接受的示例,如果您的代码的其余部分预期floats(它没有,因为range 仅支持int)。关键是eval 不安全/不稳定,您应该使用更具体的东西来满足您的需求。如果你想要float(这里可能是个坏主意;如果你真的想允许小数,你会想要decimal.Decimal 进行无损存储并使用AChampion 的decimal_range 函数),使用float。如果你想要int,请使用int。如果您想要任何旧的 Python 文字,请使用 ast.literal_eval

标签: python-3.x for-loop range user-input


【解决方案1】:

您不能使用内置函数进行浮点/小数增量,但构建自己的生成器相当容易:

def decimal_range(start, stop, increment):
    while start < stop: # and not math.isclose(start, stop): Py>3.5
        yield start
        start += increment

for i in decimal_range(Rangelow, Rangehigh, Delta):
    ...

或者你可以使用numpy,但这感觉就像一把大锤敲碎了坚果:

import numpy as np
for i in np.arange(Rangelow, Rangehigh, Delta):
    ...

【讨论】:

  • 注意:如果您在许多情况下将它与floats 一起使用,这将不会像您预期的那样运行。例如,如果参数是0.2, 0.3, 0.1,您将得到一个输出(正确排除“大约 0.3”的输出)。但是如果你通过0.7, 0.8, 0.1,你会得到两个输出,0.70.7999999999999...。顾名思义,使用它的唯一安全方法是将输入字符串直接转换为decimal.Decimal,而不是float
  • 是的,浮点舍入错误是一个问题 - 所以同意十进制是要走的路。您可以使用math.isclose() 修复 Py > 3.5 的一些错误
  • 我将如何实现这个?我很难弄清楚这一点
  • @ShadowRanger 当我使用上面的十进制代码时,我得到的只是关于三个缺失位置的错误
  • @Jarbcd 你可能想问另一个问题,因为没有看到你做了什么 - 很难说出错误是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多