Python入门教程+项目实战-14.4节-lambda表达式

news2024/12/26 22:33:05

目录

14.4.1 理解匿名函数

14.4.2 lambda表达式

14.4.3  lambda表达式与具名函数

14.4.4 知识要点

14.4.5 系统学习python


14.4.1 理解匿名函数

匿名函数,从其字面意思来进行理解。所谓的匿名即不具名,没有名称。匿名函数,也就是没有函数名的函数。

在Python中,通过lambda表达式来定义匿名函数。

14.4.2 lambda表达式

关于lambda表达式,可以在交互模式中执行help("lambda")来查看其定义 :

>>> help("lambda")

Lambdas

*******

  lambda_expr        ::= "lambda" [parameter_list] ":" expression

  lambda_expr_nocond ::= "lambda" [parameter_list] ":" expression_nocond

Lambda expressions (sometimes called lambda forms) are used to create

anonymous functions. The expression "lambda parameters: expression"

yields a function object.  The unnamed object behaves like a function

object defined with:

  def <lambda>(parameters):

      return expression

See section Function definitions for the syntax of parameter lists.

Note that functions created with lambda expressions cannot contain

statements or annotations.

Related help topics: FUNCTIONS

从help("lambda")的输出,我们可以知道lambda表达式用来创建匿名函数:

Lambda expressions (sometimes called lambda forms) are used to create anonymous functions.

lambda表达式的语法结构:

lambda parameters: expression

parameters表示函数的形参列表,参数以逗号进行分隔,形参列表与具名函数一样,可以为空。expression表示你要实现的表达式的代码逻辑,表达式的值会直接返回给函数调用方,无需通过return进行返回。

具名函数即为有函数名的函数。通过def来定义的函数,就叫具名函数。

为便于同学们对匿名函数进行理解,现在分别使用具名函数,匿名函数来编写一段相同逻辑的代码:

# __desc__ = 使用具名函数和匿名函数来编写一段相同逻辑的代码
 
# 1. 定义具名函数accumulate,将参数进行累加
def accumulate(small, large):
 return small + large
 
x = 1
y = 2
 
z = accumulate(x, y)
# z的输出为3
 
 
# 2. 定义匿名函数,将参数进行累加
# 由于是匿名函数,所以不能直接调用该匿名函数,需要将匿名函数保存到一个变量中,
# 再进行调用
 
anonymous_accumulate = lambda x, y:x+y
 
# 通过变量来调用匿名函数时,与具名函数的调用方式一样
z = anonymous_accumulate(x, y)
# z的输出为3

在上文代码中定义了一个匿名函数,然后将其赋值到变量anonymous_accumulate中。Python中的变量,是一个存储内存地址的容器,变量anonymous_accumulate实际保存的是匿名函数的内存地址。Python在执行匿名函数时,先从变量中取出匿名函数的内存地址,然后再进行调用。

14.4.3  lambda表达式与具名函数

lambda表达式与具名函数相比,在形式上更加简单,只需一行代码就能搞定。但也同时限制了lambda表达式不能实现复杂的代码逻辑。如要实现复杂的代码逻辑,还应当使用具名函数。lambda表达式使用起来很灵活,可以作为参数传递,作为返回值来传回给调用方,也可以直接嵌入到其它数据结构中。

(1) 使用lambda表达式作为参数的默认值

代码实例:

# __desc__ = 使用lambda表达式作为默认参数
 
# 1. 定义具名函数accumulate,将参数进行累加
def accumulate(small, large, add_weight=lambda x:x+1):
    """参数add_weight的默认值为一个匿名函数"""
    small = add_weight(small)
    return small + large
 
x = 1
y = 1
z = accumulate(1,2)
# z的输出为4

如果使用具名函数的话,就没有这样的灵活性。当然我们在调用的时候,也可以直接将具名函数作为参数进行传递:

# __desc__ = 使用lambda表达式作为默认参数
 
# 1. 定义具名函数accumulate,将参数进行累加
def accumulate(small, large, add_weight=lambda x:x+1):
    """参数add_weight的默认值为一个匿名函数"""
    small = add_weight(small)
    return small + large
 
# 使用def定义一个加权函数
def add_weight(x):
    return x+1
 
x = 1
y = 1
 
# 将具名函数add_weight作为参数进行传递
z = accumulate(1,2, add_weight)
# z的输出同样为4

(2) 将lambda表达式嵌入到字典结构中

代码实例:

# __desc__ = 将lambda表达式嵌入到字典结构中
 
# 定义一个commands字典,表示各种命令
commands = {"add": lambda x,y:x+y, "sub": lambda x, y:x-y}
 
x = 1
y = 2
 
# 1.执行加法运算
z = commands["add"](x,y)
# z的输出为3
 
# 2.执行减法运算
z = commands["sub"](x,y)
# z的输出为-1

(3) 将lambda表达式作为返回值

代码实例:

# __desc__ = 将lambda表达式作为值进行返回
 
# 在具名函数中返回lambda表达式
def get_accumulate_lambda(x,y):
    initial_value = 2020
    return lambda :x+y+initial_value
 
accumulate = get_accumulate_lambda(0,1)
z = accumulate()
# z的输出为2021

当然,也可以直接将具名函数作为返回值进行返回,但不如匿名函数这样简洁。

代码实例:

# __desc__ = 将lambda表达式作为值进行返回
 
# 在具名函数中返回lambda表达式
def get_accumulate(x,y):
    # 在函数中定义函数
    def accumulate():
        initial_value = 2020
        return x+y+initial_value
 
    # 定义的函数作为返回值进行返回
    return accumulate
 
accumulate = get_accumulate(0,1)
z = accumulate()
# z的输出为2021

上文的代码实例中,定义的accumulate其实是一个闭包函数。关于闭包函数,会在函数的高级用法中进行详细讲解。

14.4.4 知识要点

(1) 匿名函数,即不具名,没有函数名的函数。

(2) 在Python中通过lambda表达式来定义匿名函数。使用匿名函数时,要先通过变量来保存匿名函数的地址。这样就可以在下文中进行调用。

(3) lambda表达式与具名函数相比,在形式上更加简单,只需一行代码。

 

14.4.5 系统学习python

 薯条老师简介:资深技术专家,技术作家,著有《Python零基础入门指南》,《Java零基础入门指南》等技术教程。薯条老师的博客:http://www.chipscoco.com, 系统学习后端,爬虫,数据分析,机器学习、量化投资。

 

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

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

相关文章

chatgpt赋能python:Python编程语言-让生活更有趣

Python编程语言-让生活更有趣 作为一名10年的Python工程师&#xff0c;我可以毫不犹豫地说&#xff0c;Python是一种编辑器最有趣的编程语言之一。作为Python的忠实拥护者和使用者&#xff0c;我深信Python可以让生活变得更轻松&#xff0c;更有趣。 Python简介 Python是一种…

std::function的讲解与实战

一、C语言中的函数指针 先看一个函数指针的例子 test_fun.cpp&#xff1a; #include<iostream>//定义函数指针 typedef int (*func)();using namespace std;int test1(){cout<<"hello, test1"<<endl;return 0; }int test2(){cout<<"h…

第三十五章Java面向对象概念及封装、继承、多态三种特性详解

面向对象简称 OO&#xff08;Object Oriented&#xff09;&#xff0c;20 世纪 80 年代以后&#xff0c;有了面向对象分析&#xff08;OOA&#xff09;、 面向对象设计&#xff08;OOD&#xff09;、面向对象程序设计&#xff08;OOP&#xff09;等新的系统开发方式模型的研究。…

ch10_2控制单元的_微程序设计

1. 微程序设计 1.1 微程序设计思想 使用微程序的设计方式&#xff0c;实现计算机系统的控制器&#xff1b; 微程序的设计&#xff0c;是方便指令集的修改和扩展&#xff1b; 每个节拍发出的控制命令&#xff0c; 实际上就是一个电信号&#xff0c;或者是几个电信号&#xf…

堆的向下调整算法,堆排,TopK问题

文章目录 堆的向下调整算法堆的删除&#xff1a;堆排序向上调整建堆的时间复杂度向下调整建堆的时间复杂度为&#xff1a;TopK问题 堆的向下调整算法 我们在这里都已小堆为例&#xff1a; 在这里我们有一个数组 int array[] {27,15,19,18,28,34,65,49,25,37}; 我们通过把根节…

Oracle VM VirtualBox添加磁盘

文章目录 1、Oracle VM VirtualBox添加磁盘 1、Oracle VM VirtualBox添加磁盘 1.关闭正在启动的Oracle VM VirtualBox 2、选择存储 3、点击最右边 4、选择创建 直接下一步&#xff1a; 直接下一步&#xff1a; 调整需要的大小–创建即可: 此时此刻磁盘加载成功&#xff0…

【综合企业管理平台】网络杂谈(10)之什么是Unicenter TNG?

涉及知识点 什么是 Unicenter TNG&#xff0c;Unicenter TNG的基本管理功能&#xff0c;Unicenter TNG Discovery &#xff0c;深入了解Unicenter TNG技术&#xff0c;综合企业管理平台 Unicenter TNG 。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可…

8.串行通信

1.通信接口相关知识&#xff1a; &#xff08;1&#xff09;处理器与外界设备通信的两种方式&#xff1a; 1&#xff09;并行通信&#xff1a; 传输原理&#xff1a;数据各个位同时传输&#xff1b; 优点&#xff1a;速度快&#xff1b; 缺点&#xff1a;占用引脚资源多&…

vue+leaflet笔记之地图网格

vueleaflet笔记之地图网格 本文介绍了Web端使用Leaflet开发库显示地图经纬网和标准图幅网格的方法 (底图来源:天地图)&#xff0c; 地图格网是由间隔均匀的横向线和纵向线组成的网络&#xff0c;用于在地图上识别各个位置。 经纬网通过在地图上描绘纬度和经度格网&#xff0c;…

40.Docker

目录 一、Docker。 &#xff08;1&#xff09;认识Docker。 &#xff08;1.1&#xff09;什么是Docker。 &#xff08;1.2&#xff09;Docker和虚拟机的区别。 &#xff08;2&#xff09;镜像、容器、DockerHub、Docker架构。 &#xff08;3&#xff09;安装Docker&#…

VS+QT+VTK三维曲面网格点选切割

程序示例精选 VSQTVTK三维曲面网格点选切割 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQTVTK三维曲面网格点选切割>>编写代码&#xff0c;代码整洁&#xff0c;规则&…

DAMA学习笔记1:概念模型-逻辑模型篇

A实体的某个字段指向 B实体的主键, 则称A实体的那个字段为该实体的外键, 一个表里可以有多个外键&#xff0c;也可以没有外键&#xff1b; 被指向的实体称为主实体(主表)&#xff0c;也叫父实体(父表)&#xff0c;负责指向的实体称为从实体(从表)&#xff0c;也叫子实体(子表)…

记录好项目D18

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个网上商城 一、系统介绍 前台商城系统&#xff1a;包含首页登录、商…

动态规划——下降路径最小和

题目链接 leetcode在线oj题——下降路径最小和 题目描述 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前…

mmpose冻结参数训练,如何添加find_unused_parameters参数

mmpose冻结参数训练&#xff0c;如何添加find_unused_parameters参数 在backbone下方添加 frozen_stages7即可冻结前7层的参数。要注意对于多卡训练来说还需要添加 find_unused_parameters True。看图片中代码的位置。

回忆雅礼朱哥二三事

少年时代的记忆是最模糊的&#xff0c;却也是最深刻的。一些瞬间在大脑里几十年&#xff0c;那一定是你曾经心动和在乎过的感受。年少求学期间&#xff0c;因对数学的痴迷&#xff0c;和数学有关的一切我都记忆犹新&#xff1a;记得一个人趴在地上解题一下午的投入&#xff0c;…

分析各种富文本框的自动填写方法

怎样自动填写表单中的富文本框&#xff1f; 什么是富文本框&#xff1f;富文本框就是在网页上可以输入带格式的文本输入框。在富文本框中&#xff0c;可以设置使用不同的字体、颜色&#xff0c;可以控制段落、边距&#xff0c;还可以插入图片、表情等。是实现在线编辑不可或缺…

c++ word简单的写文本与画表格只支持docx

简单使用的代码如下所示&#xff1a; #include "stdafx.h" #include <windows.h> #include "minidocx.hpp" using namespace docx; using namespace std; std::string GB2312ToUTF8(const std::string& gb2312) { int len MultiByteToWid…

【ESP32C3合宙ESP32C3】:ESP32C3和合宙ESP32C3的环境搭建与离线包安装

项目场景&#xff1a; 最近买了一块合宙ESP32C3的开发板&#xff0c;于是想要开发一下&#xff0c;当然开发最开始少不掉开发环境的搭建&#xff0c;在这个搭建的过程中&#xff0c;遇到了一些问题&#xff0c;解决了&#xff0c;也希望能帮助到大家。 ESP32C3 和 合宙ES…

Spring Boot 中的 Elasticsearch 的数据操作配置

Spring Boot 中的 Elasticsearch 的数据操作配置 Elasticsearch是一个基于Lucene的搜索引擎&#xff0c;可以快速地存储、搜索和分析大量的数据。Spring Boot是一个开发框架&#xff0c;提供了快速构建基于Spring的应用程序的工具和技术。在本文中&#xff0c;我们将讨论如何在…