Python中的“内置高阶函数”

本文深入讲解了Python中的高阶函数,包括map、reduce、filter和sorted的使用方法及实例,探讨了如何通过这些函数实现数据处理和算法优化,同时介绍了匿名函数lambda的应用。

高阶函数
-实参是一个函数名
-函数的返回值是一个函数
函数本身也可以赋值给变量 变量可以指向函数
例子:求绝对值

print(abs(-11))                     ##abs函数作用于-11 abs函数是求绝对值的

内置高阶函数
1、map()函数
接收两个参数, 一个是函数, 一个是序列
map将传入的函数依次作用到序列的每个元素 并且把结果作为新的序列返回。
例子1:对于序列[-1,3,-4,-5]的每个元素求绝对值

print(list(map(abs,[-1,3,-4,5])))   ##map()表示传入一个函数,并且作用于列表

例子2:对于序列的每个元素求阶乘

import random
	def factoria(x):                   					 ##构造一个求阶乘的函数
	    res = 1
	    for i in range(1,x+1):
	        res =res* i
	    return res
	li = [random.randint(2,7) for i in range(10)]       ##构造一个列表
	print(list(map(factoria,li)))                       ##将函数内置,作用与列表

2、内置高阶函数reduce
reduce是把结果继续和和序列的下一个元素作累积运算,
reduce接受两个参数
python2.x中,reduce是内置函数
python3.x中,需要导入,即from functools import reduce
例子1,累加

from functools import reduce        ##导入reduce
def multi(x,y):
    return x+y
print(reduce(multi,range(1,4)))

例子2,累乘

from functools import reduce
def multi(x,y):
    return x*y
print(reduce(multi,(1,2,3,4)))

3、内置高阶函数filter
filter和map函数相似,也是接收一个函数和一个序列
filter把传入和函数依次作用,并根据返回值是True还是False决定保留还是丢弃,True保留,False丢弃,相当于过滤
例子,求偶数

def isodd(num):                             ##构造一个求偶数的函数
    if num%2 ==0:
        return True
    else:
        return  False
print(list(filter(isodd,range(30))))        ##类似于map,需要加list显示输出值

4、内置高阶函数sorted
默认sort和sorted方法由小到大进行排序,resverse=True表示由大到小排序
例子1,由大到小排序

li = [1,2,3,4]
a= li.sort(reverse=True)      #resverse=True表示由大到小排序
print(li)

例子2:

info = [
	    #   商品  数量  价格
	
	    ('apple1', 29 ,3),
	    ('apple2', 27 ,77),
	    ('apple3', 25 ,5),
	    ('apple4', 30 ,34),
	    ('apple5', 50 ,23)
	]
	
	print(sorted(info))             	 ##默认排序,是根据第一列进行排序
	
	def sorted_by_count(x):         	##定义函数返回第二列
	    return x[1]
	print(sorted(info,key=sorted_by_count))         ##按数量排序由小到大
	
	def sorted_by_price(x):
	    return x[2]
	print(sorted(info,key=sorted_by_price))         ##按价格排序,由小到大
	
	def sorted_by_count_price(x):
	    return x[1],x[2]
	print(sorted(info,key=sorted_by_count_price))   ##先按数量由小到大,数量相等,再根据价格

例题:
(2018-携程-春招题)题目需求:
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
输入:
第一行是数组长度, 后续每一行是数组的一条记录;
4
0
7
0
2
输出:
调整后数组的内容;
7
2
0
0

n = int(input())             		   ##此处的input是输入列表长度
li = [int(input()) for i in range(n)]  ##此处n是表循环几次,即列表的长度,此处input是输入列表元素
def  move(x):
    if x == 0:
        return 2             		   	##把0元素转换成返回值2
    else:
        return 1            		    ##非0元素转换成返回值1
print(sorted(li,key=move))   			##把0转换为2,非0转换成1,因为sorted函数是由小到大排序,由小到大排序时就可以得到结果

5、匿名函数
匿名函数的关键字为lambda
冒号前面的是形参, 冒号后面的是返回值
#求x+y

from functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))

#求平方

print(list(map(lambda x:x**2,range(5))))

#求100以内偶数

print(list(filter(lambda x:x%2==0,range(100))))

例题:有一个整数列表(10个元素),要求调整元素顺序,把所有的奇数放在前面,偶数放在后面

import random
s1 = [ random.randint(1,10) for i in range(10)]
# def move(x):
#     if x%2==0:
#         return 2
#     else:
#         return 1
# print(sorted(s1,key=move))

print(sorted(s1,key=lambda x:1 if x%2==0 else 0))       ##返回值是1,反之即else返回值是0,然后根据0,1排序

例子:利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456

from functools import reduce
def str2float(s):
    ch = {str(x):x for x in range(10)}      ##'0' 0 '1' 1  '2' 2
    L= s.split('.')     ##将字符串分割开
    n1 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],L[0]))     ##整数部分,L[0]表示分割的第一部分,即整数部分
    #map的作用:‘0’ ==>0, ‘1’ ==>1 '2' ==>2
    #'123' ==> [1,2,3] 1*10+2=12  12*10+3 =123,小数部分同理
    n2 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],L[1]))     ##小数部分,L[1]表示分割的第二部分,即小数部分
    n2 *=0.1**len(L[1])     ##小数部分乘0.1的len(L[1])次方加整数
    return n1 + n2
num = str2float('123.456')
print(num)

例子,回文数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回文数

from functools import reduce
def huiwenshu(n):
    l = list(str(n))        ##数字变成一个列表
    l.reverse()             ##反转
    #数学计算,回文数
    num =reduce(lambda x,y:int(x) *10 + int(y),l)
    return num ==n
output = filter(huiwenshu,range(1,1000))
print('1~1000: ',list(output))
<think> 首先,用户的问题是:“我想了解Python高阶函数的相关信息 请问Python高阶函数介绍”。所以,我需要提供一个清晰、结构化的介绍Python高阶函数的回答。 系统指令要求: - 所有行内数学表达式使用$...$格式(但在这个主题中,可能没有太多数学,所以我会注意如果有变量等)。 - 独立公式使用$$...$$并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 引用站内内容: - 引用[1]: 关于高阶函数的优雅高效、内置函数如map()、filter()、sorted()、reduce()。 - 引用[2]: 关于filter()的高级用法,与列表推导式比较。 - 引用[3]: 函数也是一种数据类型。 - 引用[4]: 一个map()的示例。 这些引用是参考,我需要自然地融入回答中,并在结束时添加引用标识。 回答结构: 1. 逐步介绍Python高阶函数: - 定义:高阶函数是什么? - 为什么重要? - 常见内置高阶函数:map(), filter(), reduce(), sorted()。 - 示例代码。 - 自定义高阶函数。 - 装饰器作为高阶函数。 2. 生成相关问题:在最后添加“§§相关问题§§”部分。 确保回答真实可靠:基于标准Python知识。 步骤: - 开头:定义高阶函数。使用引用[3]的概念:函数是数据类型。 - 解释:高阶函数是接受函数作为参数或返回函数函数。 - 讨论内置函数: - map(): 应用函数到可迭代对象。使用引用[4]的示例。 - filter(): 过滤元素。提到引用[2]的与列表推导式比较。 - reduce(): 累积操作(需要从functools导入)。 - sorted(): 排序函数。 - 自定义高阶函数:举例说明。 - 装饰器:作为高阶函数的例子。 - 结尾:总结益处,参考引用[1]提到的优雅高效。 - 最后:生成相关问题。 生成相关问题: - 基于主题,如: 1. map()函数的具体用法? 2. 如何用列表推导式替代map()和filter()? 3. 高阶函数的实际应用场景? 4. 装饰器的工作原理? 添加引用标识: - 当提到引用内容时,在段落末尾添加[^1]、[^2]等。例如,提到函数是数据类型时加[^3],提到map示例时加[^4],提到高效时加[^1]。 使用中文:整个回答用中文。 代码块:如果提供代码示例,使用代码块格式,如示例中的Python代码。 现在,草拟回答大纲: 1. 介绍高阶函数:定义、重要性。 2. 内置高阶函数: - map() - filter() - reduce() - sorted() 3. 自定义高阶函数和装饰器。 4. 总结。 5. 相关问题。 确保LaTeX:如果没有数学,可能不需要。但如果有,比如变量,用$...$。 </think>### Python高阶函数介绍 Python高阶函数函数式编程的核心概念,指的是接受函数作为参数或返回函数作为结果的函数[^3]。在Python中,函数本身是一种数据类型(如`<class 'function'>`),这使得高阶函数可以灵活地操作其他函数,从而让代码更简洁、优雅和高效[^1]。下面我将逐步介绍高阶函数的定义、常见内置函数、自定义用法以及实际应用。 #### 1. **高阶函数的基本定义** - 高阶函数基于一个关键特性:函数是“一等公民”,即函数可以像变量一样被传递和使用。例如: - **接受函数作为参数**:一个高阶函数可以接收另一个函数作为输入。 - **返回函数作为结果**:高阶函数可以生成并返回一个新函数。 - 为什么重要?高阶函数能减少重复代码,提高可复用性,并支持更抽象的编程模式[^1]。例如,使用高阶函数处理数据集合时,可以避免手动编写循环。 #### 2. **常见内置高阶函数** Python提供了多个内置高阶函数,适用于数据处理和转换。以下是核心函数及其用法: - **`map()`函数**:将一个函数应用到可迭代对象(如列表)的每个元素上,并返回一个迭代器。语法:`map(function, iterable)`。 - 示例:将字符串列表的首字母大写并其余小写。 ```python def format_name(s): return s[0].upper() + s[1:].lower() result = list(map(format_name, ['adam', 'LISA', 'barT'])) print(result) # 输出: ['Adam', 'Lisa', 'Bart'] ``` 此例展示了`map()`的简洁性,比手动循环更高效[^4]。 - **`filter()`函数**:基于一个条件函数过滤可迭代对象,返回满足条件的元素组成的迭代器。语法:`filter(function, iterable)`。 - 示例:过滤列表中的偶数。 ```python def is_even(x): return x % 2 == 0 numbers = [1, 2, 3, 4, 5] result = list(filter(is_even, numbers)) print(result) # 输出: [2, 4] ``` `filter()`常与列表推导式比较:列表推导式(如`[x for x in numbers if x % 2 == 0]`)更简洁,但`filter()`在函数式编程中更灵活,尤其当条件逻辑复杂时[^2]。 - **`reduce()`函数**(需从`functools`导入):对可迭代对象进行累积操作,如求和或求积。语法:`reduce(function, iterable)`。 - 示例:计算列表元素的乘积。 ```python from functools import reduce def multiply(a, b): return a * b numbers = [1, 2, 3, 4] result = reduce(multiply, numbers) print(result) # 输出: 24 ``` - **`sorted()`函数**:排序可迭代对象,可接受一个`key`函数来自定义排序规则。语法:`sorted(iterable, key=function)`。 - 示例:按字符串长度排序。 ```python words = ["apple", "banana", "cherry"] sorted_words = sorted(words, key=len) print(sorted_words) # 输出: ['apple', 'cherry', 'banana'] ``` 这些内置函数让数据处理更高效,减少了冗余代码[^1]。 #### 3. **自定义高阶函数和装饰器** - **自定义高阶函数**:你可以创建自己的高阶函数来处理通用逻辑。例如,一个函数工厂,生成特定功能的函数。 ```python def make_multiplier(factor): def multiplier(x): return x * factor return multiplier double = make_multiplier(2) print(double(5)) # 输出: 10 ``` 此例中,`make_multiplier`返回一个新函数,展示了高阶函数的灵活性。 - **装饰器(Decorators)**:装饰器是一种特殊的高阶函数,用于修改其他函数的行为,如添加日志或计时功能。语法使用`@`符号。 ```python def timer_decorator(func): def wrapper(*args, **kwargs): import time start = time.time() result = func(*args, **kwargs) end = time.time() print(f"函数 {func.__name__} 执行时间: {end - start:.4f}秒") return result return wrapper @timer_decorator def example_function(n): return sum(range(n)) print(example_function(1000)) # 输出结果并打印执行时间 ``` 装饰器简化了代码复用,是Python高阶函数的典型应用[^1]。 #### 4. **高阶函数的优势与注意事项** - **优势**: - **代码简洁**:用`map()`或`filter()`替代循环,减少行数。 - **可读性强**:函数式风格使逻辑更清晰。 - **高效性**:内置函数在底层优化,性能较好[^1]。 - **注意事项**: - 与列表推导式相比,`map()`和`filter()`可能稍慢,但更适用于函数组合。 - 避免过度使用,以免降低可维护性;在简单场景下,列表推导式可能更直观[^2]。 总结来说,Python高阶函数(如`map()`, `filter()`, `reduce()`, 和装饰器)是提升代码质量的关键工具。它们支持函数式编程范式,让开发更高效和优雅[^1]。在实际项目中,常用于数据清洗、API封装或算法优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值