【Python】已解决TypeError: unsupported operand type(s) for ...报错方案合集

在这里插入图片描述

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。优快云全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。
🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。
🌼 同时洲洲已经建立了程序员技术交流群,如果您感兴趣,可以私信我加入社群,可以直接vx联系(文末有名片)v:bdizztt
🖥 随时欢迎您跟我沟通,一起交流,一起成长、进步!点此也可获得联系方式~

前言

在Python编程中,TypeError 通常表示在执行操作时使用了不兼容的数据类型。本文将通过一个具体的错误示例——TypeError: unsupported operand type(s) for *: ‘int’ and ‘NoneType’——来分析问题背景、可能出错的原因、提供错误代码示例和正确代码示例,并给出一些注意事项。

TypeError 错误发生在尝试对不支持的操作符使用不兼容的数据类型时。例如,当你尝试将整数与None类型进行乘法操作时,就会遇到这种错误。

在这里插入图片描述

一、可能的错误原因

  • 变量未初始化:在使用变量之前,可能忘记对其进行初始化,导致其为None。
  • 函数返回值:调用的函数可能在某些条件下返回None,而调用者未进行适当的检查。
  • 错误的类型转换:在类型转换过程中可能产生了错误,导致期望的整数类型变成了None。
  • 逻辑错误:在条件判断或循环中可能存在逻辑错误,导致在不应该使用None的地方使用了它。

二、错误代码示例

假设我们有一个函数,它根据条件返回一个整数或None。

def get_value(condition):
    # 根据条件返回整数或None
    if condition:
        return 10
    else:
        return None

# 错误使用
value = get_value(False)  # 返回None
result = 5 * value  # 这里会抛出TypeError,因为value是None

或者不支持的操作符和类型,比如尝试对不支持的操作数类型执行操作。例如,字符串和整数之间的减法操作。

result = "hello" - 1
# 修正
result = "hello" + str(1)

还比如,数组和标量相乘:尝试对列表和标量直接执行乘法操作。

result = [1, 2, 3] * 1.5
# 修正
result = [1, 2, 3] * 2

最后就是常见的字典错误了:试图对字典执行算术操作,例如加、减、乘、除。

data = {"a": 1, "b": 2}
result = data + 2
# 修正
result = {key: value + 2 for key, value in data.items()}

三、解决方案

方案一:检查变量是否为None

def get_value(condition):
    if condition:
        return 10
    else:
        return None

value = get_value(False)
if value is not None:
    result = 5 * value  # 安全的乘法操作
else:
    print("Value is None, cannot perform multiplication.")

方案二:使用异常处理

def get_value(condition):
    if condition:
        return 10
    else:
        return None

try:
    value = get_value(False)
    result = 5 * value  # 尝试乘法操作
except TypeError as e:
    print(f"An error occurred: {e}")  # 捕获并打印错误信息

方案三:提供默认值

def get_value(condition):
    if condition:
        return 10
    else:
        return None

value = get_value(False) or 1  # 如果value为None,则使用1作为默认值
result = 5 * value  # 即使value为None,这里也不会抛出TypeError

方案四:检查操作数类型

在执行操作前,添加类型检查,确保操作数类型符合预期。

def add_numbers(a, b):
    if not isinstance(a, (int, float)):
        raise TypeError("Expected int or float, got {}".format(type(a)))
    if not isinstance(b, (int, float)):
        raise TypeError("Expected int or float, got {}".format(type(b)))
    return a + b

总结

📝Hello,各位看官老爷们好,我已经建立了优快云技术交流群,如果你很感兴趣,可以私信我加入我的社群。

📝社群中不定时会有很多活动,例如每周都会包邮免费送一些技术书籍及精美礼品、学习资料分享、大厂面经分享、技术讨论谈等等。

📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、机器学习、自媒体副业交流、前沿科技文章分享、论文精读等等。

📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个大佬!

📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您点击下方的链接直接加入到我的交流社群!~ 跳转链接社区~

在这里插入图片描述

根据你提供的代码,虽然没有明确指出 `TypeError: unsupported operand type(s) for +: 'dict' and 'dict'` 具体报错位置,但推测可能出现在 `compute_COM` 函数中,尤其是在使用 `np.mean` 函数计算躯干质心时,如果 `points` 字典中的值是缺失值或者不是有效的可计算的数组类型,可能会引发错误。以下是具体分析和修改建议: #### 代码问题分析 在 `compute_COM` 函数中,有以下代码: ```python trunk = np.mean([points[11], points[12], points[23], points[24]], axis=0) ``` 如果 `points` 字典中的值是 `NaN` 或者其他无效类型,`np.mean` 函数在计算时可能会出错。另外,在读取 Excel 数据时,如果存在缺失值,也会导致后续计算出现问题。 #### 修改后的代码 ```python import numpy as np import pandas as pd # 读取数据 data = pd.read_excel('运动者1的跳远位置信息1.xlsx') df = pd.DataFrame(data) def segment_center(p1, p2, ratio=0.43): """计算身体段的质心位置 (p1→p2之间某比例点)""" if p1 is None or p2 is None: return (0, 0) return (p1[0] + ratio*(p2[0]-p1[0]), p1[1] + ratio*(p2[1]-p1[1])) def compute_COM(points): segments = [] # 躯干 trunk_points = [points.get(i, (0, 0)) for i in [11, 12, 23, 24]] trunk = np.mean(trunk_points, axis=0) segments.append((0.43, trunk)) # 躯干 43% # 头部 head = points.get(0, (0,0)) # 用鼻尖近似,若无则为(0,0) segments.append((0.08, head)) # 头颈 8% # 上肢 for (shoulder, elbow, wrist, hand_ids) in [(11,13,15,[17,19,21]), (12,14,16,[18,20,22])]: upper_arm = segment_center(points.get(shoulder, (0, 0)), points.get(elbow, (0, 0)), 0.43) segments.append((0.027, upper_arm)) forearm = segment_center(points.get(elbow, (0, 0)), points.get(wrist, (0, 0)), 0.43) segments.append((0.016, forearm)) hand = points.get(wrist, (0, 0)) # 简化为腕点 segments.append((0.006, hand)) # 下肢 for (hip, knee, ankle, toe_ids) in [(23,25,27,[29,31]), (24,26,28,[30,32])]: thigh = segment_center(points.get(hip, (0, 0)), points.get(knee, (0, 0)), 0.43) segments.append((0.10, thigh)) shank = segment_center(points.get(knee, (0, 0)), points.get(ankle, (0, 0)), 0.43) segments.append((0.045, shank)) foot = segment_center(points.get(ankle, (0, 0)), points.get(toe_ids[0], (0, 0)), 0.5) segments.append((0.014, foot)) # 计算整体质心 total_mass = sum(w for w,_ in segments) x_com = sum(w*p[0] for w,p in segments) / total_mass y_com = sum(w*p[1] for w,p in segments) / total_mass return x_com, y_com frames_dict_list = [] for idx, row in df.iterrows(): points = {} for i in range(33): # 0~32 x_col = f"{i}_X" y_col = f"{i}_Y" if x_col in df.columns and y_col in df.columns: x_val = row[x_col] y_val = row[y_col] if pd.notna(x_val) and pd.notna(y_val): points[i] = (x_val, y_val) else: points[i] = None frames_dict_list.append(points) # 计算每一帧的质心 com_list = [] for points in frames_dict_list: com = compute_COM(points) com_list.append(com) print(com_list) ``` #### 代码解释 1. **处理缺失值**:在读取 Excel 数据时,使用 `pd.notna` 函数检查每个值是否为缺失值,如果是则将对应点设为 `None`。 2. **避免无效计算**:在 `segment_center` 函数中,添加了对 `p1` 和 `p2` 是否为 `None` 的检查,如果是则返回 `(0, 0)`。 3. **确保数据有效性**:在 `compute_COM` 函数中,使用 `points.get` 方法获取每个点的值,如果点不存在则默认为 `(0, 0)`。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员洲洲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值