22函数---匿名函数、函数式编程、内置函数
一、匿名函数:lambda
一次使用,随时随地定义
没有名字,有了名字就失去了意义
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
匿名函数通常被用作高阶函数的参数。比如,filter(),map(),reduce()。
lambda x,y:x+y
二、函数式编程
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,
就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。
函数就是面向过程的程序设计的基本单元。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
三、高阶函数
函数也是对象,可以把函数作为参数传入,这样的函数称为高阶函数。map()、reduce()、filter()
lambda 常与内置函数结合使用
# 1、map、reduce、filter
# map() 对序列中的每一个元素应用被传入的函数,返回包含结果的可迭代对象 l = map(lambda x:x+3,[1,2,4]) print(list(l))#[4, 5, 7] # # # # reduce() 把结果继续和序列的下一个元素做累积计算 from functools import reduce s = reduce(lambda x,y:x+y,[2,3,4,5]) print(s)#14 # # # filter()过滤出元素,把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定是否保留该元素 a = list(filter(lambda x:x>1,range(-5,5))) print(a)#[2, 3, 4]
# 2、max()对字典的运算:最小值,最大值,排序 salaries={ 'aa':3000, 'bb':100000000, 'cc':10000, 'ee':2000 } # 迭代字典取得的是Key print(max(salaries)) #ee # 这样返回的是value, 但通常我们要得到的是对应的键 print(max(salaries.values())) #100000000 # max(iterable, key, default),第一个参数是迭代器,max会遍历迭代器,将每个返回值作为参数传给key,此处对字典遍历的结果是key # 此时key是一个函数 # 这样根据value进行排序,返回的是对应的键 print(max(salaries, key=lambda k:salaries[k]))
# 3、或者使用zip()函数,py3中zip()返回的是一个对象,需手动 list() 转换 # zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象 salaries_and_name = zip(salaries.values(),salaries.keys()) print(salaries_and_name) print(max(salaries_and_name))#或者print(max(list(salaries_and_name)))也可以
# 4、sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序 L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] print(sorted(L))#[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)] print(sorted(L, key=lambda L:L[1]))#按成绩排序,[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
例:
# 1、文件内容如下,标题为:姓名,性别,年纪,薪资 # # egon male 18 3000 # alex male 38 30000 # wupeiqi female 28 20000 # yuanhao female 28 10000 # # 要求: # 从文件中取出每一条记录放入列表中, # 列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式 # # (1)我写的 l = [] with open('data.txt', 'r') as f: data = f.readlines() for d in data: res = {'name':d.split()[0], 'sex':d.split()[1], 'age':d.split()[2], 'salary':d.split()[3]} l.append(res) print(l) # (2) with open('data.txt', 'r') as f: items = (line.split() for line in f) #列表是无序的,但是读取出来的itmes是有序的 info = [{'name':name,'sex':sex,'age':age,'salary':salary } for name,sex,age,salary in items] print(info) # # 2 根据1得到的列表, 取出薪资最高的人的信息 info = max(l,key= lambda dic:dic['salary']) print(info) # # 3 根据1得到的列表,取出最年轻的人的信息 info = min(l,key= lambda dic:dic['age']) print(info) # # 4 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式 # # (1)没有用map函数 d = [{'name':i['name'].capitalize(),'sex':i['sex'],'age':i['age'],'salary':i['salary']} for i in l] print('d',d) # # (2)使用map函数 d = map(lambda dic: {'name':dic['name'].capitalize(), 'sex':dic['sex'], 'age':dic['age'], 'salary':dic['salary']},l) print('dd',list(d)) # # 5 根据1得到的列表,过滤掉名字以a开头的人的信息 info = filter(lambda d:not d['name'].startswith('a'),l) print('5:',list(info))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2020-04-03 02python基础----控制流程