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

Python 函数式编程 内置高阶函数及周边【进阶篇 3】推荐

前面我们已经总结并实践了用python获取到了数据。也介绍了python中http网络请求的几种方式,正在学习python开发语言或者对python3知识点生疏需要回顾的请点这里 ,本章主要总结了函数式编程及特点 和 python中内置的高阶函数及周边知识,方便自己查看也欢迎大家参考,谢谢。

目录

一、了解函数式编程

二、python内置的高阶函数及周边

1.把函数当作参数

2.Python的内置函数map()

3.Python的内置函数reduce()

4.python的内置函数filter() 

5.Python排序函数 sorted()

6.Python返回函数

7.Python的闭包 

8.Python的匿名函数

9.Python编写无参数的decorator 

10.Python编写有参数的decorator

11.Python的偏函数

三、总结

 【python 入门篇 1 2 3 】


一、了解函数式编程

函数式编程的特点:

  1. 不是纯函数式编程:允许有变量
  2. 支持高阶函数:函数可以作为变量
  3. 支持闭包:可以返回函数
  4. 支持匿名函数

二、python内置的高阶函数及周边

1.把函数当作参数

顾名思义就是把一个函数当作参数使用。例如:

# abs函数把传递的数据乘以10 后返回 
def abs(x):return x*10# 这里参数 f参数就是需要传递一个函数
def add(x, y, f):return f(x) + f(y)# 这里在调用add方法的时候 把上面abs函数作为参数传入
result =  add(-5, 9, abs) # 相当于 result = abs(-5) + abs(9) 
print(result)  # 40
2.Python的内置函数map()

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list。并通过函数 f处理list中的每个元素,map()函数会返回一个迭代器,可以依次迭代得到原来list的元素被函数f处理后的结果。

例如,对于list [9, 8, 7, 6, 5, 4, 3, 2, 1]。
如果希望把list的每个元素都作平方,就可以利用map()函数。

 

3.Python的内置函数reduce()

reduce()函数接收的参数和 map() 类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

在python3中,reduce()函数被收录到functools包内,需要引入functools才可以使用。

# 从functools包中引入reduce模块
from functools import reduce
# 定义一个list数组
list = [5, 4, 3, 2, 1]
# 定义当做reduce函数的参数的函数
def f(x,y):return x*y# 执行reduce高阶函数后打印数据
print(reduce(f, list))

其实这个计算结果是120. 其实就是list元素的乘积 5*4*3*2*1 = 120.

f(5,4)  f(20,3) f(60,2) f(120,1) 就是f()函数第一次执行的结果当做下一次函数的x参数使用,返回最终结果。

reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为2

# 执行reduce高阶函数后打印数据
print(reduce(f, list, 200))   #24000

 

4.python的内置函数filter() 

filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,并返回一个迭代器,可以迭代出所有符合条件的元素。

 例如现在要找出10以内的奇数。

利用filter函数还可以处理空的字符串和无效数据:

 

# 定义要处理的数据
list = ['STR', None, '', 'rose', '  ', 'fly']
# 判断元素是否为空 为空则返回false 执行filter函数会过滤掉
def is_not_empty(s):return s and len(s.strip()) > 0# 过滤掉为空的数据并打印数据
for item in filter(is_not_empty, list):print(item)

注意: s.strip()会默认删除空白字符(包括'\n', '\r', '\t', ' ')

  

5.Python排序函数 sorted()

Python内置的 sorted()函数可对list进行排序:

  1. 默认是由小到大排序列表的元素。
  2. 当list的每一个元素又是一个容器时,则会以第一个元素来排序 sorted()函数则按名字首字母进行了排序并返回。

如果需要按照成绩高低进行排序,需要指定排序的字段是成绩,sorted接受key参数,用来指定排序的字段,key的值是一个函数,接受待排序列表的元素作为参数,并返回对应需要排序的字段。因此,sorted()函数也是高阶函数。可接收三个参数:

print(sorted(food))      # 经过sorted函数默认排序后打印   

print(sorted(food, key=k))     #传入指定按成绩排序的参数 key

print(sorted(food, key=k,reverse=True))   #reverse 设置倒序排序

6.Python返回函数

在函数内部,是可以定义子函数的。作为高阶函数,可以接受函数作为参数,其实高阶函数,除了不仅仅可以返回int、str、list、dict等数据类型,还可以返回函数。因此,可以把函数的子函数返回。

要注意的是,返回函数和返回函数值的语句是非常类似的,返回函数时,不能带小括号,而返回函数值时,则需要带上小括号以调用函数。 

# 返回函数
def myabs():return abs# 返回函数值
def myabs(x):return abs(x)

 返回函数有很多应用,比如可以将一些计算延迟执行:

#直接计算返回list元素求和数据
# 定义函数 返回内置函数 sum()
def calc_sum(list_):return sum(list_)#调用函数得到list数组元素之和赋值给result
result = calc_sum([1, 2, 3, 4])
print(result)  #10

如果返回一个函数,我们必须重新调用返回的函数才会执行内置函数sum,代码应该更清晰。

 这样我们拿到的函数可以根据当前需求决定要不要执行,代码更灵活。

7.Python的闭包 

内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。前面我们用到的例子:calc_sum(list)函数

我们没法把 lazy_sum 移到 calc_sum 的外部,因为它引用了 calc_sum 的参数 list_,像这样内层函数引用外层函数的变量(参数),然后把内层函数返回,就称为闭包。

def calc_sum(list_):def lazy_sum():return sum(list_)return lazy_sum

闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。

8.Python的匿名函数

高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便。

匿名函数使用lambda定义:lambda x: x * x,就可以完成原来显式定义的f(x)函数的功能,冒号前面的x表示匿名函数的参数,后面的是一个表达式,匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。

list数组经map函数处理后返回的数据。 

9.Python编写无参数的decorator 

Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。

使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。

编写@log:

def log(f):def fn(x):print('call ' + f.__name__ + '()...')return f(x)return fn#用于阶乘函数
@log
def factorial(n):return reduce(lambda x,y: x*y, range(1, n+1))print(factorial(10))

多个参数时:对于参数大于等于两个的就会报错, @log 写死了只含一个参数的返回函数。要让 @log 自适应任何参数定义的函数,可以利用Python的 args 和 *kwargs,保证任意个数的参数总是能正常调用:

def log(f):def fn(*args, **kwargs):print('call ' + f.__name__ + '()...')return f(*args, **kwargs)return fn
10.Python编写有参数的decorator

前面  编写 log函数时 默认打印信息print('call ' + f.__name__ + '()...')语句是固定不变的,只有函数名称可以动态打印,如果我们根据函数的重要做了区分想显示出来怎么办呢?这时,log函数本身就需要传入'INFO'或'DEBUG'这样的参数。

@log('DEBUG')
def my_func():pass#上面的定义翻译成高阶函数的调用
my_func = log('DEBUG')(my_func)# 又相当于
log_decorator = log('DEBUG')
@log_decorator
def my_func():pass

所以,带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数,相当于是在原有的二层嵌套里面,增加了一层嵌套:

def log(prefix):def log_decorator(f):def wrapper(*args, **kw):print('[{}] {}()...'.format(prefix, f.__name__))return f(*args, **kw)return wrapperreturn log_decorator@log('DEBUG')
def test():pass
test()
11.Python的偏函数

当一个函数有很多参数时,调用者就需要提供多个参数。如果减少参数个数,就可以简化调用者的负担。

偏函数指的就是“创建一个调用另外一个部分参数或变量已经预置的函数”的函数的用法,functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义。

 int()函数将字符串转换成整数,下面代码int默认是按照十进制去转换的.即默认参数为10,如果传入base参数,就可以做 N 进制的转换:

# int()函数将字符串转换成整数
age1 = int('20',base=10)  
age2 = int('20')print(age1,age2)  #20 20# 按照二进制转换
age3 = int('10',base=2)
print(age3)  # 2

 我们可以定义一个int2()的函数,默认把base=2传进去:int2实际上就变成了部分参数(base)已经预置了的偏函数。

def int2(x, base=2):return int(x, base)
print(int2('10'))   # 2

functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:

所以,functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。

三、总结

本文主要介绍了函数式编程及特点 和 python中内置的高阶函数及周边: 

1.函数式编程的主要特点:允许有变量函数可以作为变量可以返回函数支持匿名函数

2.python中的内置函数:map()reduce()filter()sorted()闭包匿名函数偏函数等内容。

有问题欢迎大家评论区留言探讨,谢谢。

 另附:python中http请求及网络爬虫获取数据:

1.Python 爬数据案例 客户端服务端http请求 推荐 【进阶篇 2 】-CSDN博客

2.python面向对象继承多态和一些特殊方法的使用

 【python 入门篇 1 2 3 】

1.安装下载基本数据类型:Python 3 入门基础知识【1】数据类型 安装下载 推荐-CSDN博客

2.list数组定义及操作:Python 3 入门基础知识 之数据容器及用法【2】 推荐-CSDN博客

3.函数及参数:Python 3 入门基础知识【3】递归函数以及参数部分-CSDN博客

相关文章:

Python 函数式编程 内置高阶函数及周边【进阶篇 3】推荐

前面我们已经总结并实践了用python获取到了数据。也介绍了python中http网络请求的几种方式,正在学习python开发语言或者对python3知识点生疏需要回顾的请点这里 ,本章主要总结了函数式编程及特点 和 python中内置的高阶函数及周边知识,方便自…...

【Rust光年纪】探秘Rust GUI库:从安装配置到API概览

Rust语言GUI库全方位比较:选择适合你的工具 前言 在现代软件开发中,图形用户界面(GUI)库扮演着至关重要的角色。随着Rust语言的不断发展,越来越多的优秀的GUI库也相继问世,为Rust开发者提供了更多选择。本…...

Element plus部分组件样式覆盖记录

文章目录 一、el-button 样式二、Popconfirm 气泡确认框三、Popover 气泡卡片四、Checkbox 多选框五、Pagination 分页六、Form 表单七、Table 表格 一、el-button 样式 html&#xff1a; <el-button class"com_btn_style">button</el-button>样式覆盖…...

重塑业务生态,Vatee万腾平台:引领行业变革的新引擎

在数字经济浪潮汹涌的今天&#xff0c;传统行业的边界正被不断模糊与重塑&#xff0c;新兴技术如云计算、大数据、人工智能等正以前所未有的速度改变着商业世界的面貌。在这一背景下&#xff0c;Vatee万腾平台应运而生&#xff0c;以其独特的创新模式和强大的技术实力&#xff…...

标准术语和定义中的【架构】应该如何描述

一、参考国家标准和国际标准中对“架构”的描述 &#xff08;1&#xff09;GB/T 8566-2022 国家标准 架构的术语描述&#xff1a;(系统)在其环境中的一些基本概念或性质,体现在其元素关系,以及设计与演进原则中。 &#xff08;2&#xff09;ISO/IEC/IEEE 42010 国际标准 架构的…...

华为鸿蒙Core Vision Kit 骨骼检测技术

鸿蒙Core Vision Kit 是华为鸿蒙系统中的一个图像处理框架&#xff0c;旨在提供各种计算机视觉功能&#xff0c;包括物体检测、人脸识别、文本识别等。骨骼检测是其中的一项功能&#xff0c;主要用于检测和识别人类身体的骨骼结构。 骨骼检测的关键点 骨骼点检测&#xff1a;通…...

Table API SQL系统(内置)函数System (Built-in) Function详解

目录 函数类型 引用函数 函数精确引用 函数模糊引用 函数解析顺序 精确的函数引用 模糊的函数引用 系统函数 标量函数(Scalar Functions) 比较函数(Comparison Functions) 逻辑函数(Logical Functions) 算术函数(Arithmetic Functions) 字符串函数(Strin…...

一键运行RocketMQ5.3和Dashboard

一键运行RocketMQ5.3和Dashboard 目录 一键运行RocketMQ5.3和Dashboard通过Docker Compose 来一键启动运行的容器包括docker-compose.yml文件运行命令启动本地效果查看 参考信息 通过Docker Compose 来一键启动 运行的容器包括 NameServerBrokerProxyDashBoard docker-compo…...

HAL STM32 SG90舵机驱动控制

HAL STM32 SG90舵机驱动控制 &#x1f516;测试对象&#xff1a;STM32F103SG90舵机 &#x1f33c;功能实现&#xff1a;通过串口指令&#xff0c;控制SG90舵机转动到指定角度。 ✨在实际硬件舵机驱动过程中&#xff0c;使用SG90普通舵机空载运转情况下&#xff0c;电流在180mA…...

【Kubernetes】k8s集群图形化管理工具之rancher

目录 一.Rancher概述 1.Rancher简介 2.Rancher与k8s的关系及区别 3.Rancher具有的优势 二.Rancher的安装部署 1.实验准备 2.安装 rancher 3.rancher的浏览器使用 一.Rancher概述 1.Rancher简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台&#xff0c;实…...

AI编程系列一1小时完成链家房价爬虫程序

背景 AI编程实在太火&#xff0c;写了很多年的Java&#xff0c;现在Python 和Go 简单好用&#xff0c;今天结合智谱清言快速完成一个程序爬虫程序&#xff0c;没有任何Python 编程经验&#xff0c;只需要会提问&#xff0c;熟悉简单HTML结构即可。未来一定是有业务能力者的福…...

【JavaEE初阶】文件内容的读写—数据流

目录 &#x1f4d5; 引言 &#x1f334; 数据流的概念 &#x1f6a9; 数据流分类 &#x1f333; 字节流的读写 &#x1f6a9; InputStream&#xff08;从文件中读取字节内容) &#x1f6a9; OutputStream&#xff08;向文件中写内容&#xff09; &#x1f384; 字符流的…...

Spring Boot项目中使用Sharding-JDBC实现读写分离

Sharding-JDBC是一个分布式数据库中间件&#xff0c;它不仅支持数据分片&#xff0c;还可以轻松实现数据库的读写分离。下面是如何在Spring Boot项目中集成Sharding-JDBC并实现读写分离的详细步骤&#xff1a; 目录 1. 引入依赖 2. 配置数据源 3. 配置Sharding-JDBC相关参数…...

【网络安全】SSO登录过程实现账户接管

未经许可,不得转载。 文章目录 正文正文 登录页面展示了“使用 SSO 登录”功能: 经分析,单点登录(SSO)系统的身份验证过程如下: 1、启动SSO流程:当用户点击按钮时,浏览器会发送一个GET请求到指定的URL: /idp/auth/mid-oidc?req=[UNIQUE_ID]&redirect_uri=[REDI…...

Admin.NET源码学习(3:LazyCaptcha使用浅析)

Admin.NET项目前端登录页面的验证码图片默认使用动态图&#xff0c;且图形内容为阿拉伯数字运算&#xff08;如下图所示&#xff09;&#xff0c;用户输入正确的计算结果才能正常登录。项目采用LazyCaptcha模块生成验证码及动态图。   在Admin.NET.Core项目中添加了Lazy.Cap…...

在原生未启用kdump的BCLinux 8系列服务器上启用kdump及报错处理

本文记录了在原生未启用kdump的BCLinux 8系列操作系统的服务器上手动启用kdump服务及报错处理的过程。 一、问题描述 BCLinux 8系列操作系统&#xff0c;系统初始化安装时未启用kdump服务&#xff0c;手动启动时报以下“No memory reserved for crash kernel”或“ConditionK…...

Android架构组件中的MVVM

Android架构组件中的MVVM&#xff08;Model-View-ViewModel&#xff09;模式是一种广泛应用的设计模式&#xff0c;它通过将应用程序分为三个主要部分&#xff08;Model、View、ViewModel&#xff09;来分离用户界面和业务逻辑&#xff0c;从而提高代码的可维护性、可扩展性和可…...

走向绿色:能源新选择,未来更美好

当前&#xff0c;全球范围内可再生能源正经历着从辅助能源向核心能源的深刻转型&#xff0c;绿色能源日益渗透至居住、出行、日常应用等多个领域&#xff0c;深刻影响着我们的生活方式&#xff0c;使我们能够更加充分地体验清洁能源所带来的优质生活。 一、绿色能源与“住” …...

鸿蒙装饰器的介绍

State装饰器&#xff0c; State装饰的变量&#xff0c;称为状态变量&#xff0c;与声明式范式中的其他被装饰变量一样&#xff0c;是私有的&#xff0c;只能从组件内部访问&#xff0c;在声明时&#xff0c;必须指定其类型和本地初始化。 Provide装饰器和Consume装饰器&#…...

零基础5分钟上手亚马逊云科技核心云架构知识 - 权限管理最佳实践

简介&#xff1a; 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列&#xff0c;适用于任何无云计算或者亚马逊云科技技术背景的开发者&#xff0c;通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我会每天介绍一个基于亚马逊云科技…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...