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

在这里插入图片描述

文章目录

  • 前言
  • 递归
  • 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)))

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 小程序 vue TypeError: Cannot read property ‘toString‘ of undefined

是因为对字符串使用toString的时候页面中的数据还没有加载 。错误代码: 可以使用 v-if 修改为:

matlab解微分方程

1.匿名函数 1.1创建 f(变量) 表达式; f(x1,x2) x1.^2x2;1.2 求解 x1为2 3 4 5;x2为3 4 5 6的情况下求解函数f的值 f(x1,x2) x1.^2x2; yf(2:5,3:6); subplot(121);%选择子图位置 plot(y)%画图2.一阶微分方程 用“dsolve” 2.1例 y.-y0 step1: 申明自变量和因…

ElasticSearch基础学习(SpringBoot集成ES)

一、概述 什么是ElasticSearch? ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎。 它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。 ES也…

最新版Flink CDC MySQL同步MySQL(一)

1.概述 Flink CDC 是Apache Flink 的一组源连接器,使用变更数据捕获 (CDC) 从不同数据库中获取变更。Apache Flink 的 CDC Connectors集成 Debezium 作为捕获数据更改的引擎。所以它可以充分发挥 Debezium 的能力。 2.支持的连接器 连接器数据库驱动mongodb-cdc…

支持跨语言、人声狗吠互换,仅利用最近邻的简单语音转换模型有多神奇

AI 语音转换真的越复杂越好吗?本文就提出了一个方法简单但同样强大的语言转换模型,与基线方法相比自然度和清晰度毫不逊色,相似度更是大大提升。 AI 参与的语音世界真神奇,既可以将一个人的语音换成任何其他人的语音,…

【VsCode远程开发】Windows SSH远程连接Linux服务器 - 无公网IP内网穿透

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

使用Python爬虫和数据可视化,揭示人口大国历年人数的变迁

前言 人口大国通常在全球人口排名中位居前列,其人口数量远远超过其他国家。而印度和中国这两个国家的人口数量均已经超过14亿,而当前全球的人口总数也不过刚刚突破80亿而已,妥妥的天花板级别存在。或许是中国和印度在人口方面的表现太过“耀…

【Python】Python基础知识总结

🎉欢迎来到Python专栏~Python基础知识总结 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:Python学习专栏 文章作者技术和水平有限,如果文中出现错误,希望…

MySQL基本查询与内置函数

目录 聚合函数 分组查询 内置函数 日期函数 字符串函数 数学函数 聚合函数 COUNT:返回查询到的数据的数量 SUM:返回查询到的数据的总和(数字) AVG:返回数据的平均值 MAX:返回查询到的数据的最大值 MIN&a…

微软MFC技术中消息的分类

我是荔园微风,作为一名在IT界整整25年的老兵,今天来聊聊MFC技术中消息的分类。 微软Windows中的消息虽然很多,但是种类并不繁杂,大体上有3种:窗口消息、命令消息和控件通知消息。 窗口消息 窗口消息是系统中最为常见…

离线环境下安装微软Visual Studio 2022 生成工具

1. 前言 最近,在学习cython的时候,需要安装windows下的C/C编译、链接工具。开始觉得传统的msvc太大了,想要尝试Mingw,但是都是编译错误。无奈之下,还是要安装msvc。 微软提供了Visual Studio 2022 Build Tools &…

12.JavaWeb-Node.js+创建Vue项目

1.Node.js的概念 传统的Web服务器中,每个请求都会创建一个线程,这会导致线程数的增加,从而影响服务器的性能和扩展性,Ryan Dahl借助Chrome的V8引擎提供的能力实现了Node.js——可以在服务端运行的JavaScript(可以把Nod…

高数(下) 第九章:多元函数微分学 及其应用

文章目录 Ch9. 多元函数微分学 及其应用(一) 二重极限(二元函数的极限)(二) 多元函数的连续性(三) 偏导数1.偏导数的定义2.二阶混合偏导数相等3.变限积分求偏导 (四) 二元可微:全增量、全微分(五) 多元复合函数 求导法则(六) 多元隐函数 的求…

Mac如何在终端使用diskutil命令装载和卸载推出外接硬盘

最近用 macOS 装载外接硬盘的时候,使用mount死活装不上,很多文章也没详细的讲各种情况,所以就写一篇博客来记录一下。 如何装载和卸载硬盘(或者说分区) mount和umount是在 macOS 上是不能用的,如果使用会…

R语言——字符串处理

paste(abc, def, gh, sep ) #粘贴字符串 substr(abcdefg, 2, 3) # 取特定字符串 gsub(abc, , c(abc, abcc, abcbc)) # 将字符串中abc替换为空 strsplit(a;b;c, ;, fixed T) # 按照;切分字符串 strsplit(a222b2.2c, 2.2, fixed F) # 按照正则表达式分隔,这里的.是…

解放运营人员:钡铼技术S475物联网网关实现养殖环境的远程监控与告警

在养殖行业中,对环境参数的精确监测与控制至关重要。然而,传统的监测方法往往存在诸多痛点,如数据采集不准确、传输速度慢、可视化效果差等。为了解决这些问题,钡铼技术公司推出了其旗舰产品——S475多功能RTU,该产品在…

外包干了2个月,技术退步明显...

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

云原生之深入解析K8S的请求和限制

一、Kubernetes 限制和请求 在 Kubernetes 中使用容器时,了解涉及的资源是什么以及为何需要它们很重要。有些进程比其它进程需要更多的 CPU 或内存,这很关键,永远不应该让进程饥饿,知道了这一点,那么应该正确配置容器…

Visual Studio 2017下的C++开发环境搭建

Visual Studio 是Microsoft旗下的开发工具包系列产品,是一个基本完整的开发工具集,它包括整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,是最流行的Windows平台应用程序的集成开发环境。…

【Springboot集成Neo4j完整版教程】

🚀 Neo4j 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,C…