python进阶编程

lambda匿名函数

python使用lambda表达式来创建匿名函数

语法

// lambda 参数们:对参数的处理
lambda x : 2 * x
// x 是参数, 2*x 是返回值
​
//使用lambda实现求和
sum = lambda arg1, arg2 : agr1 + arg2
print(sum(10,20))
​
// 将匿名函数封装在一个函数里面,可以用同样的代码来创建多个匿名函数
def myfunc(n):return lambda a : a * n
mydoubler myfunc(2)
mytripler myfunc(3)
print(mydoubler(11)) // 2 * 11
print(mytripler(11)) // 3 * 11

lambda函数不能访问自己的参数列表以外或者全局命名空间里面的参数

lambda的主体是一个表达式而不是代码块,仅仅能封装有限的逻辑进去

推导式

【Python】推导式(列表推导式、元组推导式、字典推导式、集合推导式)详解_一个写湿的程序猿的博客-CSDN博客

  • 列表推导式

    [表达式 for 变量 in 列表]
    或者
    [表达式 for 变量 in 列表 if 条件]
    [out_exp_res for out_exp in input_list if condition]
    ​
    // 例子
    l = [1,2,3]
    [print(item) for item in l if item > 1]
  • 字典推导式

    {key_expr:value_expr for value in colletion if conditon}
    key_expr:新key生成表达式,可以是有返回值的函数
    value_expr:新value生成表达式,可以是有返回值的函数
    for value in colletion if conditon:迭代colletion中满足条件的value传入到key_expr:value_expr中
  • 集合推导式

    {expression for item in Sequence if condition}
    expression:新元素生成表达式,可以是有返回值的函数体
    for item in Sequence if condition:将满足条件的Sequence迭代传入expression表达式
  • 元组表达式【生成器表达式】

    元组推导式可以利用range区间,元组,列表,字典和集合等数据类型,快速生成一个满足指定要求的元组

    (expression for item in Sequence if condition)
    expression:新元素生成表达式,可以是有返回值的函数体
    for item in Sequence if condition:将满足条件的Sequence迭代传入expression表达式

enumerate内建函数

enumerate()函数用于将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标

enumerate(sequence,[start=0])

  • sequence为一个序列,迭代器,或者其它支持迭代对象,返回的是一个enumerate对象

  • 通过enumerate对象的遍历,可以获得索引于数据的组合对

    list = ['1','2','3','4']
    for index, value in enumerate(list):print(f'第{index},{value}')
    # 结果如下
    第0,1
    第1,2
    第2,3
    第3,4    

迭代器与生成器

  • 迭代器是访问集合元素的一种方式,迭代器特征为:

    1. 是一个可以记住遍历位置的对象

    2. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前而不会后退

    3. 迭代器有两个基本方法:iter()和next(),字符串,列表,元组都可以用于创建迭代器

    4. 迭代器对象可以用for进行遍历,也可以使用next()函数来获取下一个值

    list = ['1','2','3','4']
    ​
    my_iterator = iter(list)
    ​
    while True:try:element = next(my_iterator)print(element)except StopIteration:# 迭代结束,退出循环break
  • 生成器:使用了yield的函数被称为生成器(generator)

    1. 生成器是一个返回迭代器的函数,只能用于迭代操作,简单说生成器就是一个迭代器

    2. 在调用生成器的运行过程中,每次遇到yield式函数都会暂停并保存当前所有信息,返回yield的值。并在下一次执行next()方法时从当前位置继续运行

    3. 调用一个生成器函数,返回的是一个迭代器对象

    # 定义一个生成器函数
    def my_generatpr(n):for i in range(n):# 使用yield语句返回元素yield i * i
    ​
    # 创建一个生成器对象并遍历元素
    for element in my_generatpr(5):print(element)

迭代器和生成器的作用:

  • 节约内存:循环过程中,数据不用一次读入,迭代器不会保存所有值。而是在运行中动态的计算出数列的各个值,并将之前的数值扔掉

  • 不依赖索引取值

  • 实现惰性计算:需要时再取值计算

  • 精简代码:使用yield关键字或者生成器表达式可以很方便的生成一个迭代器对象

装饰器

  • 函数装饰器:本质上是一个python函数,可以让其它函数在不需要做任何代码改动的前提下增加额外功能

  • 提供了@符号作为装饰器的语法糖

  • 使用语法糖要求装饰件函数必须retrurn一个对象

    # 定义一个函数装饰器
    def my_decorator(func):def wrapper():print("Before function call")func()print("After function call")return wrapper()
    ​
    # 使用函数装饰器
    # 原有功能:打印”hello world“
    @my_decorator
    def say_hello():print("hello world")
    ​
    #调用函数
    say_hello()
    ​
    # 结果
    TypeError: 'NoneType' object is not callable
    Before function call
    hello world
    After function call
  • 类装饰器

    1. 可以用来改变类的行为,由python类和@符号组成,在python中通常用于实现代码复用,日志记录,性能测试等功能

    ​
    # 定义一个类装饰器
    class MyClassDecorator:def __init__(self, cls):self.cls = cls
    ​def __call__(self, *args, **kwargs):new_args = "Dear " + args[0]instance = self.cls(new_args, **kwargs)return instance
    ​
    # 使用类装饰器
    # 原有功能:打印 hello+名字
    @MyClassDecorator
    class MyClass:def __init__(self, name):self.name = name
    ​def say_hello(self):print(f"hello, {self.name}")
    ​
    # 创建实例
    my_object = MyClass("Alice")
    # 调用实例的方法
    my_object.say_hello()
    ​
    # 打印的结果hello,DearAlice
  • 需要注意的是,装饰器本身并不会改变原始代码的功能,而是通过创建一个新的函数来实现对原始函数或者类的修改,因此,在使用装饰器时,需要确保新创建的函数或者类与原始代码有相同的接口或者行为,以免对其它依赖于改代码的程序产生影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的创作5周年纪念日

机缘 CSDN在 SEO 方面做得很好。所以容易接触到。 然后就尝试使用了。没想到已经5年了。 收获 写blog其实是对知识的总结,能让自己更好的分享交流,让自己能和其他技术者一起交流迭代,并且把技术内容不断做好,让更多人通过技术…

【周末闲谈】“深度学习”,人工智能也要学习?

个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言,模仿还是超越? ✨第二周 畅想AR 文章目录 系列目录前言机器学习深度学习深度学习的三在种方法深度学习讲解…

据说这是最详细的,HttpRunner接口自动化框架讲解,直接上高速...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 框架简介 HttpRu…

Golang之路---02 基础语法——函数

函数 由于Golang语言是编译型语言,所以函数编写的顺序是无关紧要的,它不像 Python 那样,函数在位置上需要定义在调用之前。 函数定义 func function_name( [parameter list] ) [return_types] {函数体 }参数解释: func&#x…

Java实现数字加密

Java实现数字加密 需求分析代码实现小结Time 需求分析 1.首先,考虑方法是否需要接收数据处理? 需要一个4位数,至于是哪一个数,让方法的调用者传递。 所以,方法的参数,就是这个需要加密的四位数 2.接着&…

Apache RocketMQ之集成RocketMQ_MQTT 安装部署协议

Apache RocketMQ 安装说明 安装步骤 参考快速开始 https://rocketmq.apache.org/zh/docs/quickStart/01quickstart 安装可视化rocketmq_dashboard下载地址 https://rocketmq.apache.org/zh/docs/4.x/deployment/03Dashboard/ 安装rocketmq_mqtt https://rocketmq.apache.o…

webpack基础知识三:说说webpack中常见的Loader?解决了什么问题?

一、是什么 loader 用于对模块的"源代码"进行转换,在 import 或"加载"模块时预处理文件 webpack做的事情,仅仅是分析出各种模块的依赖关系,然后形成资源列表,最终打包生成到指定的文件中。如下图所示&#…

转运相关的征兆,大家可以来看看

转运是一种喜讯,意味着运势将逐渐好转,人生会迎来一系列积极的变化。 虽然没有确切的科学根据可以证明转运的存在, 但是在许多传统文化和民俗中,人们都相信转运的征兆是实实在在的。 虽然无法确保这些征兆会在每种情况下都适用&am…

【100天精通python】Day27:文件与IO操作_CSV文件处理

目录 专栏导读 1. CSV文件格式简介 2 csv模块的使用方法 3 读写CSV文件的示例 3.1 读取CSV文件示例 3.2 写入CSV文件示例 4 CSV文件的常用数据处理 4.1 读取CSV文件的特定列 4.2 读取CSV文件的特定行 5 csv 文件的特殊处理 5.1 处理包含逗号、换行符、引号的字段 5.…

Verilog学习记录-自用

always语句块一定条件写完整,否则电平触发,综合生成锁存器 task不可综合,主要用于仿真/验证 大部分都是并行执行的,只有begin end块中阻塞语句是串行 if-else和case的区别 if-else面积小,但时延(执…

webpack图片压缩

减少代码体积 | 尚硅谷 Web 前端之 Webpack5 教程 (yk2012.github.io) npm install image-mininizer webpack plugin imagemin -D 无损压缩 npm install imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo -D 有损压缩 npm install imagemin-gifsicle image…

软件为什么要进行性能压力测试?

软件为什么要进行性能压力测试?随着软件应用的不断增多和复杂度的提高,软件的性能对用户体验和业务成功至关重要。性能问题可能导致软件运行缓慢、崩溃或无响应,给用户带来不便甚至损失。为了确保软件能够在高负载和压力下正常运行&#xff0…

vue子组件修改父组件传递的变量(自定义日期时间组件,时间间隔为15分钟或者一个小时)

vue子组件修改父组件传递的变量 子组件不能直接修改父组件变量的值,但是可以通过调用父组件的方法来修改。 实现步骤 在父组件声明变量 export default {data() {return {startTime:"",......},......} }在父组件使用子组件并传递数据,修改…

【Yolov5+Deepsort】训练自己的数据集(1)| 目标检测追踪 | 轨迹绘制

📢前言:本篇是关于如何使用YoloV5Deepsort训练自己的数据集,从而实现目标检测与目标追踪,并绘制出物体的运动轨迹。本章讲解的为第一个内容:简单介绍YoloV5Deepsort中所用到的目标检测,追踪及sort&Depp…

el-table 去掉边框(修改颜色)

原始&#xff1a; 去掉表格的border属性&#xff0c;每一行下面还会有一条线&#xff0c;并且不能再拖拽表头 为了满足在隐藏表格边框的情况下还能拖动表头&#xff0c;修改相关css即可&#xff0c;如下代码 <style lang"less"> .table {//避免单元格之间出现白…

UI自动化测试之Jenkins配置

背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&#xff0c;但由于各种原因&#xff0c;接口自动化测试那部分功能整个废弃掉了&#xff0c;其中…

Spring5.2.x 源码使用Gradle成功构建

一 前置准备 1 Spring5.2.x下载 1.1 Spring5.2.x Git下载地址 https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2 Spring5.2.x zip源码包下载&#xff0c;解压后倒入idea https://gitcode.net/mirrors/spring-projects/spring-framework/-/…

【NLP概念源和流】 05-引进LSTM网络(第 5/20 部分)

一、说明 在上一篇博客中,我们讨论了原版RNN架构,也讨论了它的局限性。梯度消失是一个非常重要的缺点,它限制了RNN对较短序列的建模。香草 RNN 在相关输入事件和目标信号之间存在超过 5-10 个离散时间步长的时间滞时无法学习。这基本上限制了香草RNN在许多实际问题上的应用,…

数学知识(三)

一、容斥原理 #include<iostream> #include<algorithm>using namespace std;const int N 20;typedef long long LL; int n,m; int p[N];int main() {cin>>n>>m;for(int i 0;i < m;i ) cin>>p[i];int res 0;//从1枚举到2^m(位运算)for(int …

【C++】开源:事件驱动网络库libevent配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍事件驱动库libevent配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…