2021-02-09

函数科里化(Function Currying)

即 部分绑定函数。柯里化的函数会先部分求值,即currying函数先接受一些参数,但是不会马上求值,而是返回另一个函数,刚刚传入的参数会形成闭包被保护起来,等到原本的currying函数真正求值的时候,之前传入的所有参数都会被用来求值。
通俗地说,就是一次性传给currying函数部分参数来调用它,返回另一个函数去处理剩下的参数。
例如:

def make_adder(n):
    return lambda k: n + k
make adder(2)(3)
add(2,3)

数据抽象( Data Abstraction)

The general technique of isolating the parts of a program that deal with how data are represented from the parts that deal with how data are manipulated is a powerful design methodology called data abstraction。
数据抽象是一种把项目中展示数据的部分项目中操控数据的部分隔离开来的强大设计方法。也就是不关心如何运作
2021-02-09_第1张图片
例如进行有理数的运算时(如1/2 + 2/3),最高层是计算真值的函数add_rational, 第二层是代表分子与分母的操作符,最底层是储存数据的数组[1,2],[2,3]。在求值过程中,上面的层可以调用下面的层的函数,而下面的层不能调用上面的层,否则会产生越界。
例如计算x的幂:

  • 正确示例:
# 应该调用第一层mul_rational实现
>>> def square_rational(x):
        return mul_rational(x, x)
  • 一次抽象越界示例:
""" 
rational 
x = [1 , 3]
rational(1 * 1, 3 * 3)  return [1, 9] 
"""
>>> def square_rational_violating_once(x):
        return rational(numer(x) * numer(x), denom(x) * denom(x))
  • 二次抽象越界示例:
"""
x = [1,3] [1,9]
"""
>>> def square_rational_violating_twice(x):
        return [x[0] * x[0], x[1] * x[1]]

All of these implementations of square_rational have the correct behavior, but only the first is robust to future changes. The square_rational function would not require updating even if we altered the representation of rational numbers. By contrast, square_rational_violating_once would need to be changed whenever the selector or constructor signatures changed, and square_rational_violating_twice would require updating whenever the implementation of rational numbers changed.
尽管三种示例结果都是的,但是第一种在遇到变化时,稳定性更强。

你可能感兴趣的:(2021-02-09)