Python3学习(16)--匿名函数lambda

2023-11-08

我们前面讲高阶函数的时候,已经很多次的提到了lambda,它是一个表达式,也是Python中的匿名函数,我们知道,lambda可以当做函数来使用,返回值就是lambda表达式的结果,lambda也可以当做函数的返回值,比如我们讲到的素数求解,其中有个函数就是这样写的:

我们使用lambda表达式的目的不是为了能替代函数,而是尽可能的替代一些简单的函数,注意是简单的。

插播一个修改Wing自动代码补全键值的方法:

 修改方法:edit  -> preferences -> Editor -> Auto-completion

 把右边keys的地方,从tab改成enter




我们看个对比,前面也讲过,是一带而过的那种,下面我们再细致一点:


其实就是一个表达式,返回值就是表达式的结果,理解和用起来不是太难,唯一可讲的地方,就是和一些函数的结合使用,它充当着小弟的角色,哪里需要就出现在哪里。



我们现在知道Python的 lambda表达式,非常简洁,那其他语言呢?下面呢,我们就通过一个例子,来对比一下C#和Python的lambda表达式:


例子:

大环境           :有一个学生类,类里面有三个成员变量,姓名,性别和年龄

添加学生对象 :我们分别创建三个学生对象,并用集合list保存

我们要做的    :筛选这个list集合,我们只要年龄小于18岁的学生


A、C#

Lambda表达式

"Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写的代码量。它可以包含表达式和语句

格式:例如x => x * x,=> 读作 goes to, 整个式子的意思就是 x 最终等于 x * x 的结果< --> x goes to x*x

我们看我们的demo实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{

    public class Student {
        private string Sname;//学生姓名

        private string Ssex ;//性别
        private int    Sage ;//年龄

        public Student(string name,string sex,int age)
        {
            this.Sname = name;
            this.Ssex  = sex ;
            this.Sage  = age ;
        }
        public string Sex
        {
            get { return Ssex; }
            set { Ssex = value; }
        }
        public string Name
        {
            get { return Sname; }
            set { Sname = value; }
        }
        public int Age
        {
            get { return Sage; }
            set { Sage = value; }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Student s1 = new Student("张三","男",22);
            Student s2 = new Student("李婷","女",15);
            Student s3 = new Student("李四","男",17);

            List<Student> list = new List<Student>();
            list.Add(s1);
            list.Add(s2);
            list.Add(s3);

            IEnumerable<Student> results = list.Where(Student => Student.Age < 18);
            Console.WriteLine("筛选出年龄小于18岁的学生集合:");
            foreach(Student s in results)
            {
                Console.WriteLine("姓名: "+s.Name+",性别: "+s.Sex+",年龄: "+s.Age.ToString());
            }
        }
    }



resuls是一个可迭代的对象集合,在Python中,我们可以通过for循环进行遍历,也可以用iter()函数获得迭代器,通过next进行逐一遍历,在C#中,我们就用foreach,依次取出results里面的 Student对象,然后对对象进行信息打印,我们也发现,上述的lambda表达式,是作用在list上的,这点和Pyhon是不是一样,我们在Python中见到lambda表达式的地方也都是作用在一个可以迭代的对象上的,比如map、filter、sorted等函数,我们发现C#的lambda表达式好像没有Python的简洁,虽然实现的功能一样,因为C#是强类型,而Python是弱类型,因此,你会发现,Python中替我们省去了很多demo,不说了,我们看下C#的实现:

结果就不用解释了,下面我们来观望一下Python,同样的思路,同样的构造类和成员变量,同样使用lambda表达式,返回同样的结果,我们的Python是怎么做的:


B、Python

demo如下:

#/usr/bin/env Python3
#-*- encoding:UTF-8 -*-
class Student(object):  #定义一个学生类,该类继承自object
    def __init__(self, name, sex,age): #Python的成员变量属性一体化
        self.name = name
        self.sex  = sex
        self.age  = age
 
#我们创建三个学生对象      
s1 = Student("张三","男",22)
s2 = Student("李婷","女",15)
s3 = Student("李四","男",17)

#我们用list存放这三个对象
L = []
L.append(s1)
L.append(s2)
L.append(s3)

#我们通过lambda表达式(匿名函数)用filter过滤掉年龄小于18岁的学生集合
#过滤后得到一个新的的迭代器,我们list转换一下再次交付给L
L = list(filter(lambda s:s.age<18,L))

print('筛选出年龄小于18岁的学生集合:')

#注意,下面我们对L进行遍历,s其实是一个Student对象,因此,访问name这里不能利用索引s[0],No! 
#正确的访问类中的成员变量应该 --> 对象.成员变量 --> s.name
for s in L:
    print("姓名: ",s.name,",性别: ",s.sex+",年龄: ",s.age)

关于Python面向对象部分,我们后续会讲到;

我们整体看Python的代码实现,我们发现,咋一看,我们有点蒙,不是因为它有多么的复杂,反而是因为,它太简洁了,简洁的我们都不敢相信这样的demo也可以实现我们的功能,代码量可是比C#的少将近一半。尤其是过滤的部分,我们的Python内建了过滤函数filter,因此我们可以很轻松的结合lambda表达式重新产生一个迭代器Iterator,对于C#来说,还需要另外定义一个枚举器来存放lambda表达式的结果,再对比类,显然Python的更加出色,但是比较抽象,好在,我们写代码的时候,可以省不少事。


我们看下Python的执行结果:



通过本篇的学习,我们对lambda算是比较熟悉了吧,确实很好用,但是我们也别太"依赖"它,为什么这样说呢,比如你要实现一个复杂的函数,你想到了我们学过的lambda,而你又不知道这个函数用lambda该怎么写,于是你就在那折腾,折腾老半天最终发现,还是写不出来,那请记住,不是所有的函数都能用lambda表达式来代替,它是有局限性的,如果你能写出来lambda,就写,写不出来,就用函数吧,别问我为什么,因为我也写不出来。


结束语:

学无止境啊,学的越多,接触的越多,反而觉得自己不会的也太多,敢说自己在某一方面精通的人,要么是吹出来的,要么就是真本事,我钦佩后者。


“会当凌绝顶,一览众山小”  -- 送给正在学习路上的我们,以此勉励。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3学习(16)--匿名函数lambda 的相关文章

随机推荐

  • readis windows servrer 搭建与Java客户端的连接

    1 首先下载redis redis 2 0 2 zip 32 bit 解压 从下面地址下 http code google com p servicestack wiki RedisWindowsDownload 看到下面有redis 2
  • 《SegFormer:Simple and Efficient Design for Semantic Segmentation with Transformers》论文笔记

    参考代码 SegFormer 1 概述 介绍 这篇文章提出的分割方法是基于transformer结构构建的 不过这里使用到的transformer是针对分割任务在patch merge self attention和FFN进行了改进 使其更
  • 计算机内存取证之BitLocker恢复密钥提取还原

    BitLocker是微软Windows自带的用于加密磁盘分卷的技术 通常 解开后的加密卷通过Windows自带的命令工具 manage bde 可以查看其恢复密钥串 如下图所示 如图 这里的数字密码下面的一长串字符串即是下面要提取恢复密钥
  • 华为服务器如何设置网站dns,设置为正确的DNS 服务器地址

    设置为正确的DNS 服务器地址 内容精选 换一换 域名的DNS服务器定义了域名用于解析的权威DNS服务器 通过华为云注册成功的域名默认使用华为云DNS进行解析 详细内容 请参见华为云DNS对用户提供域名服务的DNS是什么 若您选择非华为云D
  • UE4缓存路径修改

    最简单的办法就是通过Evenyting搜索 Engine Config BaseEngine ini 找到你要修改的引擎对应文件 将 ENGINEVERSIONAGNOSTICUSERDIR DerivedDataCache修改为 GAME
  • ORA-00257:archiver error解决办法*

    ORA 00257 archiver error解决办法 出现ORA 00257错误 空间不足错误 通过查找资料 绝大部分说这是由于归档日志太多 占用了全部的硬盘剩余空间导致的 通过简单删除日志或加大存储空间就能够解决 一 更改归档模式 目
  • 为什么C++有多种整型?

    C 中有多种整型是为了满足不同的需求 提供更灵活和高效的整数表示方式 不同的整型具有不同的字节大小 范围和精度 可以根据应用的需求选择合适的整型类型 以下是一些原因解释为什么C 有多种整型 内存和性能优化 不同的整型在内存中占用的空间不同
  • 【读点论文】YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors新集合体

    YOLOv7 Trainable bag of freebies sets new state of the art for real time object detectors Abstract YOLOv7在5 FPS到160 FPS的
  • 实时监控MySQL慢查询

    背景 为了优化SQL 我们首先需要发现有问题的SQL语句 网上诸多教程都在教你使用诸如mysqldumpslow pt query digest这类工具分析MySQL慢查询日志 然而这一系列的工具都存在一个致命的缺陷 无法实时监控 而说起实
  • 如何使用HuggingFace训练Transformer

    文章目录 HuggingFace Transformers Tokenizer Model 下游任务 HuggingFace Transformers 使用BERT和其他各类Transformer模型 绕不开HuggingFace提供的Tr
  • 10.高光反射Blinn

    高光反射的公式 Specular 直射光 pow cos 高光的参数 是反射光方向和视野方向的夹角 由图像看出高光参数可控制光的可视范围 逐顶点的高光反射 Upgrade NOTE replaced mul UNITY MATRIX MVP
  • 基于肌电传感器得打印断缺手指得代码讲解③ 4.2

    1 关于新增校准代码 for int i 0 i lt 5000 i sensorValue analogRead A0 delay 1 Serial println sensorValue if biggest data
  • Python在线编辑器

    Python是一种高级编程语言 可以用来编写各种类型的应用程序 包括网站 桌面应用程序 游戏 人工智能等等 在Python在线编辑器上 您可以轻松地编写 运行和共享您的Python代码 以下是一些常见的Python在线编辑器 Pythona
  • 已知空间一点到另外两点直线的距离

    转自 http www cnblogs com clarkustb archive 2008 11 04 1326500 html 已知空间一点到另外两点直线的距离 设空间中的三点为M1 M2 M3 分别用矢量a b表示方向向量M1M2和M
  • 哈希(4) - 求两个链表的交集以及并集

    目录 1 简单方法 2 使用归并排序 3 使用哈希 给定两个链表 求它们的交集 intersection 以及并集 union 用于输出的list中的元素顺序可不予考虑 例子 输入下面两个链表 list1 10 gt 15 gt 4 gt
  • Java学到什么程度才能叫精通?

    Java学到什么程度才能叫精通 全文分为 基础知识和进阶知识 下文java必会知识附答案 并为大家整理了一个pdf 所有的知识点和答案都在pdf里面 必会知识点及其答案 Java基础知识 https blog csdn net qq 166
  • Python中Tkinter解决button的command无返回值问题

    Tkinter是什么 Tkinter是Python的标准GUI库 Python使用Tkinter可以快速地创建GUI应用程序 由于Tkinter属于Python标准库 就不需要使用pip安装 直接导入使用即可 基础操作 见这篇文章 写的挺好
  • 51单片机的PID水温控制器设计

    硬件方案 PID水温控制器主要以51单片机系统进行温度采集与控制 温度信号由数字温度传感器DS18B20采集 主控器主动获取传感器温度值 通过PID算法 与设置温度进行计算 输出继电器的控制状态 并在LCD显示屏进行显示 整体硬件主要有51
  • KEIL提示“No target connected”的解决方法

    KEIL提示 No target connected 的解决方法 原创 2012 08 06 11 05 05 分类 STM32F0 字号 订阅 在用STM32F051Disconvery学习时 配置GPIOA时 不小心将连接SWD总线上的
  • Python3学习(16)--匿名函数lambda

    我们前面讲高阶函数的时候 已经很多次的提到了lambda 它是一个表达式 也是Python中的匿名函数 我们知道 lambda可以当做函数来使用 返回值就是lambda表达式的结果 lambda也可以当做函数的返回值 比如我们讲到的素数求解