Python编程 高阶函数使用技巧

简介: 在坚持的初期,坚持本身比坚持的事情更重要。也许,生活的意义并不在于实现了怎样伟大的梦想,而是在于自己全身心地投入,让每一天都成为梦想的一部分。只要是能确定带给自己价值感的事情,去做就好。时间在流逝,每一天,都值得认真对待。

高阶函数指的是能接收一个或多个函数作为参数的函数,python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率。


一、map函数


map(function, iterable, ...)


返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项。


y, m, d=map(int, input().split('/'))
print(y, m, d)
print(type(y), type(m), type(d))
输入:2020/9/3结果如下:202093<class'int'><class'int'><class'int'>


importmath# 对数据做映射print(list(map(lambdax: 2**x+1, [1, 3, 5, 7])))   
print(list(map(lambday: math.log10(y), [10, 100, 1000, 10000])))
print(list(map(lambdax, y: x**2+y, [1, 2, 3, 4, 5], [1, 2, 3, 4, 5])))
运行结果如下:[3, 9, 33, 129]
[1.0, 2.0, 3.0, 4.0]
[2, 6, 12, 20, 30]


再举个简单例子,假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list。输入:['bob', 'LISA', 'barT', 'faker']
输出:['Bob', 'Lisa', 'Bart', 'Faker']


deftrans(s):
s=s[0].upper() +s[1:].lower()  # 首字母大写  后续字母小写returnsprint(list(map(trans, ['bob', 'LISA', 'barT', 'faker'])))
print(list(map(lambdax: x[0].upper() +x[1:].lower(), ['bob', 'LISA', 'barT', 'faker'])))
运行结果如下:['Bob', 'Lisa', 'Bart', 'Faker']
['Bob', 'Lisa', 'Bart', 'Faker']


二、filter函数


filter(function, iterable) # function为判断函数,iterable为可迭代对象


filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

接收的两个参数中,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到迭代器中。如果 function 是 None ,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。


lis= [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list(filter(lambdax: x%2, lis)))      # 符合条件  得到奇数print(list(filter(lambday: y%2==0, lis))) # 得到偶数运行结果如下:[1, 3, 5, 7, 9]
[2, 4, 6, 8, 10]


# 如果 function 是None,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。s= [1, 2, '', [], {}, (), '123']
print(list(filter(None, s)))
运行结果如下:[1, 2, '123']


# 利用filter函数筛选出水仙花数# 水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身(例如:1^3 + 5^3 + 3^3 = 153)lis= [iforiinrange(100, 1001)]  # 三位数# 输出水仙花数print(list(filter(lambdax: x==sum([int(i) **3foriinstr(x)]), lis)))
运行结果如下:[153, 370, 371, 407]



"""@Author  :叶庭云@Date    :2020/9/12 15:01@CSDN    :https://blog.csdn.net/fyfugoyfa"""# filter的应用案例-埃氏筛法求素数defodd_sequence():    # 构造从3开始的奇数序列n=1whileTrue:
n=n+2yieldndefprime_filter(prime_num):   # 筛选素数的函数returnlambdax: x%prime_num>0defprimes():
yield2# 先返回第一个素数2,然后利用filter()函数不断产生筛选后的新序列nums=odd_sequence()
whileTrue:
prime_num=next(nums)   # 取出序列第一个数yieldprime_num# 返回序列第一个数nums=filter(prime_filter(prime_num), nums)  # 得到新序列defmain():
forninprimes():
ifn<100000:
print(n)
else:
breakif__name__=='__main__':
main()


三、sorted函数


  • 根据 iterable 中的项返回一个新的已排序列表。
  • 具有两个可选参数,它们都必须指定为关键字参数。

key:指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower)。 默认值为 None (直接比较元素)

reverse:为一个布尔值,如果设为 True,则每个列表元素将按反向顺序比较进行排序


# 学号 姓名 成绩d= {'001': ['张三', 88], '002': ['李四', 90], '003': ['王五', 73]}
# 按成绩排序  降序  由高到低d1=list(sorted(d.items(), key=lambdax: x[1][1], reverse=True))      
print('学号 姓名 成绩')
foritemind1:
print(item[0], item[1][0], item[1][1])
运行结果如下:学号姓名成绩002李四90001张三88003王五73


# 输入一组数到列表nums,请找到列表中任意两个元素相加能够等于9的元素,形成一个元组# 使其小数在前大数在后,如:(2,7),(1,8)。重复的元组元素只保留一个,结果按元组第一个元素从大到小顺序输出defget_tuple(num_list):
temp_list= []
foriinnum_list:
if (9-i) innum_list:
min_= (9-i) if (i>= (9-i)) elseimax_=iifmin_== (9-i) else (9-i)
if (min_, max_) notintemp_list:
temp_list.append((min_, max_))
returntemp_listnums=input("numbers:")
# 列表推导式num_list= [int(i) foriinnums.split(',')]
result_list=get_tuple(num_list)
# 按列表里每个元组的第一个元素从大到小排序  降序result_list=sorted(result_list, key=lambdax: x[0], reverse=True)
print(result_list)
运行结果如下:numbers:3,4,5,7,2,8,1,6,9,0[(4, 5), (3, 6), (2, 7), (1, 8), (0, 9)]


四、reduce函数


reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。返回的是一个计算的最终结果。


fromfunctoolsimportreduces= [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 做累积计算print(reduce(lambdax,y: x+y, s))
print(reduce(lambdax,y: 10*x+y, s))
print(reduce(lambdax,y: str(x) +str(y), s))
运行结果如下:451234567890123456789


目录
相关文章
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
284 102
|
2月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
308 104
|
2月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
254 103
|
2月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
192 82
|
1月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
178 3
|
1月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
410 3
|
1月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
259 3
|
1月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
248 0
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的多面手
Python:现代编程的多面手
81 0
|
2月前
|
存储 人工智能 算法
Python实现简易成语接龙小游戏:从零开始的趣味编程实践
本项目将中国传统文化与编程思维相结合,通过Python实现成语接龙游戏,涵盖数据结构、算法设计与简单AI逻辑,帮助学习者在趣味实践中掌握编程技能。
321 0

推荐镜像

更多