“写函数时总被嵌套逻辑绕晕?”
“处理列表既要循环又要判断,代码乱糟糟?”
——今天咱们学函数式编程,它把函数当“积木”,用高阶函数、匿名函数等工具,让复杂逻辑变得简洁直观。
尤其是处理数据时,一行代码就能替代好几行循环,新手也能写出专业级代码。
一、高阶函数:让函数成为“参数”或“返回值”
高阶函数就是“能接收函数作为参数,或返回函数”的特殊函数,是函数式编程的核心。Python内置了map、reduce、filter、sorted这四个“明星工具”,直接拿来就能用。
1.1 map/reduce:批量处理数据的“双子星”
map负责“逐个处理”,把函数套用到每个元素上;reduce负责“累积计算”,把元素逐步合并成一个结果。两者搭配,能搞定大部分数据处理场景。
from functools import reduce scores = [85, 92, 78, 90, 88]add5 = lambda x: x + 5 new_scores = list(map(add5, scores))print("加分后成绩:", new_scores) sum_score = reduce(lambda x, y: x + y, new_scores)print("加分后总分:", sum_score)
map的结果是迭代器,需要用list()转成列表;reduce的函数必须接收两个参数,依次接收前两个元素、结果与下一个元素。
1.2 filter:筛选数据的“过滤器”
filter接收“判断函数”和“可迭代对象”,只保留判断为True的元素,比用列表生成式筛选更直观。
excellent = list(filter(lambda x: x >= 90, new_scores))print("90分以上成绩:", excellent) # 输出[90, 97, 95, 93]excellent_loop = []for s in new_scores: if s >= 90: excellent_loop.append(s)
1.3 sorted:自定义排序的“万能钥匙”
sorted不仅能排序,还能用key参数指定“排序依据函数”,轻松实现复杂排序。
students = [ {"name": "小明", "score": 85}, {"name": "小红", "score": 92}, {"name": "小李", "score": 78}]sorted_students = sorted(students, key=lambda x: x["score"
], reverse=True)print("按成绩排序:", sorted_students)
二、返回函数:让函数“动态生成”
返回函数就是“函数执行后返回另一个函数”,能根据参数动态生成不同功能的函数,实现“一次定义,多种用法”。
def make_adder(bonus): def adder(score): return score + bonus return adder add5 = make_adder(5)add10 = make_adder(10)print("85分加5分:", add5(85)) print("85分加10分:", add10(85))
避坑点:返回的函数会“记住”外部参数,即使外部参数改变,函数内的参数也不会变。
三、匿名函数:临时使用的“极简函数”
匿名函数用lambda关键字定义,只有一行表达式,适合临时用一次的简单逻辑,不用专门起函数名。
def add(x, y): return x + ylambda x, y: x + ytotal = reduce(lambda x, y: x + y, scores)print("成绩总分:", total)
匿名函数的结果就是返回值,不用写return;只能有一个表达式,复杂逻辑不适合用。
四、装饰器:给函数“添功能”不改代码
装饰器是函数式编程的“神器”,能在不修改原函数代码的前提下,给函数添加日志、计时等功能,像给函数“穿衣服”。
import timedef timer(func): def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__}执行时间:{end - start:.4f}秒") return result return wrapper@timerdef calculate_total(scores): return sum(scores)total = calculate_total(scores)
五、偏函数:固定参数的“简化版函数”
偏函数用functools.partial创建,能固定原函数的部分参数,生成新函数,减少调用时的参数输入。
from functools import partial# 原函数:将字符串转成整数,base指定进制int_base = int# 偏函数:固定base=2,生成“二进制转十进制”的函数int_bin = partial(int_base, base=2)
# 偏函数:固定base=16,生成“十六进制转十进制”的函数int_hex = partial(int_base, base=16)print("二进制'1010'转十进制:", int_bin('1010')) # 输出10print("十六进制'FF'转十进制:", int_hex('FF')) # 输出255
今天的函数式编程技巧,核心是“用函数简化逻辑”:高阶函数处理批量数据,匿名函数减少冗余代码,装饰器扩展功能,返回函数和偏函数实现灵活复用。新手不用急于全部掌握,先把map、filter、lambda这“三剑客”练熟,处理列表数据时就能事半功倍。
【今日任务】用函数式编程处理数据:
① 用map给列表[72,88,95,63]的每个元素乘2;
② 用filter筛选出结果中大于150的数;
③ 用sorted对筛选后的结果降序排序。
以上就是今天给你分享的内容,觉得有用的话欢迎点赞收藏哦!
如果你也对Python这门编程感兴趣的话,欢迎加入我们。(小白也可以参加)
三更老师亲自上课示范,2天:理论+实操教学+直播教学演示+课后辅导
获取方式:
1.关注下方公众号↓↓↓↓
2.点赞+再看
3.在后台发送:“python” 即可
领取资料福利/开通上课权限
资料已经打包好了,需要的关注公众号发送“111”领取