Python高级特性

推导式

  • 什么是推导式

    • 是一种独特的数据处理方式,从一个数据序列构建另一个新的数据序列的结构体。
    • 是一种强大且简洁的语法,适用于生成列表、字典、集合和生成器。
    • 使用推导式时,需要注意可读性,尽量保持表达式简洁,以免影响代码的可读性和可维护性。
    • Python 支持多种推导式
      • 列表 (list) 推导式
      • 字典 (dict) 推导式
      • 集合 (set) 推导式
      • 元组 (tuple) 推导式
  • 列表推导式(List Comprehensions)

    • 核心作用

      • 快速创建列表,替代传统 for 循环,具有简洁高效的特点。
      • 用于从一个现有的列表创建一个新列表,使用一行代码即可实现循环或条件逻辑,生成新的 List 列表。
    • 基础语法:expression for item in iterable

      • 例:生成 1 - 10 的平方列表

        python 复制代码
        squares = [x**2 for x in range(1, 11)]
        print(squares)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    • 条件过滤语法:new_list = expression for item in iterable if condition

      • 等价于

        python 复制代码
        new_list = []
        for item in iterable:
            if condition:
                new_list.append(expression)
    • 参数说明

      • iterable 参数:一个现有的列表,可以迭代的对象,比如列表、元组、字符串等。
      • condition 参数
        • 可选条件表达式,用于过滤 iterable 中的元素。
        • iterable 列表中只有满足该条件的元素,才会被作为 item 参与 expression 表达式计算。
      • item 参数
        • 如果没有 condition 参数,那 item 就是 iterable 列表中的每一个元素。
        • 如果有 condition 参数,那么 item 就是 iterable 列表中符合 condition 条件的元素。
      • expression 参数:item 参与计算的表达式,其中有 item 变量。
    • 例:筛选偶数

      scss 复制代码
      ```python
      evens = [x for x in range(10) if x % 2 == 0]
      print(evens)  # [0, 2, 4, 5, 6, 7, 8]
      ```

      这里range(20) 生成一个包含 0 到 19 的可迭代对象,if x % 2 == 0 作为条件,筛选出其中能被 2 整除(即偶数 )的元素x ,并将这些元素组成新列表evens

    • 例:数值转换

      python 复制代码
      nums = [1, -2, 3, 0]
      abs_nums = [x if x >= 0 else -x for x in nums]
      print(abs_nums)  # [1, 2, 3, 0]

      对于列表nums 中的每个元素x ,判断其是否大于等于 0。若x >= 0 ,则新列表abs_nums 中对应元素就是x 本身;若x < 0 ,则新列表中对应元素为-x (即x 的绝对值 ),最终得到包含原列表元素绝对值的新列表abs_nums

  • 字典推导式

    • 语法结构详解:{ 键表达式:值表达式 for 循环变量 in 可迭代对象 if 条件 }
    • 注意
      • 键必须唯一且不可变
      • 值可以是任意类型
    • 例:
      • 键值转换

        python 复制代码
        original = {'a': 1, 'b': 2, 'c': 3}
        reversed_dict = {v: k for k, v in original.items()}
        print(reversed_dict)  # {1: 'a', 2: 'b', 3: 'c'}
      • 复杂数据重组

        python 复制代码
        students = [
            {'name': 'Steven Wong','math': 80},
            {'name': 'Coco','math': 90},
            {'name': 'John','math': 100}
        ]
        # 创建学科分数字典
        math_scores = {stu['name']: stu['math'] for stu in students}
        print(math_scores)  # {'Steven Wong':80, 'Coco':90, 'John':100}
  • 集合推导式

    • 语法结构详解:{表达式 for 循环变量 in 可迭代对象 if 条件 }

    • 注意

      • 自动去重
      • 元素无序
      • 元素必须可哈希
    • 案例:

      python 复制代码
      nums = [1, 2, 2, 3, 3, 3]
      squared_set = {num ** 2 for num in nums}
      print(squared_set)  # {1, 4, 9}

迭代器

  • 什么是迭代器

    • 访问集合元素的一种方式,可以记住遍历的位置的对象,和 Java 里面的集合的迭代器 Iterator 一样。
    • 核心是通过某种方式(通常使用循环)访问集合元素的过程。
    • 作用
      • 在处理大数据集时,迭代器可以节省内存。
      • 迭代器提供了一种统一的遍历方式,适用于各种数据结构。
  • 迭代器对象和可迭代对象

    • 可迭代对象:实现了__iter__()方法的对象。

    • 迭代器对象:实现了__iter__()和__next__()方法的对象称为迭代器对象。

    • 通过定义可以知道,迭代器对象一定是可迭代对象。

    • 简单解释两个方法

      • __iter__():要返回一个迭代器对象,可以使用iter()函数触发。
      • __next__():用于从迭代器中返回下一个值,如果没有可返回值,抛出StopIteration异常,用next()函数来触发它。
    • 常见可迭代对象:列表、元组、字符串、字典、集合、文件对象、生成器

    • 验证可迭代对象

      python 复制代码
      # isinstance(object, classinfo) 判断一个对象是否为指定类型或指定类型的子类
      # 使用元组传递多个类型,如果对象是其中任意一个类型的实例,则返回 'True'。
      from collections.abc import Iterable
      print(isinstance("abc", Iterable))  # True
      print(isinstance(123, Iterable))  # False
      print(isinstance([1,2,3], Iterable))  # True
      print(isinstance(123, (int, str)))  # 输出: True
  • 迭代器对象遍历(记录当前迭代位置,只能向前不能后退)

    • 使用常规 for 语句进行遍历

      python 复制代码
      list = [1, 2, 3, 4, 5]
      it = iter(list)  # 创建迭代器对象
  • 生成器

    • 使用了yield的函数被称为生成器(generator),是一种特殊的迭代器,使用yield关键字来返回值。
    • yield是一个关键字,用于定义生成器函数,是一种特殊的函数,在迭代过程中逐步产生值,而不是一次性返回所有结果。
    • 生成器函数在每次调用next()时执行,直到遇到yield语句。

Lambda 函数

  • 什么是 Lambda 函数

    • 定义:Lambda 函数是匿名的小型函数,用于简化简单函数的定义。

    • 语法:lambda 参数:表达式

    • 无名称:无需 def 关键字定义。

    • 单行表达式:只能包含一个表达式,不能有代码块或复杂逻辑;可以设置多个参数,参数使用逗号隔开

      python 复制代码
      # 加法函数
      add = lambda a, b: a + b
      print(add(1, 2))  # 3
      
      # 平方函数
      square = lambda x: x**2
      print(square(2))  # 4
      
      # 作为函数参数传递
      def operate(func, a, b):
          return func(a, b)
      
      result = operate(lambda x, y: x * y, 2, 3)
      print(result)  # 6
  • Lambda 与普通函数的对比

特性 Lambda 函数 普通函数(def)
名称 匿名 需命名
代码量 单行 可多行
适用场景 简单逻辑(如表达式计算) 复杂逻辑(如循环、条件嵌套)
返回值 自动返回表达式结果 需显式 return
  • Lambda + map/filter 与列表推导式对比
场景 Lambda + map/filter 列表推导式
简单转换 / 过滤 可读性较低 更简洁直观
函数作为参数传递 必须使用 Lambda 无法直接替代
性能 相近(但生成器更节省内存) 相近
  • 例:筛选偶数并平方

    ini 复制代码
    numbers = [1, 2, 3, 4, 5]
    
    # Lambda + map/filter
    result1 = list(map(lambda x: x**2, filter(lambda x: x%2==0, numbers)))
    
    # 列表推导式
    result2 = [x**2 for x in numbers if x%2 == 0]
    
    print(result1, result2)  # [4, 16] [4, 16]

#高阶函数

  • 什么是高阶函数

    • 满足以下任一条件的函数
      • 接收函数作为参数
      • 返回函数作为结果
    • 优势
      • 代码简洁:通过组合函数减少重复代码。
      • 功能灵活:动态指定处理逻辑
    • 组合应用
      • lambda 函数通常与内置高阶函数如 map ()、filter () 和 reduce () 一起使用,在集合上执行操作
  • 常用高阶函数详解

    • map(func, iterable)

      • 功能:对可迭代对象的每个元素应用 func,返回迭代器。

      • 例:将列表元素平方

        python 复制代码
        numbers = [1, 2, 3, 4, 5]
        squared = map(lambda x: x**2, numbers)
        print(list(squared))  # [1, 4, 9, 16, 25]

        对比列表推导式

        python 复制代码
        squared = [x**2 for x in numbers]
    • filter(func, iterable)

      • 功能:筛选满足 func 条件为 True 的元素,返回迭代器。

      • 示例:过滤偶数

        python 复制代码
        even = filter(lambda x: x % 2 == 0, numbers)
        print(list(even))  # [2, 4]

        对比生成器表达式

        python 复制代码
        even = (x for x in numbers if x % 2 == 0)  # 惰性计算,节省内存
    • 字典合并(使用 reduce)

      python 复制代码
      from functools import reduce
      
      dicts = [{"a": 1}, {"b": 2}, {"a": 3, "c": 4}]
      merged = reduce(lambda d1, d2: {**d1, **d2}, dicts)
      print(merged)  # {'a':3, 'b':2, 'c':4}
相关推荐
用户872185012431 小时前
港股投资者必备:三大数据源对比,哪种最适合实时行情与回测?
python
溪语流沙2 小时前
【Web全栈进阶】Alembic数据库迁移:改表结构不再删库
前端·数据库·python·elasticsearch·postgresql
Evan_Lai2 小时前
(一)独热编码、标签编码、目标编码、序数编码详解
python·机器学习
用户7624117567052 小时前
第二章 Python语言基础
python
129Lab2 小时前
BMS 核心算法:SOC 估算从安时积分到 LSTM-UKF 串级融合的 30 年演进(附 Python 实现)
python·算法·lstm·python3.11·bms·soc估算
129Lab2 小时前
电池热管理仿真的AI加速:用Python+PINN物理信息神经网络替代传统CFD的可行性探索
pytorch·python·cfd·pinn·物理信息神经网络·仿真加速·电池热管理
用户298698530142 小时前
Python 中 HTML 转 PDF 的实现方法
python·html·api
答案是你2 小时前
YOLOE 开放词汇检测 + ONNX / TensorRT 推理,开源了!
python·深度学习·yolo·目标检测·计算机视觉·视觉检测
2601_962885723 小时前
AlphaFeed 支持哪些 K 线周期?period参数怎么传?
前端·数据库·python