Python编程 高阶函数使用技巧(python使用函数定义和调用来计算阶乘)
off999 2024-10-13 04:14 23 浏览 0 评论
高阶函数指的是能接收一个或多个函数作为参数的函数,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
结果如下:
2020 9 3
<class 'int'> <class 'int'> <class 'int'>
import math
# 对数据做映射
print(list(map(lambda x: 2 ** x + 1, [1, 3, 5, 7])))
print(list(map(lambda y: math.log10(y), [10, 100, 1000, 10000])))
print(list(map(lambda x, 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']
def trans(s):
s = s[0].upper() + s[1:].lower() # 首字母大写 后续字母小写
return s
print(list(map(trans, ['bob', 'LISA', 'barT', 'faker'])))
print(list(map(lambda x: 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(lambda x: x % 2, lis))) # 符合条件 得到奇数
print(list(filter(lambda y: 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 = [i for i in range(100, 1001)] # 三位数
# 输出水仙花数
print(list(filter(lambda x: x == sum([int(i) ** 3 for i in str(x)]), lis)))
运行结果如下:
[153, 370, 371, 407]
在这里插入图片描述
# filter的应用案例-埃氏筛法求素数
def odd_sequence(): # 构造从3开始的奇数序列
n = 1
while True:
n = n + 2
yield n
def prime_filter(prime_num): # 筛选素数的函数
return lambda x: x % prime_num > 0
def primes():
yield 2 # 先返回第一个素数2,然后利用filter()函数不断产生筛选后的新序列
nums = odd_sequence()
while True:
prime_num = next(nums) # 取出序列第一个数
yield prime_num # 返回序列第一个数
nums = filter(prime_filter(prime_num), nums) # 得到新序列
def main():
for n in primes():
if n < 100000:
print(n)
else:
break
if __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=lambda x: x[1][1], reverse=True))
print('学号 姓名 成绩')
for item in d1:
print(item[0], item[1][0], item[1][1])
运行结果如下:
学号 姓名 成绩
002 李四 90
001 张三 88
003 王五 73
# 输入一组数到列表nums,请找到列表中任意两个元素相加能够等于9的元素,形成一个元组
# 使其小数在前大数在后,如:(2,7),(1,8)。重复的元组元素只保留一个,结果按元组第一个元素从大到小顺序输出
def get_tuple(num_list):
temp_list = []
for i in num_list:
if (9 - i) in num_list:
min_ = (9 - i) if (i >= (9 - i)) else i
max_ = i if min_ == (9 - i) else (9 - i)
if (min_, max_) not in temp_list:
temp_list.append((min_, max_))
return temp_list
nums = input("numbers:")
# 列表推导式
num_list = [int(i) for i in nums.split(',')]
result_list = get_tuple(num_list)
# 按列表里每个元组的第一个元素从大到小排序 降序
result_list = sorted(result_list, key=lambda x: 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把结果继续和序列的下一个元素做累积计算。返回的是一个计算的最终结果。
from functools import reduce
s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 做累积计算
print(reduce(lambda x,y: x + y, s))
print(reduce(lambda x,y: 10 * x + y, s))
print(reduce(lambda x,y: str(x) + str(y), s))
运行结果如下:
45
123456789
0123456789
结语
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小编的支持。
相关推荐
- Python函数参数和返回值类型:让你的代码更清晰、更健壮
-
在Python开发中,你是否遇到过这些抓狂时刻?同事写的函数参数类型全靠猜调试两小时发现传了字符串给数值计算函数重构代码时不知道函数返回的是列表还是字典今天教你两招,彻底解决类型混乱问题!让你的...
- 有公司内部竟然禁用了python开发,软件开发何去何从?
-
今天有网友在某社交平台发文:有公司内部竟然禁止了python开发!帖子没几行,评论却炸锅了。有的说“太正常,Python本就不适合做大项目”,还有的反驳“飞书全员用Python”。暂且不说这家公司...
- 写 Python 七年才发现的七件事:真正提高生产力的脚本思路
-
如果你已经用Python写了不少脚本,却总觉得代码只是“能跑”,这篇文章或许会刷新你对这门语言的认知。以下七个思路全部来自一线实战,没有花哨的概念,只有可落地的工具与习惯。它们曾帮我省下大量无意义...
- 用Python写一个A*搜索算法含注释说明
-
大家好!我是幻化意识流。今天我们用Python写一个A*搜索算法的代码,我做了注释说明,欢迎大家一起学习:importheapq#定义搜索节点类,包括当前状态、从初始状态到该状态的代价g、从该状态...
- 使用python制作一个贪吃蛇游戏,并为每一句添加注释方便学习
-
今天来设计一个贪吃蛇的经典小游戏。先介绍下核心代码功能(源代码请往最后面拉):游戏功能:-四个难度等级:简单(8FPS)、中等(12FPS)、困难(18FPS)、专家(25FPS)-美...
- Python 之父 Guido van Rossum 宣布退休
-
Python之父GuidovanRossum在推特公布了自己从Dropbox公司离职的消息,并表示已经退休。他还提到自己在Dropbox担任工程师期间学到了很多东西——Python的类型注解(T...
- 4 个早该掌握的 Python 类型注解技巧
-
在Python的开发过程中,类型注解常常被忽视。但当面对一段缺乏类型提示、逻辑复杂的代码时,理解和维护成本会迅速上升,极易陷入“阅读地狱”。本文整理了4个关于Python类型注解的重要技巧...
- 让你的Python代码更易读:7个提升函数可读性的实用技巧
-
如果你正在阅读这篇文章,很可能你已经用Python编程有一段时间了。今天,让我们聊聊可以提升你编程水平的一件事:编写易读的函数。请想一想:我们花在阅读代码上的时间大约是写代码的10倍。所以,每当你创建...
- Python异常模块和包
-
异常当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG例如:以`r`方式打开一个不存在的文件。f=open('...
- 别再被 return 坑了!一文吃透 Python return 语句常见错误与调试方法
-
Pythonreturn语句常见错误与调试方法(结构化详解)一.语法错误:遗漏return或返回值类型错误错误场景pythondefadd(a,b):print(a+b)...
- Python数据校验不再难:Pydantic库的工程化实践指南
-
在FastAPI框架横扫Python后端开发领域的今天,其默认集成的Pydantic库正成为处理数据验证的黄金标准。这个看似简单的库究竟隐藏着哪些让开发者爱不释手的能力?本文将通过真实项目案例,带您解...
- python防诈骗的脚本带注释信息
-
以下是一个简单但功能完整的防诈骗脚本,包含URL检测、文本分析和风险评估功能。代码结构清晰,带有详细注释,适合作为个人或家庭防诈骗工具使用。这个脚本具有以下功能:文本诈骗风险分析:检测常见诈骗关键...
- Python判断语句
-
布尔类型和比较运算符布尔类型的定义:布尔类型只有两个值:True和False可以通过定义变量存储布尔类型数据:变量名称=布尔类型值(True/False)布尔类型不仅可以自行定义,同时也可通过...
- 使用python编写俄罗斯方块小游戏并为每一句添加注释,方便学习
-
先看下学习指导#俄罗斯方块游戏开发-Python学习指导##项目概述这个俄罗斯方块游戏是一个完整的Python项目,涵盖了以下重要的编程概念:-面向对象编程(OOP)-游戏开发基础-数据...
- Python十大技巧:不掌握这些,你可能一直在做无用功!
-
在编程的世界里,掌握一门语言只是起点,如何写出优雅、高效的代码才是真功夫。Python作为最受欢迎的编程语言之一,拥有简洁明了的语法,但要想真正精通这门语言,还需要掌握一些实用的高级技巧。一、列表推导...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)