纸箱 技术支持 东莞网站建设,新媒体包不包括公司网站的建设,广州网站开发,wordpress pc6对于中级Python开发者来说#xff0c;了解了Python的基础语法、库、方法#xff0c;能够实现一些功能之后#xff0c;进一步追求的就应该是写出优雅的代码了。 这里介绍一个很有趣的概念“柯里化”。 所谓柯里化#xff08;Currying#xff09;是把接受多个参数的函数变换…对于中级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))