Python嵌套循环中调用索引值并累加求和的报错求助——TypeError: 'float' object is not iterable
解决嵌套循环累加员工工时和薪资的问题
我来帮你梳理下问题所在,然后一步步解决:
首先看你遇到的TypeError: 'float' object is not iterable,核心原因是你试图遍历单个数值(比如员工的工时是一个float值),但for循环只能遍历可迭代对象(比如列表、元组)。另外代码里还有几个隐藏的小问题需要一起修正:
问题拆解
- 错误的循环逻辑:你写了
for y in record[2],但record[2]是单个员工的工时(一个float),不是列表,根本不需要遍历,直接取这个值累加就行 - 变量引用错误:外层循环是
for x in employee_records,每个x才是当前员工的记录,但你内层循环用的是record(最后一个员工的记录),这会导致你只累加最后一个员工的数据,甚至出错 - 初始化错误:
totalsales和totalhours初始化为None,直接和数值累加会引发TypeError: unsupported operand type(s) for +=: 'NoneType' and 'float' - 薪资格式问题:你把sales格式化成了带
$的字符串("${:,.2f}".format(sales)),字符串无法直接做数值累加,应该先保留数值,最后再格式化输出 - 记录存储错误:原来的
employee_records.append(record)写在了while循环外面,导致最终列表里只有最后一个员工的记录
修正后的完整代码
num_employees = int(input("Enter number of salespersons to be evaluated: ")) numNums = num_employees employee_records = [] lrange = [1, 2, 3, 4] while num_employees > 0: record = [] name = input("Enter employee name: ") try: level = int(input("Enter this employee's level: ")) if level not in lrange: print("Employee level must be from 1 to 4. Please re-enter employee's name.") if numNums < num_employees: num_employees += 1 continue except ValueError: print("Employee level must be from 1 to 4. Please re-enter employee's name.") if numNums < num_employees: num_employees += 1 continue try: hours = float(input("Enter hours worked by this employee: ")) except ValueError: print("Entry must be a number. Please re-enter employee's name.") if numNums < num_employees: num_employees += 1 continue try: sales = float(input("Enter revenue generated by this employee: ")) except ValueError: print("Entry must be a number. Please re-enter employee's name.") if numNums < num_employees: num_employees += 1 continue num_employees -= 1 record.append(name.capitalize()) record.append(level) record.append(hours) record.append(sales) # 先保留数值,后续再格式化输出 employee_records.append(record) # 移到循环内部,确保每个员工记录都被存入列表 print(employee_records) # 正确初始化累加变量为0 totalhours = 0.0 totalsales = 0.0 # 遍历每个员工的记录做累加 for employee in employee_records: totalhours += employee[2] totalsales += employee[3] # 最后格式化输出结果 print(f"Total hours worked: {totalhours:.2f}") print(f"Total sales revenue: ${totalsales:,.2f}")
关键修正点说明
- 调整记录存储位置:把
employee_records.append(record)移到while循环内部,确保每个员工的记录都能被添加到列表中 - 初始化累加变量:将
totalhours和totalsales初始化为0.0,避免None类型和数值累加的错误 - 简化累加逻辑:直接通过索引获取每个员工的工时和薪资数值,不需要多余的嵌套循环
- 分离数值存储与格式化:先保留薪资的原始数值用于累加,等计算完成后再格式化输出,避免字符串无法参与数值运算的问题
这样运行代码后,就能正确计算所有员工的工时总和和薪资总和啦!
内容的提问来源于stack exchange,提问作者Grelm
相关产品推荐
相关产品推荐

