极客饕餮 2018-09-17 16:55:05 ラムジ - PLANET.mp3 04:07.537000000000006 来自极客饕餮 每天坚持系统学习python,我在路上 一 高阶函数函数式编程的关键是高阶函数,高阶函数将其他函数作为参数,或将其作为参数返回. 例如: def apply_twice(func,arg): return func(func(arg)) def add_five(x): return x+5 print(apply_twice(add_five,10)) 结果:20 函数apply_twice将另一个函数add_five作为参数,并在其内部调用两次. 二 纯函数函数式编程试图使用纯函数.纯函数没有副作用,并且返回一个仅依赖于它们的参数的值. 这是数学工作中的函数:例如,对于相同的x,cos(x)总是返回相同的结果. 纯函数的例子: def pure_function(x,y): temp=x+2*y return temp/(2*x+y) 非纯函数的例子: some_list=[] def impure(arg): some_list=append(arg) 上面的函数就不是纯函数,因为它改变了some_list的状态. 纯函数的优缺点: 优点: --更容易推理和测试. --更高效.一旦函数有一个输入,结果可以被存储并在下一次需要该输入的函数时被引用. 从而减少函数被调用的次数.这被称为memoization. --更容易并行运行 缺点:使得I/O的其他简单任务复杂化. 在某些情况下,它们将更难编写. 三 lambda表达式正常创建一个函数(使用def)会自动将其分配给一个变量. 这与其他对象(如字符串和整数)的创建不同,它们可以在运行中创建,而不必将其分配给变量. 使用lambda语法创建函数.这种方式创建的函数被称为匿名函数. 将一个简单函数作为参数传递给另一个函数时,这种方法最常用. 语法如下: def my_func(f,arg): return f(arg) my_func(lambda x:2*x*x,5) lambda表达式没有命名函数强大.它们只能做单一表达的事情--通常相当于一行代码 例如: def polynomial(x): return x**2+5*x+4 print(polynomial(-4)) #lambda print((lambda x:x**2+5*x+4)(-4)) 结果: 0 0 在上面的代码中,我们创建了一个匿名函数,并用参数调用它 可以将lambda函数分配给变量,并像普通函数一样使用. 例如: double=lambda x:x*2 print(double(7)) 结果: 14 ★但是,很少这样做.用def定义一个函数通常会更好. 下面是一个例子: triple=lambda x:x*3 add=lambda x,y:x+y print(add(triple(3),4)) 结果:13 四 map和filter内置的函数map和filter是在列表(或类似的称为迭代的对象)上运行的非常有用的高阶函数 函数map接收一个函数和一个迭代器作为参数,并返回一个新的迭代器,该函数应用于每个参数. 例如: def add_five(x): return x+5 nums=[11,22,33,44,55] result=list(map(add_five,nums)) print(result) 结果: [16,27,38,49,60] 通过使用lambda语法,我们可以更容易地获得相同的结果, nums=[11,22,33,44,55] result=list(map(lambda x:x+5,nums)) print(result) 为了将结果转换为列表,我们使用了list函数 filter函数通过删除与谓词(一个返回布尔值的函数)不匹配的项来过滤一个迭代 例如: nums=[11,22,33,44,55] res=list(filter(lambda x:x%2==0,nums)) print(res) 结果: [22,44] 与map一样,如果要打印结果.必须将结果显式转换为列表. 下个例子:从列表中删除所有大于4的项目 nums=[1,2,,5,8,0,7,12] res=list(filter(lambda x:x<5,nums)) print(res) |
|