高阶函数及柯里化

文章目录

  • 高阶函数
    • 一等公民
    • 高阶函数
    • 过滤filter
    • 映射函数map
    • 柯里化

高阶函数

一等公民

  • 函数在python是一等公民(First-Class Object)
  • 函数也是对象,是可调用对象
  • 函数也可以作为普通变量,也可以作为函数的参数,返回值

高阶函数

  • 高阶函数(High-order Function)

  • 数学概念 y = f(g(x))

  • 在数学和计算机科学中,高阶函数应该是至少满足下面一个条件的函数

    1. 接受一个或者多个函数作为参数
    2. 输出一个函数
def counter(base):
    def inc(step=1):
        base += step
        return base
    return inc
  1. counter是高阶函数,因为函数返回了函数inc

  2. 上面代码有问题,base += step相当于base = base +step
    赋值即定义,inc函数内部重新定义了一个局部变量base,则函数内所有的base都是这个局部变量,但等式先算左边,base在执行+1操作时变量还未生成.回报错

  3. 只需在inc函数中用nonlocal声明base为非本地变量的外部局部变量即可

  4. 想要实现计数操作需要先用一个标识符接受生成的函数对象,再对函数对象调用即可
    即f1 = counter() ,f1()

  5. f1 = counter(5) f2 = counter(5) f1 ,f2相等吗?
    不相等,因为函数的每次调用都是独立的,不会相互影响,f1,f2是分别生成的两次函数对象.

练习:自定义sort函数

  • 思路:内建函数sorted函数,它返回一个新的列表,可以设置升序,或者降序,可以设置一个用于比较的函数
  • 新建一个列表,遍历原列表,和新列表中的当前值一次比较,决定待插入数插入到新列表的什么位置
def sorter1(iterabal,*,key=None, reverse=True):
    nums = []

    for i  in iterabal:
        ci = key(i) if key else i
        for k ,v in enumerate(nums):
            cv =  key(v) if key else v ##只用做比较,不改变k,v的值

            order = ci < cv if reverse else ci > cv
            if order:
                nums.insert(k,i)
                break
        else:
            nums.append(i)

    return(nums)
sorted(lst,key=lambda x:6-x) ##返回新列表   返回降序
list.sort(key=lambda x: 6-x)##就地修改

过滤filter

  • 定义: filter(function,iterable)

  • 对可迭代对象进行遍历,返回一个迭代器

  • function参数是一个参数的函数,且返回的应当是bool类型,或其返回值等效布尔值

  • function参数如果是None,可迭代对象的每一个元素自身等效布尔值

list(filter(lambda x: x%3==0,[1,9,55,150,-3,78,28] ))
#函数filter表示 遍历列表中所有项,在函数lambda中操作后,把返回True的数生成一个惰性的迭代器
list(filter(None,range(5)))
##遍历range(5)中的所有项,把等效为True的数重新生成一个惰性的迭代器
list(filter(None,range(-5,5)))

映射函数map

  • 定义 map(function,*iterabel)map object
  • 对多个可迭代对象的元素,按照指定的函数进行映射
  • 返回一个迭代器
dict(map(lambda x,y:(x,y),"abcde",range(10)))
#{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}  木桶

柯里化

  • 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程.新的函数返回一个以原有第二个参数为参数的函数

  • z = f(x,y)转换成 z=f(x)(y)的形式

例如

def add(x,y):
    return x + y
原来函数调用add(4,5),柯理化目标add(4)(5).如何实现
每一次括号说明是函数调用,说明add(4)(5)是两次函数调用

add(4)(5)
等价于
t = add(4)
t(5)

也就是说add(4)应该返回函数

def add(x):
    def _add(y):
        return x + y
     
    return _add
add(100,200)
  • 通过嵌套函数就可以吧函数转换成柯里化函数
def add(x):
    def _add(y,z):
        return x+y+z 
        
        
    return _add
add(4)(5,6)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def add(x):
    def _add(y):
        def inner(z):
            return x+y+z
        return inner
    return _add
add(4)(5)(6)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def add(x,y):
    def _add(z):
        return x+y+z
    return _add
add(4,5)(6)

你可能感兴趣的:(高阶函数及柯里化)