分享

python入门教程(七)函数式编程,匿名函数和map,filter函数

 静幻堂 2018-10-07
极客饕餮 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)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多