You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

  1. 核心错误:input()返回的是字符串类型,直接用字符串做减法运算必然触发TypeError。而且这里不需要input(),应该直接用random.randint()生成数值类型的时间。
  2. 逻辑混乱:循环结构错误,变量定义在循环外导致重复赋值;周四的时间规则未正确实现(原代码周四下班时间固定13,但上班时间仍按8-12生成,不符合需求)。
  3. 计算逻辑模糊:原代码的延迟计算表达式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:55:22