Py学习  »  Python

30天入门Python(基础篇)——第8天:函数式编程

码上编程学习社 • 4 天前 • 57 次点击  
资料已经打包好了,需要的关注公众号发送“111”领取

“写函数时总被嵌套逻辑绕晕?”

“处理列表既要循环又要判断,代码乱糟糟?”

——今天咱们学函数式编程,它把函数当“积木”,用高阶函数、匿名函数等工具,让复杂逻辑变得简洁直观。

尤其是处理数据时,一行代码就能替代好几行循环,新手也能写出专业级代码。

一、高阶函数:让函数成为“参数”或“返回值”

高阶函数就是“能接收函数作为参数,或返回函数”的特殊函数,是函数式编程的核心。Python内置了map、reduce、filter、sorted这四个“明星工具”,直接拿来就能用。

1.1 map/reduce:批量处理数据的“双子星”

map负责“逐个处理”,把函数套用到每个元素上;reduce负责“累积计算”,把元素逐步合并成一个结果。两者搭配,能搞定大部分数据处理场景。

from functools import reduce  # reduce需要导入# 场景:处理成绩数据,先统一加5分(map),再算总分(reduce)scores = [8592789088]# 1. map(函数, 可迭代对象):给每个成绩加5分add5 = lambda x: x + 5  # 匿名函数,下文详解new_scores = list(map(add5, scores))print("加分后成绩:", new_scores)  # 输出[90, 97, 83, 95, 93]# 2. reduce(函数, 可迭代对象):计算总分sum_score = reduce(lambda x, y: x + y, new_scores)print("加分后总分:", sum_score)  # 输出458


map的结果是迭代器,需要用list()转成列表;reduce的函数必须接收两个参数,依次接收前两个元素、结果与下一个元素。

1.2 filter:筛选数据的“过滤器”

filter接收“判断函数”和“可迭代对象”,只保留判断为True的元素,比用列表生成式筛选更直观。

# 场景:从加分后的成绩中,筛选出90分以上的优秀成绩excellent = list(filter(lambda x: x >= 90, new_scores))print("90分以上成绩:", excellent)  # 输出[90979593]# 对比:普通循环写法,代码更长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}]# key=lambda x: x["score"] 表示按score字段排序,reverse=True表示降序sorted_students = sorted(students, key=lambda x: x["score"


    
], reverse=True)print("按成绩排序:", sorted_students)# 输出:[{'name': '小红', 'score': 92}, ...]


二、返回函数:让函数“动态生成”

返回函数就是“函数执行后返回另一个函数”,能根据参数动态生成不同功能的函数,实现“一次定义,多种用法”。

# 场景:生成“指定加分规则”的函数def make_adder(bonus):    # 内部函数使用外部参数bonus    def adder(score):        return score + bonus    return adder  # 返回内部函数,不执行# 生成“加5分”的函数add5 = make_adder(5)# 生成“加10分”的函数add10 = make_adder(10)print("85分加5分:", add5(85))  # 输出90print("85分加10分:", add10(85))  # 输出95


避坑点:返回的函数会“记住”外部参数,即使外部参数改变,函数内的参数也不会变。

三、匿名函数:临时使用的“极简函数”

匿名函数用lambda关键字定义,只有一行表达式,适合临时用一次的简单逻辑,不用专门起函数名。

# 普通函数写法def add(x, y):    return x + y# 匿名函数写法,等价于上面的add函数lambda x, y: x + y# 实际用法:和高阶函数配合total = reduce(lambda x, y: x + y, scores)print("成绩总分:", total)  # 输出433


匿名函数的结果就是返回值,不用写return;只能有一个表达式,复杂逻辑不适合用。

四、装饰器:给函数“添功能”不改代码

装饰器是函数式编程的“神器”,能在不修改原函数代码的前提下,给函数添加日志、计时等功能,像给函数“穿衣服”。

import time# 定义装饰器:计算函数执行时间def 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)# 输出:calculate_total执行时间:0.0000秒  成绩总分:433


五、偏函数:固定参数的“简化版函数”

偏函数用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这门编程感兴趣的话,欢迎加入我们。(小白也可以参加)

  Python零基础实战特训营 
三更老师亲自上课示范,2天:理论+实操教学+直播教学演示+课后辅导

获取方式:

1.关注下方公众号↓↓↓↓

2.点赞+再看

3.在后台发送:“python” 即可 领取资料福利/开通上课权限

资料已经打包好了,需要的关注公众号发送“111”领取

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/190065