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

【Python】如何在 Python 中使用“柯里化”编写干净且可重用的代码

对于中级Python开发者来说,了解了Python的基础语法、库、方法,能够实现一些功能之后,进一步追求的就应该是写出优雅的代码了。 这里介绍一个很有趣的概念“柯里化”。

所谓柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。
引自 百度百科

这里我们举一个例子:我们在初中的时候都学过自由落体,在不考虑风阻的情况下,物体在一定高度下落的时间是一定的。 计算公式是:时间 = 开平方(2 * 高度 / 重力加速度)

如果我们要用python实现这个函数

def fall_time(height)return math.sqrt(2 * height * 9.8)

但是实际上, 重力加速度G的值是随着纬度不同发生变化的。 我们中学的时候只是取了一个近似值。实际上当要求计算精度的时候, 赤道上应该是9.78,南北极是9.832。这中间可是差着0.5呢。

此时,我们有些同学觉得,这个简单,两个参数不就行了?于是就出现了如下方法:

def fall_time_with_ga(height, ga):return math.sqrt(2 * height * ga)

这样做虽然没问题, 但是写代码的时候参数太多了。 一旦你要计算多个数值的时候,就会出现如下的代码:

print(fall_time_with_ga(100, 9.80122))
print(fall_time_with_ga(200, 9.80122))
print(fall_time_with_ga(300, 9.80122))

还记得我们为什么学Python么?Python的重要特性之一就是优雅干净。为此田辛老师希望柯里化这个函数,降低函数的参数数量,这时候我们用到的内部函数的办法:

def fall_time_setup(ga:float):def fall_time(height:float):return math.sqrt(2 * height * ga)return fall_time

对于这个函数,相对来说调用的时候就简单多了。

beijing = fall_time_setup(9.80122)  # 首先设定重力加速度的值, 真正计算的时候只关心高度即可
print(beijing(100))
print(beijing(200))
print(beijing(300))

这样调用起来,思路就清晰多了。

那有些同学可能会说, 调用思路清晰了。 可是函数本身复杂了呀。 整个函数本来两行的,现在四行了,不优雅!!!

这里田辛老师就要说,用后一种方法函数体写成两行也没问题。

仔细观察改造后的这个函数。 fall_time这个内部函数的函数名是不是在调用的时候自始至终没有被使用过?我们是不是可以用一个匿名函数去取代它。 要知道,Python是支持lambda的呦~

lambda的语法是:lambda arguments : expression

于是,新的函数诞生了:

def fall_time_setup_bylambda(ga:float)->float:return lambda height : math.sqrt(2 * height * ga)

调用部分的代码,和刚才的调用一模一样。

OK,下面是前面所有的代码以及调用,可以直接保存 .py 文件看看效果。

# 如何在 Python 中使用“柯里化”编写干净且可重用的代码import mathdef fall_time(height: float) -> float:"""计算物体下落时间,强制按照北京的重力加速度设定:@param: height: 物体所处高度"""return math.sqrt(2 * height * 9.80122)print(fall_time(100))
print(fall_time(200))
print(fall_time(300))def fall_time_with_ga(height, ga):"""计算物体下落时间,考虑到重力加速发生变化,作为形参传入:@param: height: 物体所处高度"""return math.sqrt(2 * height * ga)print(fall_time_with_ga(100, 9.80122))
print(fall_time_with_ga(200, 9.80122))
print(fall_time_with_ga(300, 9.80122))def fall_time_setup(ga: float):"""计算物体下落时间,考虑到重力加速发生变化并且为了代码简洁,做了柯里化的处理:@param: height: 物体所处高度"""def fall_time(height: float):return math.sqrt(2 * height * ga)return fall_timebeijing = fall_time_setup(9.80122)  # 首先设定重力加速度的值, 真正计算的时候只关心高度即可
print(beijing(100))
print(beijing(200))
print(beijing(300))def fall_time_setup_bylambda(ga: float) -> float:"""计算物体下落时间,使用匿名函数"""return lambda height: math.sqrt(2 * height * ga)beijing = fall_time_setup_bylambda(9.80122)
print(beijing(100))
print(beijing(200))
print(beijing(300))
http://www.lryc.cn/news/7045.html

相关文章:

  • ROS笔记(4)——发布者Publisher与订阅者Subscribe的编程实现
  • Linux进程概念(一)
  • Leetcode.1124 表现良好的最长时间段
  • 达梦数据库会话、事务阻塞排查步骤
  • sqlServer 2019 开发版(Developer)下载及安装
  • 使用Arthas定位问题
  • 性能测试之tomcat+nginx负载均衡
  • 【手写 Vuex 源码】第十一篇 - Vuex 插件的开发
  • opencv基础知识和绘图图形
  • 15- 决策回归树, 随机森林, 极限森林 (决策树优化) (算法)
  • Flink相关的记录
  • 配置可视化-基于form-render的无代码配置服务(一)
  • Java 代理模式详解
  • 知识付费小程序怎么做_分享知识付费小程序的作用
  • 14- 决策树算法 (有监督学习) (算法)
  • 如何编译和运行C++程序?
  • Golang 给视频添加背景音乐 | Golang工具
  • 让AI护理医疗:解决卫生系统的痛点
  • Windows 离线安装 MySQL 8
  • 【前端攻城狮之vue基础】02路由+嵌套路由+路由query/params传参+路由props配置+replace属性+编程式路由导航+缓存路由组件
  • CHAPTER 1 Zabbix介绍及安装
  • 认识V模型、W模型、H模型
  • excel ttest检测
  • PDFPrinting.Net操作进行细粒度控制
  • SegPGD
  • ESP-IDF + Vscode ESP32 开发环境搭建以及开发入门
  • SpringMvc的请求和响应
  • 【Vue3】首页主体-面板组件封装
  • 部署 K8s 集群
  • 关于北京君正:带ANC的2K网络摄像头用户案例