欢迎光临
我们一直在努力

第6篇_Python高级语法与标准库精髓:从会用到达精通

前言

在前五篇博客中,我们从零开始,建立了一套完整的 Python 编程知识体系:

  • 第1篇:搭建环境,写下第一行代码,理解变量与基础语法
  • 第2篇:掌握数据类型与运算符,建立 “数据” 的认知
  • 第3篇:掌握条件语句、循环、函数,建立"逻辑"的认知
  • 第4篇:深入面向对象编程,建立"结构"的认知
  • 第5篇:文件操作与异常处理,掌握程序与外界交互的能力

本篇是进阶篇,我们将深入 Python 真正精华的部分 —— 那些让代码变得更简洁、更高效、更强大的语法和工具。学完本篇,你将从 “会写 Python” 迈向 “精通 Python”。

本篇涵盖六大主题:

  • 列表推导式与字典推导式:一行代码生成复杂数据结构
  • 生成器与迭代器:优雅处理海量数据,内存零压力
  • 装饰器:不修改原函数,给它添加新功能(AOP 思想)
  • 闭包:函数背后的"记忆"能力
  • 正则表达式:用 pattern 精准匹配一切文字
  • 高阶标准库:collections、itertools、functools 高级用法
  • 准备好了吗?让我们开始!🚀

    一、列表推导式与字典推导式:一行代码的威力

    1.1、从一个问题开始

    假设你有一个列表,里面存放了 10 个学生的分数:

    scores = [85, 90, 78, 92, 88, 76, 95, 89, 83, 91]

    现在你需要把每个分数都加上 5 分(如果有超过 100 分的,按 100 计),然后挑出所有大于等于 90 分的分数。

    传统写法(过程式):

    # 第1步:给每个分数加5,但不超过100
    adjusted = []
    for score in scores:
    new_score = score + 5
    if new_score > 100:
    new_score = 100
    adjusted.append(new_score)

    # 第2步:挑出 >= 90 的分数
    passed = []
    for score in adjusted:
    if score >= 90:
    passed.append(score)

    print(passed) # [95, 97, 100, 94]

    这段代码逻辑清晰,但有两个问题:

  • 代码冗长:总共 8 行,而实际逻辑只有两句话
  • 变量名泛滥:adjusted、new_score、passed……临时变量越造越多
  • 列表推导式写法:

    scores = [85, 90, 78, 92, 88, 76, 95, 89, 83, 91]
    passed = [min(score + 5, 100) for score in scores if score + 5 >= 90]
    print(passed) # [95, 97, 100, 94]

    一行搞定。这行代码的含义:

    for score in scores → 遍历原始列表
    if score + 5 >= 90 → 过滤条件
    min(score + 5, 100) → 转换逻辑(加5,不超过100)

    1.2、列表推导式的基本语法

    列表推导式(List Comprehension)是 Python 提供的一种紧凑的列表创建语法。

    基本格式:

    # 语法:[表达式 for 变量 in 可迭代对象]
    # 例:把 0~9 的每个数平方,生成新列表
    squares = [x ** 2 for x in range(10)]
    print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    带条件过滤:

    # 语法:[表达式 for 变量 in 可迭代对象 if 条件]
    # 例:挑出偶数的平方
    even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
    print(even_squares) # [0, 4, 16, 36, 64]

    逐行解析:

    组成部分含义
    [x ** 2 for x in range(10)] 外层方括号表示 “生成一个新列表”
    x ** 2 列表中每个元素的生成方式(表达式)
    for x in range(10) 遍历 range(10),每次把当前元素绑定到 x
    if x % 2 == 0 可选:只处理满足条件的元素

    1.3、多个条件的组合

    # 多个 if 条件:相当于 and
    result = [x for x in range(100) if x % 3 == 0 if x % 5 == 0]
    # 同时能被3和5整除(就是能被15整除)的数: [0, 15, 30, 45, 60, 75, 90]

    # if…else 在表达式里:三元表达式
    # 语法: [expr_if_true if condition else expr_if_false for …]
    labeled = ['偶数' if x % 2 == 0 else '奇数' for x in range(5)]
    print(labeled) # ['偶数', '奇数', '偶数', '奇数', '偶数']

    注意区分:if condition(过滤)和 if…else…(三元)的位置不同:

    # ❌ 错误写法:if 在表达式后面会变成三元表达式,不会过滤
    result = [x * 2 if x > 5 for x in range(10)] # SyntaxError!

    # ✅ 正确写法:过滤用 if 在 for 后面,三元用 if 在表达式里
    result = [x * 2 for x in range(10) if x > 5] # 过滤
    result = [x * 2 if x > 5 else 0 for x in range(10)] # 三元

    1.4、双重循环与二维列表

    列表推导式还支持双重循环,可以用于展平二维列表(矩阵):

    # 把 3×3 矩阵展平为一维列表
    matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
    ]

    # 语法:for 外层 in … for 内层 in …
    flattened = [item for row in matrix for item in row]
    print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

    逐行解析:

    • for row in matrix:外层循环遍历每一行
    • for item in row:内层循环遍历行里的每个元素
    • item:直接输出每个数字(不是行)

    1.5、字典推导式

    字典推导式(Dict Comprehension)的语法与列表推导式类似,只是用花括号 {},并且每个元素是一个 key: value 对:

    # 把一个列表的每个元素作为 key,元素长度作为 value
    words = ['apple', 'banana', 'cherry', 'date']
    word_lengths = {word: len(word) for word in words}
    print(word_lengths)
    # {'apple': 5, 'banana': 6, 'cherry': 6, 'date': 4}

    实战:统计字符串中每个字符出现的次数:

    text = "hello python"
    char_count = {ch: text.count(ch) for ch in set(text)}
    print(char_count)
    # {'h': 2, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'p': 1, 'y': 1, 't': 1, 'n': 1}

    💡 性能提示:上面这个例子中,set(text) 去掉了重复字符,这样 text.count(ch) 就不用重复统计相同的字符。如果直接 for ch in text 并用 char_count[ch] += 1 统计,逻辑相同但字典推导式的写法更简洁。

    1.6、集合推导式

    类似的,还有集合推导式(Set Comprehension),用 {} 但只放单个元素(自动去重):

    # 从列表中提取所有不重复的单词长度
    words = ['apple', 'banana', 'apricot', 'blueberry', 'cherry']
    lengths = {len(word) for word in words}
    print(lengths) # {5, 6, 9}

    1.7、推导式 vs 普通循环:该用哪个?

    列表推导式不是银弹,以下是选择建议:

    场景推荐方式原因
    简单的映射/过滤转换 列表推导式 一行搞定,简洁直观
    复杂的逻辑(超过 3 层) 普通循环 可读性更重要
    需要调试中间步骤 普通循环 推导式中间步骤无法打断点
    处理大文件(百万级元素) 生成器(后面讲) 推导式会一次性生成整个列表,占内存

    二、生成器与迭代器:优雅处理海量数据

    赞(0)
    未经允许不得转载:171主机测评 » 第6篇_Python高级语法与标准库精髓:从会用到达精通
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址