当前位置: 首页 > news >正文

Python学习第四部分 函数式编程

文章目录

  • 高阶函数
  • lambda 表达式和匿名函数
  • 偏函数
  • 闭包
  • map函数
  • reduce函数
  • filter 函数
  • sorted函数

函数式编程主要学习:高阶函数、闭包closure、匿名函数、偏函数,map函数、reduce函数、filter函数、sorted函数

函数式编程是个很古老的概念,最古老的函数式编程语言Lisp,新出现的函数式编程语言比如Erlang,Scala,clojure等,热门语言Python、java、JavaScript、C++等增加了函数式编程的一些特性。

函数式编程在有些时候非常方便。

高阶函数

函数是一等公民,可以赋值、可以作为参数传递、可以作为返回值。一个函数可以接收另一个函数作为参数,就称之为高阶函数。 python内建的高阶函数有map reduce filter sorted

def test():print("test function run!!")def test2(func,*args,**kwargs):print("test2 function run...")func(*args,**kwargs)def test03(a,b):print(f"test03,{a},{b}")a = test
#test2(a)
test2(test03,100,200)

test2 function run…
test03,100,200

lambda 表达式和匿名函数

lambda表达式可以用来声明匿名函数,只允许包含一个表达式,不能包含复杂语句。语法如下:

lambda arg1,arg2,arg3,...:<表达式>

arg1,arg2,arg3为函数的参数,表达式相当于函数体。

f= lambda a,b,c:a+b+c
print(f)
f(10+20,20,30)
f(10,20,30)

偏函数

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partialfunction)。要注意,这里的偏函数和数学意义的偏函数不一样。
偏函数:作用就是把一个函数某些参数固定住(也就是设置默认值),返回一个新的函数,调用这个新的函数会更简单。
举例如下: int()函数可以把字符串转换为整数,当仅传入字符串时,int0函数默认按十进制转换,代码如下:

print(int('12345'))

int()函数还提供额外的base参数,默认值为10。如果阐述base参数,就可以做N进制转换。

print("转换为八进制: ",int('12345',base=8))
print("转换为十六进制:",int('12345',base=16))
print("转换为十进制:",int('12345',base=10))

转换为八进制: 5349
转换为十六进制: 74565
转换为十进制: 12345

可以利用functools.partial创建偏函数

import functools
int2=functools.partial(int,base=2)print(int2('1010101'))
print(int2('1010101',base=10))

85
1010101

闭包

闭包的两部分,函数本身、外部函数的局部变量
根据字面意思,可以形象地把闭包理解为一个封闭的包裹,这个包裹就是一个函数。当然,还有函数内部对应的逻辑,包裹里面的东西就是自由变量(外部函数的局部变量),自由变量可以随着包裹到处游荡。

局部变量:如果名称绑定再一个代码块中,则为该代码块的局部变量,除非声明为`nonlocal或global`
全局变量:如果模块绑定在模块层级,则为全局变量
自由变量:如果变量在一个代码块中被使用但不是在其中定义,则为自由变量

闭包概念和第一个闭包程序
我们知道,函数作用域是独立的、封闭的,外部的执行环境是访问不了的,但是闭包具有这个能力和权限
闭包是一个函数,只不过这个函数有超能力,可以访问到另一个函数的作用域。

闭包的特点:存在内外层函数嵌套的情况;内层函数应用了外层函数的变量或参数(自由变量);外层函数把内层的这个函数本身当做返回值进行返回。

def outer():print("outer")a=3def inner():print("inner")nonlocal a # 闭包是由于函数内部使用了函数外部的变量,这个函数对象不销毁,则外部函数的局部变量也不会被销毁print(f"a:{a}")return innera = outer()print("---------")
a()

outer


inner
a:3

闭包的作用:
隐藏变量,避免全局污染;可以读取函数内部的变量;
但是:闭包使用不当,导致变量不会被垃圾回收机制回收,造成内存消耗;也可能造成内存泄露的问题。

示例 使用全局变量实现变量自增,但是污染了其他程序

a = 10 
def add():global aa += 1print("a:",a)def print_ten():if a == 10 :print("ten!!")else:print("全局变量a,不等于10")
add()
add()
add()
add()
print_ten()

a: 11
a: 12
a: 13
a: 14
全局变量a,不等于10

示例 未污染,但是未实现自增

a = 10 
def add():a=10a += 1print("a:",a)def print_ten():if a == 10 :print("ten!!")else:print("全局变量a,不等于10")
add()
add()
add()
add()
print_ten()

a: 11
a: 11
a: 11
a: 11
ten!!

通过自由变量,实现递增,也不污染其他程序

a = 10 
def add():a=10def incrment():nonlocal aa += 1print("a:",a)return incrmentdef print_ten():if a == 10 :print("ten!!")else:print("全局变量a,不等于10")
incrment=add()
incrment()
incrment()
incrment()
print_ten()

a: 11
a: 12
a: 13
ten!!

案例 用闭包实现不修改源码添加功能

def outfunc(func):def infuc():print("日志记录...")func()return infucdef fun1():print("使用功能1")def fun2():print("使用功能2")fun1=outfunc(fun1)
fun1()fun2=outfunc(fun2)
fun2()

map函数

map()函数接收两组参数,一个是函数,一个是序列(可以传入多个序列),map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回
比如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1,2,3,4,5,6,7,8,9]上,就可以用map()实现如下:

# 自己编写实现
def f(x):return x*x
L=[]
for i in [1,2,3,4,5,6,7,8,9]:L.append(f(i))
print(L)# map实现
L=map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])
print(list(L))
# 或者
L=map(f,[1,2,3,4,5,6,7,8,9])
print(list(L))

[1, 4, 9, 16, 25, 36, 49, 64, 81]
[1, 4, 9, 16, 25, 36, 49, 64, 81]
[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce函数

reduce位于 functools模块
reduce把一个函数作用在一个序L[x1, x2,x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

reduce(f,[x1,x2,x3,x4])= f(f(f(x1,x2),x3),x4)

示例:

from functools import reducedef add(x,y):return x+ym=[1,2,3,4,5,6,7,8,9,10]
print(reduce(add, m)) ## 结果是55 

filter 函数

内置函数flter() 用于过滤序列。filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。true 保留,false 丢弃

def is_odd(n):return n%2==1L=filter(is_odd,[1,2,3,4,5,6])
print(list(L))  ## 结果是 [1, 3, 5]

sorted函数

排序算法,排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。
如果是数字,我们可以直接比较
如果是自定义对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x和y,如果认为x<y,则返回-1,如果认为x== y,则返回0,如果认为x> y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

示例 sorted对list进行排序

sorter1 = sorted([1,2,3,-1,-20,34])
print(sorter1 ) # 升序排序

sorted函数也是个高阶函数,还可以接收一个key实现自定义排序

示例 自定义排序

sorter1 = sorted([1,2,3,-1,-20,34])
print(sorter1 ) # 升序排序sorter2 = sorted([1,2,3,-1,-20,34],key=abs)
print(sorter2 ) # 绝对值排序sorter3 = sorted([1,2,3,-1,-20,34],key=abs,reverse=True) #绝对值排序,反序
print(sorter3 )

[-20, -1, 1, 2, 3, 34]
[1, -1, 2, 3, -20, 34]
[34, -20, 3, 2, 1, -1]

def custom_sorted(st1,st2):if st1.age<st2.age:return -1if st1.age>st2.age:return 1return 0st1=Stutent(13,'zhangsan')
st2=Stutent(14,'lisi')
st3=Stutent(15,'wangwu')
st4=Stutent(12,'zhaoliu') stdent_list=sorted([st1,st2,st3,st4],key=cmp_to_key(custom_sorted)) for stu in stdent_list:print(stu.name,stu.age)

zhaoliu 12
zhangsan 13
lisi 14
wangwu 15

相关文章:

Python学习第四部分 函数式编程

文章目录 高阶函数lambda 表达式和匿名函数偏函数闭包map函数reduce函数filter 函数sorted函数 函数式编程主要学习&#xff1a;高阶函数、闭包closure、匿名函数、偏函数&#xff0c;map函数、reduce函数、filter函数、sorted函数 函数式编程是个很古老的概念&#xff0c;最古…...

数据结构-二叉树-AVL树(平衡二叉树)

红黑树是平衡二叉树的一个变种。 一、 产生平衡二叉树的原因。 二叉搜索树的问题在于极端场景下退化为类似链表的结构&#xff0c;所以搜索的时间复杂度就变成了O(N)。为了保证二叉树不退化为链表&#xff0c;我们必须保证二叉树的的平衡性。 二叉平衡搜索树就是解决上面的问…...

【Qt问题】windeployqt如何提取Qt依赖库

往期回顾 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式-CSDN博客 【Qt问题】windeployqt如何提取Qt依赖库 考虑这个问题主要是&#xff1a;当我们的程序运行好之后&#…...

VS2019下使用MFC完成科技项目管理系统

背景&#xff1a; &#xff08;一&#xff09;实验目的 通过该实验&#xff0c;使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识&#xff0c;熟练应用数据库知识&#xff0c;通过处理过程对计算机软件系统工作原理的进一步理解&…...

【Android】Kotlin学习之数据容器(数组for循环遍历)

数组遍历 1. for ( item in arr){…} 2. for ( i in arr.indeces ) {…} (遍历下标) 3. for ((index, item) in arr.withInfex()) {…} (遍历下标和元素) 4. arr.forEach {} ( 遍历元素 ) 5. arr.forEachIndexed{index, item -> …}...

JavaWeb_请求响应_简单参数实体参数

一、SpringBoot方式接收携带简单参数的请求 简单参数&#xff1a;参数名与形参变量名相同&#xff0c;定义形参即可接收参数。并且在接收过程中&#xff0c;会进行自动的类型转换。 启动应用程序后&#xff0c;在postman中进行测试&#xff1a; 请求成功&#xff0c;响应回了O…...

windows端口复用

1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务&#xff0c;配合 WinRM 实现端口复用。 优点&#xff1a; HTTP.sys 为 windows 原生机制&#xff0c; WinRM 为 windows 自带功能&#xff0c;动作较小&#xff0c;不易触发主 动防御。 需要管理员权限。 2. 原理 (…...

[Redis] 使用布隆过滤器和分布式锁实现用户注册

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种数据结构&#xff0c;用于快速判断一个元素是否可能存在于一个集合中。它通过使用多个哈希函数和一个位数组来表示一个集合&#xff0c;当一个元素被加入到集合时&#xff0c;通过哈希函数计算出多个哈希值&#xff0c;并…...

Okhttp 发送https请求,忽略ssl认证

工具类 import lombok.extern.slf4j.Slf4j;import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509Tru…...

IT项目管理-大题【太原理工大学】

一、根据进度网络写出时间参数表、关键路径、总工期 此类题一般是给一个表&#xff0c;问三问。 第一问会问某个活动的时间参数&#xff0c;但我们需要把整个表都求出来&#xff0c;否则单求一个很困难&#xff08;如果你就是不想求整张表也行&#xff0c;不是硬性要求&#xf…...

【代码随想录】day48

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、198打家劫舍二、213打家劫舍II三、337打家劫舍III 一、198打家劫舍 class Solution { public:int rob(vector<int>& nums) {vector<int> dp(n…...

【补充】1-auth的使用、扩写auth的user表、django支持缓存

1 Auth的使用 1.1 扩写auth的user表 2 缓存 1 Auth的使用 # django 的一个app---》用户的登录&#xff0c;退出&#xff0c;注册。。。# 配置文件中配置&#xff1a;---》表会被迁移INSTALLED_APPS [django.contrib.auth,]# auth有哪些表---权限控制&#xff1a;-Permission&a…...

力扣-21. 合并两个有序链表-js实现

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} list1* param {ListNode} list2* return {ListNode}*/ const mergeTwoList…...

tensorflow报错

参考 TensorFlow binary is optimized to use available CPU instructions in performance-critical operations._this tensorflow binary is optimized to use availab-CSDN博客 解决Python中cuBLAS插件无法注册问题_unable to register cudnn factory: attempting to re-CS…...

企业数字化转型走向平台化运营会经历哪些阶段?

蚓链实践总结企业数字化转型走向平台化运营通常会经历以下几个阶段&#xff1a; 1. 规划与准备阶段&#xff1a;明确转型目标和战略&#xff0c;评估现有业务和技术状况&#xff0c;制定转型计划。 2. 基础建设阶段&#xff1a;搭建数字化基础设施&#xff0c;包括云平台、数…...

最新AI实景自动无人直播软件教你实现24小时不下播带货;智能化引领直播新时代

随着互联网的快速发展&#xff0c;直播行业已经成为商家品牌推广和商品销售的热门方式。而如今&#xff0c;一款令人惊叹的AI实景自动无人直播软件正在让直播变得更加智能化和便捷化&#xff0c;为商家带来全新的直播体验。 AI实景自动无人直播软件的一大优势是其智能讲解功能。…...

《二十一》QT QML编程基础

QML概述 QML&#xff08;Qt Meta-Object Language&#xff09;是一种声明性语言&#xff0c;它被用于描述Qt框架中用户界面的结构和行为。QML提供了一种简洁、灵活的方式来创建动态和交互式的界面。 QML基于JavaScript语法&#xff0c;通过使用QML类型和属性来定义界面的元素…...

免费的发票查验接口平台 PHP开发示例

信息爆炸的时代&#xff0c;发票管理工作也在不断走向数字化管理。传统手动录入的方式不仅耗时长&#xff0c;繁琐低效&#xff0c;且容易出现人为错漏的风险&#xff0c;让财务工作者头疼不已。人工智能时代&#xff0c;翔云推出了发票识别发票查验接口&#xff0c;以此来助力…...

10、算数运算符(以 ‘/’、‘%’、‘++’为主去讲解)(Java超详细版本)

算数运算符 一、算数运算符二、“ / ”的使用三、“ % ”的使用四、“ ”的使用⭐ 一、算数运算符 算数运算符是对数值类型的变量进行运算的&#xff0c;在Java程序中使用的非常多的。 二、“ / ”的使用 1、Java中 “ / ” 的运算结果是省略小数部分的整数&#xff0c;不存…...

向量数据库:PGVector

一、PGVector 介绍 PGVector 是一个基于 PostgreSQL 的扩展插件&#xff0c;为用户提供了一套强大的向量存储和查询的功能&#xff1a; 精确和近似最近邻搜索单精度&#xff08;Single-precision&#xff09;、半精度&#xff08;Half-precision&#xff09;、二进制&#xff…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...