揭秘python函数:编程艺术的核心力量(3)

news2024/7/31 4:21:19

在这里插入图片描述

文章目录

  • 前言
  • 递归
  • lambda表达式
    • lambda 的参数形式
      • 无参数
      • 位置参数
      • 关键字参数
      • 缺省参数
      • 可变参数
        • 1.包裹位置传递
        • 2.包裹关键字传递
    • 带判断条件的lambda表达式
    • 列表数据按照字典key的值进行排序
  • 高阶函数的使用
    • 内置高阶函数
      • 1.map()
      • 2.reduce()
      • 3.filter()

前言

前面我们已经学习了 python 函数的基础知识,那么今天我将为大家分享函数进阶的知识:递归、lambda表达式和一些高阶函数的使用。🚗🚗🚗

递归

在编程中,递归(Recursion)是一种函数调用自身的技术或方法。在递归过程中,函数通过解决一个问题的较小或相似的子问题来重复调用自身,直到达到某个基本条件,然后逐步返回结果,并合并得到最终的解决方案。

递归函数的基本思想是将一个大问题分解为一个或多个相似的子问题,这些子问题与原始问题相同但规模较小。然后通过递归调用来解决子问题,并将其子问题的解组合起来解决原始问题。递归函数必须具有停止递归的条件,以防止无限循环。

我们通过一个例子来了解递归:

用递归实现1-3数字累加

def sum_add(x):
    if x == 1:  # 递归结束条件,也就是递归的出口
        return 1
    return x + sum_add(x-1)

result = sum_add(3)
print(result)  # 6

在这里插入图片描述

在这里我们需要注意,在递归的过程中函数必须越来越接近递归结束的条件,否则就会无限递归下去,最终会停止程序。

lambda表达式

lambda表达式是一种匿名函数(无需定义函数名称)的简洁形式。它是一种轻量级的函数定义方式,可以在需要函数对象的地方使用。lambda表达式最突出的特点就是简化代码,当一个函数只有一个返回值,并且只有一句代码的时候,就可以使用lambda表达式。

在 python 中,lambda语法是这样的 lambda 参数列表 : 返回语句

用 lambda 表达式计算两数之和。

fn = lambda a,b : a+b  # 这相当于将匿名函数的地址给fn
result = fn(10,20)  # fn()调用函数
print(result)  # 30

我们也可以将此 lambda 表达式更加简化。

print((lambda a,b : a+b)(10,20))

虽然可以这样写,但是这里 lambda 表达式只可以使用一次,当使用完成之后,因为他是匿名的,所以就没人能记住他的位置,很快就会被销毁。

lambda 的参数形式

前面我们说过了普通函数的参数形式:无参数、位置参数、缺省参数和可变参数,这些参数在 lambda 表达式中同样适用。

无参数

当没有参数的时候,我们可以直接省略参数列表。

fn = lambda : 100
print(fn())  # 100

位置参数

传递参数的时候,要和 lambda 表达式参数列表的参数位置和数量保持一致。

fn = lambda a,b : f'a = {a},b = {b}'
print(fn(10,20))

在这里插入图片描述

关键字参数

在传递参数的时候,可以使用 键 = 值 的形式,来取消对用位置的限制。

fn = lambda a,b : f'a = {a},b = {b}'
print(fn(b = 200,a = 100))

在这里插入图片描述

缺省参数

在定义参数列表的时候,我们可以指定某个参数具有的默认值,在传递参数的时候可以省略传递该参数使用默认值,或者也可以传递该参数取消使用默认值。但是记住了,默认参数必须在参数列表的后面。

# 使用默认参数
fn = lambda a,b,c=100 : a+b+c
print(fn(100,50))  # 250
# 取消使用默认参数
fn = lambda a,b,c=100 : a+b+c
print(fn(100,50,200))  # 350

可变参数

参数的个数可以设置为可变的,你传递参数的时候可以传递任意个。

1.包裹位置传递

lambda *args : 返回语句

参数被合并为一个元组传入

fn = lambda *args : args
print(fn(10,20,30))

在这里插入图片描述

2.包裹关键字传递

lambda **args : 返回语句

参数被合并成一个字典传入。

fn = lambda **args : args
print(fn(name = 'zhangsan',age = 18,gender = 'man'))

在这里插入图片描述

带判断条件的lambda表达式

lambda 表达式还可以加上一些简单的判断语句。

fn = lambda a,b : a if a > b else b
print(fn(10,20))  3 20

列表数据按照字典key的值进行排序

我们都知道列表有 字典序列.sort(以什么作为排序标准,reverse = True(降序)/Fasle(升序)) 的排序方法,那么我们可以搭配着 lambda 表达式来简化代码。

# 以字典的 name值 作为排序的标准
list1 = [
    {'name':'zhangsan','age':18,'gender':'man'},
    {'name':'lisi','age':20,'gender':'woman'},
    {'name':'wangwu','age':28,'gender':'man'}
]

list1.sort(key = lambda x:x['name'],reverse = False)
for i in list1:
    print(i)

在这里插入图片描述

# 以年龄作为排序标准
list1 = [
    {'name':'zhangsan','age':18,'gender':'man'},
    {'name':'lisi','age':20,'gender':'woman'},
    {'name':'wangwu','age':28,'gender':'man'}
]

list1.sort(key = lambda x:x['age'],reverse = False)
for i in list1:
    print(i)

在这里插入图片描述

高阶函数的使用

在Python中,高阶函数是指接受一个或多个函数作为参数,并/或返回一个函数的函数。高阶函数是函数式编程的重要概念,它们提供了一种更抽象、灵活和可复用的方式来处理函数和数据。

在进行数据之间的计算时,往往需要先对数字进行处理之后再进行计算。

def sum_add(a,b):
    return abs(a) + abs(b)  # abd函数返回数字的绝对值

print(sum_add(-10,20))

我们这样写代码会显得十分呆,如果我们对数字的处理不是绝对值,而是四舍五入的值时,我们就需要更改函数里面的代码,那么有没有一种可能:我们可以将需要进行的操作作为参数传入进去呢?当然是可以的,这就是高阶函数
def 函数名(a,b,f) # 这里 f 为函数

def sum_add(a,b,f):
    return f(a) + f(b)

print(sum_add(1.25,2.75,round))  # 4

内置高阶函数

以下是一些常见的Python高阶函数:

  1. map(function, iterable): 接受一个函数和一个可迭代对象,对可迭代对象中的每个元素应用函数,并返回一个新的可迭代对象,其中包含应用函数后的结果。

  2. filter(function, iterable): 接受一个函数和一个可迭代对象,根据函数的返回值为True或False过滤可迭代对象中的元素,并返回一个新的可迭代对象,其中包含满足条件的元素。

  3. reduce(function, iterable[, initializer]): 从Python 3中已移除,被移到functools模块中。它接受一个函数和一个可迭代对象,对可迭代对象中的元素进行累积计算,并返回最终结果。例如,使用reduce可以计算累加、累乘等操作。

1.map()

map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。

# 返回列表中每个元素的平方
def func(x):
    return x ** 2


list1 = [1,2,3,4,5]
print(list(map(func,list1)))

在这里插入图片描述
结合lambda表达式简化代码

list1 = [1,2,3,4,5]
print(list(map((lambda x : x ** 2),list1)))

这里因为 python3 返回的是一个迭代器,所以我们将返回值转换为列表打印。

2.reduce()

reduce(func(x,y),lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。

import functools  # 使用reduce方法需要导入functools模块

def func(x,y):
    return x + y

list1 = [1,2,3,4,5]
print(functools.reduce(func,list1))  # 15

结合lambda表达式简化代码

import functools

list1 = [1,2,3,4,5]
print(functools.reduce((lambda x,y : x+y),list1))

3.filter()

ilter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象,。如果要转换为列表,可以使用 list() 来转换。

def func(x):
    return x % 2 == 0

list1 = [i for i in range(1,11)]
print(list(filter(func,list1)))

在这里插入图片描述

结合lambda表达式简化代码

list1 = [i for i in range(1,11)]
print(list(filter((lambda x : x % 2 == 0),list1)))

在这里插入图片描述

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

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

相关文章

7-测试模型(2个)

目录 1.软件测试V模型 2.软件测试W模型(双V模型) 1.软件测试V模型 V模型最早是由Paul Rook在20世纪80年代后期提出的,目的是改进软件开发的效率和效果。是瀑布模型的变种。 明确地标注了测试过程中存在的…

前端工程打包部署

打包 直接执行第二个脚本build即可 打包后的文件将会放在dist目录下 部署 NGINX:是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占用内存少,并发能力强,在各大型互联网公司都有非…

R中高效安装包,以ComplexHeatmap包为例

包安装问题解决方案 1. Biocmanager安装 [2. 手动安装](正在更新……) 目录 包安装问题解决方案前言1. install.packages()的介绍1.1 install.packages()的工作原理1.2 install.packages()安装失败的原因1.3 解决方案 2. BiocManage安装ComplexHeatmap总…

kubernetes的概念以及部署

简介: kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。 kubernetes的本质是…

PDF怎么免费分割成多个文件?这几个方法非常好用!

记灵在线工具是一种常用的电子工具,尤其在工作和学习中,我们经常需要使用记灵工具进行文档处理和整理。其中,记灵工具的分割功能是非常有用的,因为它可以将一个大的文件分割成多个较小的文件,从而便于我们对文件进行分…

Ubuntu22.04如何安装steam游戏平台

linux终端安装 安装命令1 打开终端,输入以下命令安装: sudo snap install steam 安装命令2 1.在这种安装模式下,我们使用的是指令安装,这时我们需要打开终端(cmd/控制台)随后输入此指令:“su…

口语理解任务源码详解系列(三)利用BiRNN-attention模型实现

利用RNN-attention模型实现 写在前面 在前文介绍了项目的数据集构建:传送门,以及利用seq2seq-attention模型实现意图分类与槽位填充任务:传送门 本文利用BiRNN-attention实现:实现细节请参考论文:《Attention-Based Re…

一键搞定发布自己Jar到Maven中央仓库

做java 开发那当然离不开jar包管理, 不知何时一直想想封装一个自己的jar包 然后发布到maven中央仓库给别人使用。 hhh 我感觉自己写一个jar包工具然后,被很多人使用是一件很牛,很快乐事情。 终于有了这个机会,和时间。SpringBoot stater出来了…

Steam搬砖项目介绍

Steam搬砖项目:轻松赚取稳定收入的副业选择 对于许多数字游戏玩家来说,Steam平台并不陌生。今天,我将向您介绍一个稳定的副业选择——Steam搬砖项目。通通过简单的操作,您可以轻松获得几十上百元的利润。 介绍 Steam搬运砖项目…

css 伪元素和浮动

展示为行内元素 inline-block <style>div {/* 浏览器解析行内块或行内标签的时候, 如果标签换行书写会产生一个空格的距离, 展示为行内元素 */display: inline-block;width: 100px;height: 100px;}.one {background-color: pink;}.two {background-color: skyblue;}</…

基于OpenCV 实现车牌号码识别--附免费源码

在本教程中,您将学习如何使用 OpenCV 和 EasyOCR 包自动执行车牌/车牌识别 (LPR/NPR)。 EasyOCR是一个开源 Python 包,用于执行光学字符识别 - OCR(从图像中提取文本)。 该软件包非常易于使用,在撰写本文时,它支持 80 多种语言,包括中文、阿拉伯语、法语、英语、西里尔…

多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab主成分分析PCA降维,BP神经网络回归预测。PCA-BP回归预测模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变量 warnin…

【脚本语言】Shell Script - 日期的获取、设置和延时操作

目录 基础概念 基础语法 打印当前日期 打印纪元时 将日期转换为纪元时 打印要求格式的日期 设置日期和时间 基础概念 Bash可以帮助我们以不同的格式打印日期、设置日期&#xff0c;又或根据日期或时间进行操作等。 在类Unix系统中&#xff0c;日期被存储为一个整数&#xff0…

阿里云服务器架构x86、GPU、ARM、裸金属和超级计算集群说明

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

在 CI/CD流水线中运行自动化单元测试的4个原因

目录 什么是单元测试&#xff1f; C#中的单元测试示例 我需要在CI/CD 流水线中运行自动化测试吗&#xff1f; 开发人员代码验证反馈循环 预验证 步步为营 减少“另一个开发人员写了这段代码”的问题 什么是单元测试&#xff1f; 单元测试 什么是单元测试&#xff1f; 单…

【MySQL】内置函数详解

【MySQL】内置函数详解 日期函数字符串函数数学函数加密函数与其它 日期函数 --获取当前日期 mysql> select current_date(); ---------------- | current_date() | ---------------- | 2023-07-09 | ---------------- --获取当前时间 mysql> select current_time();…

ChatGLM2-6b本地部署

chatglm2-6m模型 git 地址 https://github.com/THUDM/ChatGLM2-6B 模型百度网盘地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1-LFcPB0H23RSpTKOECsjxw?pwd5e3d 提取码&#xff1a;5e3d 1 模型简介 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#…

【高级程序设计语言C++】类与对象

2.1类的定义2.1.1 类的两种定义方式2.1.2 类的访问限定符2.1.3 C中的struct和class的区别是什么&#xff1f;2.1.4 类的实例化2.1.5 计算类对象的大小2.1.6 this指针 2.2 类的6个默认成员函数2.2.1 构造函数2.2.2 析构函数2.2.3 拷贝构造函数2.2.4 赋值运算符重载2.2.5 取地址及…

Java新特性:Lambda表达式

Java新特性&#xff1a;Lambda表达式 Lambda 表达式&#xff08;Lambda expression&#xff09;&#xff0c;也可称为闭包&#xff08;Closure&#xff09;&#xff0c;是 Java&#xff08;SE&#xff09;8 中一个重要的新特性。Lambda 表达式允许我们通过表达式来代替功能接口…

第五章——循环和关系表达式

for循环 很多情况下都需要程序执行重复的任务 #include<iostream> using namespace std; int main() {int i;for (i 0; i < 5; i){cout << "C knows loop.\n";}cout << "C knows when to stop.\n";return 0; } for循环的组成部分 …