当前位置: 首页 > news >正文

Python的几个高级特性

引言

Python是一种功能强大的编程语言,它简洁的语法和强大的库支持使其成为数据科学和机器学习领域的热门选择。在Python的高级特性中,生成器、迭代器、闭包、装饰器和内置高阶函数是实现高效、优雅代码的关键。本文将逐一介绍这些特性,并提供实例代码,帮助读者更好地理解和应用这些高级特性。

1. 生成器

列表生成式

列表生成式是Python提供的一种生成列表的简洁形式,可以快速生成一个新的列表。基本语法格式如下:

  • 普通格式:[exp for iter_var in iterable]
  • 带过滤功能:[exp for iter_var in iterable if exp]
  • 循环嵌套:[exp for iter_var_A in iterable_A for iter_var_B in iterable_B]

实例:

  1. 生成2n+1的数字列表,n从3到11。

    [n for n in range(3, 12) if (n % 2 == 1)]
    
  2. 求半径r为1到10的圆的面积和周长。

    [(2 * r * 3.14159, 3.14159 * r ** 2) for r in range(1, 11)]
    
  3. 找出1~100之间的所有质数。

    [n for n in range(2, 101) if all(n % i != 0 for i in range(2, int(n ** 0.5) + 1))]
    

生成器

生成器是一种在Python中一边循环一边计算的机制,它在迭代过程中节省内存,因为不需要一次性将所有数据加载到内存中。

创建生成器:

  • 列表生成式的改写:将[]改为().
  • 使用yield关键字。

打印生成器的每一个元素:

  • 通过for循环。
  • 使用next()函数。

生成器的特点:

  1. 节约内存。
  2. 迭代到下一次的调用时,所使用的参数都是第一次所保留下的。

应用案例:

  • 斐波那契数列
  • 聊天机器人
  • 生产者-消费者模型
  • 求平均值

2. 迭代器

迭代器是一个可以记住遍历的位置的对象,它从集合的第一个元素开始访问,直到所有元素被访问完结束。

迭代器和生成器的区别:

  • 生成器是迭代器的一种,但不是所有迭代器都是生成器。
  • 生成器是惰性计算的,而迭代器可以是提前计算的。

创建迭代器:

使用iter()函数将可迭代对象(如list、dict、str)转换成迭代器。

3. 闭包

闭包是当一个函数记住了其外部函数的临时变量,并返回该内部函数的引用时形成的一种结构。

闭包的用途:

  • 提高代码可复用性。
  • 常用于装饰器。

闭包的创建:

  • 内部函数引用外部函数的变量。

4. 装饰器

装饰器本质上是一个函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能。

装饰器的应用场景:

  • 引入日志
  • 函数执行时间统计
  • 权限校验
  • 缓存

装饰器的示例:

  • 无参数的函数
  • 有参数的函数
  • 有可变参数和关键字参数的函数
  • 被多个装饰器装饰的函数

5. 内置高阶函数

高阶函数是函数式编程的核心,它允许把函数本身作为参数传入另一个函数,或返回一个函数。

常见的内置高阶函数:

  • map():对指定序列做映射。
  • filter():过滤序列。
  • reduce():对序列中的元素进行累积。
  • sorted():排序。
  • max()/min():求最大值/最小值。

实例:

  1. 对序列每个元素求绝对值。

    map(abs, [-1, -2, 3, 4])
    
  2. 对1~100之间的数字求阶乘。

    def factorial(n):if n == 0:return 1else:return n * factorial(n-1)map(factorial, range(1, 101))
    

结语

Python的高级特性为编写高效、优雅的代码提供了强大的工具。掌握生成器、迭代器、闭包、装饰器和内置高阶函数,将极大地提升你的编程能力。希望本文能帮助你更好地理解和应用这些特性。

http://www.lryc.cn/news/454592.html

相关文章:

  • 【颜色平衡树 / E】
  • 滑动窗口--(中篇)
  • Java性能调优:实战技巧与最佳实践
  • 排版套料系统设计说明
  • 算法修炼之路之二分查找
  • OpenAI预计明年将推出“代理”系统
  • 每日OJ题_牛客_重排字符串_贪心_C++_Java
  • Python 进阶部分详细整理
  • [ RK3566-Android11 ] 关于移植 RK628F 驱动以及后HDMI-IN图像延迟/无声等问题
  • 【黑马点评】 使用RabbitMQ实现消息队列——2.使用RabbitMQ监听秒杀下单
  • 业务封装与映射 -- OTUk/ODUk/OPUk开销帧结构
  • Vim基本用法
  • python 实现Tarjan 用于在有向图中查找强连通分量的算法
  • Qt开发技巧(十五)字符串去除空格,跨网段搜索不生效,设置图片显示失败问题,表格视图的批量删除,主动判断字串编码,开启向前查询的属性,画家类载入html来绘制
  • 【机器学习】智驭未来:探索机器学习在食品生产中的革新之路
  • Ubuntu 安装CUDA并使用Docker配置Pytorch环境
  • 【论文阅读】Simulating 500 million years of evolution with a language model
  • detectron2/layers源码笔记
  • LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱
  • React基础-快速梳理
  • H.264编解码 - NALU详解
  • vSAN02:容错、存储策略、文件服务、快照与备份、iSCSI
  • 图解C#高级教程(四):协变、逆变
  • 详解CSS中的伪元素
  • paper_template
  • 【Bug】解决 Ubuntu 中 “error: Unable to Find Python3 Executable” 错误
  • CUDA与TensorRT学习六:模型部署-CNN、模型部署-YOLOv8检测器、部署BEVFusion模型
  • 防sql注入的网站登录系统设计与实现
  • 如何快速切换电脑的ip地址
  • 鸿蒙HarmonyOS之选择相册文件(照片/视频)方法