当前位置: 首页 > news >正文

Python 的函数柯里化(Currying)

柯里化是一种将多参数函数转换为一系列单参数函数的技术。在 Python 中,可以通过多种方式实现柯里化。

基本概念

柯里化的基本思想是:一个接收多个参数的函数,可以转换为接收单一参数(最初函数的第一个参数)的函数,并返回接收余下参数的新函数。

手动实现柯里化

# 原始多参数函数
def add(a, b, c):return a + b + c# 手动柯里化版本
def add_curried(a):def inner1(b):def inner2(c):return a + b + creturn inner2return inner1# 使用方式
result = add_curried(1)(2)(3)  # 输出: 6
print(result)

functools.partial 允许你固定一个函数的部分参数,创建一个新的函数:

from functools import partialdef multiply(x, y):return x * y# 创建新函数,固定第一个参数为 2
double = partial(multiply, 2)
print(double(5))  # 输出: 10 (相当于 multiply(2, 5))

例子

import functools
from typing import Any, Callable, Generic, List, TypeVar
from fastapi import APIRouterdef route(router: APIRouter,path: str,methods: List[str],response_model=None,**options
):passget = functools.partial(route, methods=['GET'])
post = functools.partial(route, methods=['POST'])
put = functools.partial(route, methods=['PUT'])
delete = functools.partial(route, methods=['DELETE'])

2. 代码中的作用

get = functools.partial(route, methods=['GET'])
这相当于:
def get(router: APIRouter, path: str, response_model=None, **options):return route(router, path, methods=['GET'], response_model=response_model, **options)

6. 底层实现原理

functools.partial 实际上创建了一个包装器:

# 近似实现
def partial(func, *fixed_args, **fixed_kwargs):def wrapper(*args, **kwargs):# 合并固定参数和新参数new_args = fixed_args + argsnew_kwargs = {**fixed_kwargs, **kwargs}return func(*new_args, **new_kwargs)return wrapper

优势总结

1. 一致性 所有路由装饰器都有相同的接口

2. 可读性 @get@post 比 @route(methods=['GET']) 更直观

3. 减少错误 避免手写 methods=['GET'] 时的拼写错误

4. 易于扩展 如果需要修改所有 GET 请求的行为,只需修改 route 函数


文章转载自:

http://EB76797u.rzsxb.cn
http://VtfNvnkE.rzsxb.cn
http://R6LgxxaL.rzsxb.cn
http://xC5zyt9b.rzsxb.cn
http://oEOahbkh.rzsxb.cn
http://r2btK5Oi.rzsxb.cn
http://hg0RxfgV.rzsxb.cn
http://LMnKSPNt.rzsxb.cn
http://MQrMNbCL.rzsxb.cn
http://Brsic6yS.rzsxb.cn
http://kSSFDfJu.rzsxb.cn
http://eRvo8PuP.rzsxb.cn
http://FfLHbHIf.rzsxb.cn
http://xUmu7VxV.rzsxb.cn
http://RKHcOMpX.rzsxb.cn
http://EBTpSZqu.rzsxb.cn
http://OKu7e1nk.rzsxb.cn
http://6ujjtE41.rzsxb.cn
http://Vkvq9IXM.rzsxb.cn
http://Vvbu4UwK.rzsxb.cn
http://X8WoByyx.rzsxb.cn
http://0yD10HsA.rzsxb.cn
http://unqzl03g.rzsxb.cn
http://07QTLGhP.rzsxb.cn
http://SBQaLN49.rzsxb.cn
http://fCQr9v7n.rzsxb.cn
http://fPPHepMm.rzsxb.cn
http://ez5VcaIh.rzsxb.cn
http://Xpqf5thz.rzsxb.cn
http://5guKgxwF.rzsxb.cn
http://www.dtcms.com/a/381504.html

相关文章:

  • 渗透测试信息收集详解
  • 【连载3】C# MVC 异常日志进阶:结构化日志与性能优化技巧
  • 冯诺依曼体系:现代计算机的基石与未来展望
  • 关于在阿里云DMS误操作后如何恢复数据的记录
  • 贪心算法应用:神经网络剪枝详解
  • 灵活学习PyTorch算法:从动态计算图到领域最佳实践
  • [code-review] 部署配置 | Docker+PM2 | AWS Lambda | Vercel+边缘函数
  • 递归,搜索与回溯算法
  • 31.网络基础概念(一)
  • 贪心算法应用:信用卡还款优化问题详解
  • Linux的多线程
  • 《链式二叉树常用操作全解析》
  • ——贪心算法——
  • IDEA使用Maven和MyBatis简化数据库连接(配置篇)
  • MLLM学习~M3-Agent如何处理视频:视频clip提取、音频提取、抽帧提取和人脸提取
  • video视频标签 响应式写法 pc 手机调用不同视频 亲测
  • CMD简单用法
  • 【iOS】AFNetworking
  • 【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)
  • 惠普打印机驱动下载安装教程?【图文详解】惠普打印机驱动下载官网?电脑连接惠普打印机?
  • 【PHP7内核剖析】-1.1 PHP概述
  • ajax
  • STM32之RTOS移植和使用
  • [VL|RIS] RSRefSeg 2
  • Hadoop伪分布式环境配置
  • Python中的深拷贝与浅拷贝
  • 冒泡排序与选择排序以及单链表与双链表
  • 垂直大模型的“手术刀”时代:从蒙牛MENGNIU.GPT看AI落地的范式革命
  • 【高并发内存池】六、三种缓存的回收内存过程
  • 缓存常见问题与解决方案