Python | TypeError:';浮动';对象不能解释为整数

Python | TypeError:';浮动';对象不能解释为整数,python,Python,我尝试创建一个模块化程序(作为一本书中的一些实践作业之一),要求用户输入速度(mph)和行驶时间(小时),然后(使用循环)我尝试显示车辆行驶的距离,每小时的行程 我试图以模块化的方式构建模块,因此所有的def 问题:调试时,我得到一个类型错误:“float”对象不能解释为整数 def userJourneySpeed(): vehicleSpeed = float(input("Please enter the speed of your vehicle: ")) return

我尝试创建一个模块化程序(作为一本书中的一些实践作业之一),要求用户输入速度(mph)和行驶时间(小时),然后(使用循环)我尝试显示车辆行驶的距离,每小时的行程

我试图以模块化的方式构建模块,因此所有的
def

问题:调试时,我得到一个
类型错误:“float”对象不能解释为整数

def userJourneySpeed():
    vehicleSpeed = float(input("Please enter the speed of your vehicle: "))
    return vehicleSpeed

def userJourneyTime():
    hoursTraveled = float(input("Please enter how many hours you traveled: "))
    return hoursTraveled

def printSpec(hoursTraveled, vehicleSpeed):
    print("Hour", "\tDistance Traveled")
    for currentHour in range(1, hoursTraveled + 1):
        userDistanceTraveled = vehicleSpeed * currentHour
        print(currentHour, "\t", userDistanceTraveled)

def mainProgram():
    vehicleSpeed = userJourneySpeed()
    hoursTraveled = userJourneyTime()
    printSpec(hoursTraveled, vehicleSpeed)
mainProgram()

任何关于我哪里出错的建议,都将不胜感激

hoursTraveled
将从您的输入转换为浮点值

然后在printSpec的range函数中使用它。因为它是一个浮点,所以range函数抛出您提供的错误

您可以通过将hoursTraveled的输入立即转换为int来解决这个问题,或者在range函数的第二个参数中进行转换

有关快速示例,请尝试以下方法:

>>> range(1, 2.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: range() integer end argument expected, got float.
>范围(1,2.0)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:应为range()整数结束参数,获得浮点值。

错误源于试图获取浮点值的范围。为了避免这种情况,您必须在
print\u spec
函数中考虑浮动

以模块化的方式编写程序是非常好的实践。谢谢你。需要记住的是,模块化的一个关键方面是将类似的操作组合在一起。考虑到这一点,在单个函数中收集用户数据是有意义的。这样,您的程序可以保持其模块性,并且不那么零碎

本着鼓励良好实践的精神,编写代码文档是一个好主意。在函数顶部添加docstring,以指定预期的参数、retrn类型和函数的一般概述。这是一个很好的实践,有助于理解和调试代码

有关python风格的更多优秀技巧,请参考

下面是您的代码,并做了一些小改动,以使其按您的意愿工作。 我已将术语
累计行驶距离
包含在打印输出中,因为这是您每小时实际计算的距离

此外,我还介绍了处理小时数不足的案例的功能

def get_journey_data():
    """(NoneType) -> tuple(float, float)
    Get the speed and duration of travel
    """
    vehicle_speed = float(input("Please enter the average travel speed: "))
    hours_traveled = float(input("Please enter the travel time: "))
    return vehicle_speed, hours_traveled

def print_spec(travel_time, average_speed):
    """(float, float) -> NoneType
    Print the journey table in the following format:
    Current Hour | Distance Traveled
    """
    travel_time_hours = int(travel_time) #get whole hours from 
                                         #travel_time
    travel_time_rem = travel_time % 1 #get fraction of an hour left over
    hline = "\t---------------------------------------------"
    print("\n\tCurrent Hour\t|\tCumulative Distance Traveled")
    print(hline)
    for current_hour in range(1, travel_time_hours + 1):
        print("\t\t", current_hour, "\t|\t", current_hour * average_speed)
        print(hline)
    if travel_time_rem:
        print("\t\t", travel_time_hours + 1, "\t|\t", 
              travel_time*average_speed)
        print(hline)
    return None



def main_program():
    """(NoneType) -> Nonetype"""
    vehicle_speed, hours_traveled = get_journey_data()
    print_spec(hours_traveled, vehicle_speed)
    return None

如果您遇到错误,请发布完整的错误消息,包括堆栈跟踪。也就是说,它来自您将
float
对象传递到
range
函数,该函数需要
int
对象。很高兴认识您,William,希望您喜欢学习Python并成为SO的一员。然而,我们不会在这里的帖子里写问候语。经验法则是:如果你不希望在维基百科页面上看到它,不要把它放在你的问题(或答案)中。顺便说一句,这是一段漂亮的代码,尽管Python习惯于调用main函数
main
,而不是
mainProgram
,我们使用
snake\u case
作为函数名,而不是
camelCase
。有关更多详细信息,请参阅。@PM2Ring-感谢您的回复。就像我的干净代码一样,我会更干净,我的帖子也会更干净;非常感谢你给我的关于正确礼仪的提示/提示。非常感谢你,完全有道理,现在我想起来了。