社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

码上编程学习社 • 8 月前 • 664 次点击  
资料已经打包好了,需要的关注公众号发送“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