Python 3.9计算员工延迟遇TypeError:不支持字符串间减法运算
解决Python计算员工延迟时长的TypeError问题
问题详情
我是Python 3.9新手,编写计算20名员工每周延迟时长的代码时触发TypeError,错误信息:
unsupported operand type(s) for -: 'str' and 'str'
需求说明
- 用函数和类实现功能
- 为20名员工随机生成上下班时间:周四仅在8:00-13:00取时间,其余工作日分8-12(上班)、13-17(下班)两个时段
- 累加每人每周延迟时长并按顺序输出(以小时为单位)
原报错代码
import random c=0 def weeklyPaid(delays): if delays >8: return delays / 8 else: return delays * 1 while c<=20: sat1 = input(random.randint(8, 12)) sun1 = input(random.randint(8, 12)) mon1 = input(random.randint(8, 12)) tue1 = input(random.randint(8, 12)) wed1 = input(random.randint(8, 12)) thu1 = input(random.randint(8, 12)) sat2 = input(random.randint(13, 17)) sun2 = input(random.randint(13, 17)) mon2 = input(random.randint(13, 17)) tue2 = input(random.randint(13, 17)) wed2 = input(random.randint(13, 17)) thu2 = input(random.randint(13, 13)) delays = (sat2-sat1*1-8-1) + (sun2-sun1*1-8-1) +(mon2-mon1*1-8-1) + (tue2-tue1*1-8-1) + (wed2-wed1*1-8-1) + (thu2-thu1*1-8-1) print("person delays","no",c+1, "=",delays) c = c + 1
问题分析
- 核心错误:
input()返回的是字符串类型,直接用字符串做减法运算必然触发TypeError。而且这里不需要input(),应该直接用random.randint()生成数值类型的时间。 - 逻辑混乱:循环结构错误,变量定义在循环外导致重复赋值;周四的时间规则未正确实现(原代码周四下班时间固定13,但上班时间仍按8-12生成,不符合需求)。
- 计算逻辑模糊:原代码的延迟计算表达式
sat2-sat1*1-8-1逻辑不清晰,未明确正常工作时长基准。
解决方案
重构代码,用类和函数封装逻辑,严格遵循需求实现:
import random class EmployeeDelayCalculator: def __init__(self): self.working_days = ["周一", "周二", "周三", "周四", "周五"] self.total_employees = 20 def generate_work_time(self, day): """按规则生成当日上下班时间(单位:小时)""" if day == "周四": # 周四上下班均在8-13点区间 start = random.randint(8, 12) end = random.randint(start, 13) return start, end else: # 其他工作日:上班8-12点,下班13-17点 start = random.randint(8, 12) end = random.randint(13, 17) return start, end def calculate_daily_delay(self, start, end, normal_hours): """计算单日延迟时长(超过正常工作时长的部分)""" actual_work_hours = end - start return max(0, actual_work_hours - normal_hours) def get_weekly_total_delay(self): """计算单名员工每周总延迟时长""" total_delay = 0 for day in self.working_days: start, end = self.generate_work_time(day) # 周四正常工作基准为5小时,其他工作日为8小时 normal_hours = 5 if day == "周四" else 8 total_delay += self.calculate_daily_delay(start, end, normal_hours) return total_delay def calculate_all_employees(self): """为所有员工计算延迟并输出结果""" for emp_id in range(1, self.total_employees + 1): weekly_delay = self.get_weekly_total_delay() print(f"员工{emp_id} 每周总延迟时长:{weekly_delay}小时") # 执行计算流程 calculator = EmployeeDelayCalculator() calculator.calculate_all_employees()
重构优势
- 类封装逻辑,结构清晰,便于后续扩展或修改规则
- 拆分独立函数,职责单一,可读性强
- 严格实现周四的时间生成规则
- 所有变量均为数值类型,彻底避免字符串运算错误
- 明确正常工作时长基准,延迟计算逻辑清晰直白
内容的提问来源于stack exchange,提问作者Parviz tajdari
相关产品推荐
相关产品推荐

