展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > Python运算符新手实战与避坑指南

Python运算符新手实战与避坑指南

针对Python运算符新手常见误区,重点讲解算术运算中除法的浮点返回与整数除法区别、比较运算符的链式写法、赋值运算符的不可变与可变类型差异、成员检测中in与is的正确用法、位运算的实际应用场景以及浮点数精度陷阱规避方法,帮助读者避开90%的常见错误。

本文目录

    去年带过一个实习生,他写的代码里到处都是i = i + 1,我说你试试+=,他问我这俩有啥区别。后来发现,很多刚入门的同学对运算符的理解就停留在“加减乘除”这个层面,遇到is和==懵了,看到&和and更懵。

    Python运算符新手实战与避坑指南

    这篇文章不打算讲成手册式的东西,咱们就盯着新手最容易栽跟头的那些地方聊。你跟着敲一遍,基本就能避开90%的坑。

    一、算术运算与数值计算基础

    先来最熟悉的。Python里的算术运算符一共七个:+ - * / // % **。

    前三个不用讲,重点说后面四个。

    # 除法有三兄弟
    print(10 / 3)    # 3.3333333333333335  永远返回float
    print(10 // 3)   # 3                   向下取整
    print(10 % 3)    # 1                   取余数
    
    # 幂运算
    print(2 ** 10)   # 1024
    

    新手最容易在这翻车:10 / 2 返回的是 5.0,不是 5。如果你用这个结果去当列表索引,当场报错。

    # 错误示范
    lst = [1, 2, 3]
    idx = 6 / 3      # 2.0
    # print(lst[idx])  # TypeError: list indices must be integers or slices, not float
    
    # 正确做法:用 //
    idx = 6 // 3      # 2
    print(lst[idx])   # 3
    

    另外注意%在负数上的表现,它跟C语言不一样:

    print(-10 % 3)    # 2,不是-1
    print(10 % -3)    # -2
    

    规则是:结果的正负跟除数一致。这个特性在做循环队列的时候其实挺有用,但新手如果拿它做数学运算容易算错。

    二、比较判断与逻辑条件组合

    比较运算符返回布尔值:== != > < >= <=。

    这块没啥说的,但有个细节:Python支持链式比较,这是很多语言没有的。

    x = 5
    # 这种写法在其他语言里可能要写成 x > 3 and x < 10
    if 3 < x < 10:
        print("在区间内")
    

    链式比较不仅写着爽,执行效率也高,因为每个值只计算一次。

    逻辑运算符是 and or not,注意它们返回的不是布尔值,而是最后一个被求值的操作数:

    print(3 and 5)    # 5
    print(0 and 5)    # 0
    print(3 or 5)     # 3
    print(0 or 5)     # 5
    

    这个特性用好了很舒服,比如:

    name = input("输入名字: ") or "匿名用户"
    # 如果用户什么都没输,name就是"匿名用户"
    

    但新手建议先老老实实用布尔值,别花里胡哨,容易把自己绕晕。

    三、赋值技巧与链式操作写法

    基础赋值 = 没啥好说的,讲几个扩展的。

    增量赋值:+= -= *= /= 等等。

    count = 0
    count += 1   # 等价于 count = count + 1
    

    但有坑。对于不可变类型(整数、字符串、元组),+= 会创建新对象;对于可变类型(列表、字典),+= 是原地修改。

    # 列表的 +=
    a = [1, 2]
    b = a
    a += [3]
    print(b)      # [1, 2, 3]  b也跟着变了
    
    # 如果写成 a = a + [3],b不变,因为创建了新列表
    

    链式赋值:a = b = c = 0 三个变量指向同一个对象。对于整数没问题(不可变),但如果是列表就要小心了:

    # 错误示范
    a = b = []
    a.append(1)
    print(b)      # [1]  你本来可能只想要a变
    
    # 正确做法
    a = []
    b = []
    

    拆包赋值:

    x, y = 1, 2
    x, y = y, x    # 交换变量,不需要临时变量
    
    # 带星号的接收多余元素
    first, *rest = [1, 2, 3, 4]
    print(first)   # 1
    print(rest)    # [2, 3, 4]
    

    四、成员检测与身份验证方法

    成员运算符 in 和 not in,用来判断元素是否存在于序列或集合中。

    # 列表
    if "admin" in user_list:
        print("管理员已存在")
    
    # 字典默认检查key
    if "name" in user_dict:
        print(user_dict["name"])
    
    # 字符串
    if "abc" in "abcdef":
        print("包含")
    

    in 背后调用的是 __contains__ 方法,不同的数据结构查找效率天差地别。列表是O(n),集合和字典是O(1)。如果你要频繁做成员检测,把列表换成集合:

    # 慢
    valid_ids = [1, 2, 3, 4, 5, ...]   # 假设有10000个
    if id in valid_ids:                # 平均要查5000次
    
    # 快
    valid_ids = {1, 2, 3, 4, 5, ...}
    if id in valid_ids:                # 平均1次
    

    身份运算符 is 和 is not 比较的是内存地址,== 比较的是值。这是新手重灾区。

    a = [1, 2, 3]
    b = [1, 2, 3]
    print(a == b)    # True,内容一样
    print(a is b)    # False,不是同一个对象
    
    c = a
    print(c is a)    # True,指向同一个对象
    

    对于小整数(-5到256),Python做了缓存,所以:

    x = 256
    y = 256
    print(x is y)    # True(因为缓存了)
    
    x = 257
    y = 257
    print(x is y)    # False(没缓存,每次新建)
    

    经验法则:判断值是否相等用 ==,判断是不是同一个对象用 is。判断 None 永远用 is None。

    五、位运算原理及实际应用场景

    位运算符:& | ^ ~ << >>。新手看到位运算就发怵,但其实没那么可怕。

    先把十进制转成二进制看就清楚了:

    a = 0b1010   # 10
    b = 0b1100   # 12
    
    print(a & b)  # 0b1000 (8)  按位与:都是1才为1
    print(a | b)  # 0b1110 (14) 按位或:有1就为1
    print(a ^ b)  # 0b0110 (6)  按位异或:不同为1
    print(~a)     # -11         按位取反
    print(a << 1) # 0b10100 (20) 左移一位 = 乘以2
    print(a >> 1) # 0b0101 (5)   右移一位 = 除以2
    

    实际用到的地方:

    权限控制(最经典):

    READ = 1   # 0b001
    WRITE = 2  # 0b010
    EXEC = 4   # 0b100
    
    permission = READ | WRITE   # 0b011 = 3
    if permission & READ:       # 判断是否有读权限
        print("可以读")
    

    状态标志位:用一个整数存多个开关状态,省内存。

    快速乘除2的幂:x << n 比 x * 2**n 快得多(虽然现在编译器优化后差距不大了)。

    颜色处理:RGBA颜色拆通道:

    color = 0xFF336688
    r = (color >> 24) & 0xFF   # 255
    g = (color >> 16) & 0xFF   # 51
    b = (color >> 8) & 0xFF    # 102
    a = color & 0xFF           # 136
    

    日常业务开发可能用不到,但在写底层库、网络协议解析、算法优化的时候,位运算是绕不开的。

    六、运算符优先级与括号控制

    Python的运算符优先级从高到低大致是:

    1. () 括号
    2. ** 幂运算
    3. +x -x ~x 正负号、按位取反
    4. * / // %
    5. + -
    6. << >>
    7. &
    8. ^
    9. |
    10. == != > < >= <= is in
    11. not
    12. and
    13. or

    但是,没人会去背这个表。写了好几年Python,也只记住几个容易搞混的:

    # 容易翻车的
    if a == 1 and b == 2:   # 没问题
    if a == 1 & b == 2:     # 完蛋,&的优先级高于==,变成了 a == (1 & b) == 2
    

    还有这个经典陷阱:

    # 你想判断 a 不是 0 且不是 None
    if not a == 0 and a is not None:   # 实际解释为 (not a == 0) and (a is not None)
    # 没问题,但读起来费劲
    
    # 更清晰的写法
    if a != 0 and a is not None:
    

    建议:除了加减乘除和比较,其他情况一律加括号。多写几个括号不丢人,丢人的是括号写错了找半天bug。

    # 推荐
    result = (a + b) * (c - d)
    flag = (x > 0) and (y < 10) or (z == 0)
    

    七、综合案例:构建简易计算器

    把前面学的东西串起来,写个命令行计算器。

    import operator
    import re
    
    # 操作符映射到对应的函数
    OPERATORS = {
        '+': operator.add,
        '-': operator.sub,
        '*': operator.mul,
        '/': operator.truediv,
        '//': operator.floordiv,
        '%': operator.mod,
        '**': operator.pow,
    }
    
    def calculate(expr):
        """支持加减乘除、幂、取余、取整,也支持括号"""
        # 去除空格
        expr = expr.replace(' ', '')
        
        # 先处理括号(简易版,只支持一层括号)
        while '(' in expr:
            start = expr.rfind('(')  # 从最内层开始
            end = expr.find(')', start)
            if end == -1:
                raise ValueError("括号不匹配")
            inner = expr[start+1:end]
            result = _calc_no_parentheses(inner)
            expr = expr[:start] + str(result) + expr[end+1:]
        
        return _calc_no_parentheses(expr)
    
    def _calc_no_parentheses(expr):
        """计算不含括号的表达式"""
        # 处理幂运算(右结合,得从右往左)
        parts = expr.split('**')
        if len(parts) > 1:
            # 简单处理:只支持两个数的幂
            # 实际上还需要处理更复杂的,这里演示用
            left = _calc_mul_div(parts[0])
            right = _calc_mul_div(parts[1])
            return left ** right
        
        return _calc_mul_div(expr)
    
    def _calc_mul_div(expr):
        """处理乘除取余取整"""
        # 先按加减法分割,分别计算乘除部分
        # 用正则分割保留操作符
        tokens = re.split(r'([+-])', expr)
        result = 0
        current_op = '+'
        for token in tokens:
            if token in '+-':
                current_op = token
                continue
            if token == '':
                continue
            val = _calc_mul_div_single(token)
            if current_op == '+':
                result += val
            else:
                result -= val
        return result
    
    def _calc_mul_div_single(expr):
        """计算单个乘除项"""
        # 按 */ // % 分割
        # 这里简化实现,只演示思路
        # 实际完整实现需要处理优先级和左结合
        if '//' in expr:
            left, right = expr.split('//')
            return float(left) // float(right)
        if '%' in expr:
            left, right = expr.split('%')
            return float(left) % float(right)
        if '*' in expr:
            left, right = expr.split('*')
            return float(left) * float(right)
        if '/' in expr:
            left, right = expr.split('/')
            return float(left) / float(right)
        return float(expr)
    
    # 使用
    if __name__ == '__main__':
        while True:
            try:
                expr = input(">>> ")
                if expr.lower() in ('q', 'quit', 'exit'):
                    break
                result = calculate(expr)
                print(f"= {result}")
            except Exception as e:
                print(f"出错了: {e}")
    

    这个计算器很简陋,但已经用到了算术、比较(判断操作符)、赋值、成员检测(in)等知识点。你可以试着完善它,比如支持更多层括号、支持负数等。

    八、常见类型错误与排查思路

    新手用运算符最常见的几类错误:

    1. TypeError: unsupported operand type(s)

    # 字符串和数字不能相加
    print("1" + 1)   # TypeError
    
    # 修复
    print(int("1") + 1)   # 2
    print("1" + str(1))   # "11"
    

    2. TypeError: can't multiply sequence by non-int

    print("abc" * 3)     # "abcabcabc"  这个可以
    print("abc" * 1.5)   # TypeError    不能乘浮点数
    

    3. 字典的 in 只检查 key

    d = {"name": "张三", "age": 18}
    print("张三" in d)        # False,检查的是key,不是value
    print("name" in d)        # True
    

    4. 列表和元组傻傻分不清

    # 以为 (1) 是元组,其实是整数
    t = (1)
    print(type(t))   # 
    
    # 正确写法
    t = (1,)
    print(type(t))   # 
    

    排查思路:

    • 看到 TypeError,先打印出变量的类型:print(type(x))
    • 看到 ValueError,打印出变量的值:print(x)
    • 不确定运算符行为的时候,在交互式环境(python shell)里快速测试

    九、浮点数精度陷阱与规避方案

    这是个老生常谈但永远有人踩的坑。

    print(0.1 + 0.2)   # 0.30000000000000004
    print(0.3 == 0.1 + 0.2)   # False
    

    原因:0.1 在二进制里是无限循环小数,计算机只能近似存储。

    规避方案:

    方案一:用 round() 控制精度

    result = 0.1 + 0.2
    if round(result, 10) == 0.3:
        print("相等")
    

    方案二:用 decimal.Decimal 做精确计算

    from decimal import Decimal
    print(Decimal('0.1') + Decimal('0.2'))   # 0.3
    # 注意一定要传字符串,传浮点数等于没传
    

    方案三:比较时用误差范围

    def is_close(a, b, eps=1e-9):
        return abs(a - b) < eps
    
    print(is_close(0.1 + 0.2, 0.3))   # True
    

    金额计算千万别用浮点数,用Decimal或者以分为单位存整数。

    十、代码规范与可读性优化建议

    运算符相关的代码规范,照着 PEP 8 来就行:

    1. 二元运算符两边加空格

    # 好
    x = 1
    y = x + 2
    
    # 不好
    x=1
    y=x+2
    

    2. 优先级高的运算符可以不加空格

    # 可以
    result = a*b + c*d
    
    # 但更推荐统一加空格,更清晰
    result = a * b + c * d
    

    3. 等号在关键字参数和默认值两边不加空格

    # 好
    def func(name, age=18):
        pass
    
    # 不好
    def func(name, age = 18):
        pass
    

    4. 比较运算连写时保持一致性

    # 好
    if x > 0 and x < 100:
        pass
    
    # 更好(利用链式比较)
    if 0 < x < 100:
        pass
    

    5. 避免过长的链式调用

    # 容易看晕
    if a == 1 and b == 2 or c == 3 and d == 4 or e == 5:
        pass
    
    # 拆开或者加括号
    cond1 = a == 1 and b == 2
    cond2 = c == 3 and d == 4
    if cond1 or cond2 or e == 5:
        pass
    

    6. 用 in 替代多个 or 比较

    # 不好
    if x == 1 or x == 2 or x == 3 or x == 4:
        pass
    
    # 好
    if x in (1, 2, 3, 4):
        pass
    

    最后说两句

    运算符是Python最基础的东西,但基础不等于简单。见过写了两年Python的人还在用 type(x) == int 而不是 isinstance(x, int),也见过到处用 + 拼字符串而不是用 join。

    这篇文章覆盖了新手最容易遇到的问题,但光看没用,你得打开编辑器一个个敲一遍。特别是位运算和浮点数那两块,自己改改数值看看输出,印象会深很多。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirServer Windows版
    AirServer Windows版

    AirServer Windows版可把电脑变成AirPlay、Google Cast和Miracast无线投屏接收端,适合会议演示、课堂教学及家庭大屏分享。发送设备通常无需另装客户端,并可同时接收和智能排列多个镜像会话。