第10章 函数式编程_第1页
第10章 函数式编程_第2页
第10章 函数式编程_第3页
第10章 函数式编程_第4页
第10章 函数式编程_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章函数式编程主讲夏敏捷什么是函数式编程函数式编程——FunctionalProgramming,是一种编程的基本风格,也就是构建程序结构的方式。函数式编程虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算,也就是可以使用表达式编程。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。10.1高阶函数1.高阶函数概念高阶函数它是可以将其他函数作为参数或返回结果的函数。例如,定义一个简单的高阶函数:defadd(x,y,f):returnf(x)+f(y)

add(-5,9,abs)#abs(-5)+abs(9)add(65,66,chr)#AB10.1高阶函数1.返回函数高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。defcalc_sum(*args):ax=0forninargs:ax=ax+nreturnaxdeflazy_sum(*args):

defsum():ax=0forninargs:ax=ax+nreturnax

returnsum>>>f=lazy_sum(1,3,5,7,9)>>>f<functionlazy_sum.<locals>.sumat0x101c6ed90>>>>f()25当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为闭包(Closure)闭包y=ax+b编写函数计算y的值。defline_conf(a,b):defline(x):returna*x+breturnline>>>line_one=line_conf(3,4)>>>line_two=line_conf(4,6)>>>line_one(5)#结果19>>>line_two(5)#结果26上述代码中line_conf是外部函数,a、b是它的参数。line(x)是内部函数,x是它的参数。在line(x)的内部通过外部函数的a、b确定闭包最终形式。闭包具有提过代码可复用性的作用。10.2Python函数式编程常用的函数1.map()函数map()是Python内置的高阶函数,有2个参数,一个是函数f(),一个是列表list,并通过把函数f()依次作用在list的每个元素上,得到一个新的list作为map()函数的返回结果。deff(x):returnx*xlist1=map(f,[1,2,3,4,5,6,7,8,9])print(list(list1))[1,4,9,10,25,36,49,64,81]10.2Python函数式编程常用的函数1.map()函数map()不仅仅可以处理只包含数值的list,事实上它可以处理包含任意类型的list,只要传入的函数f可以处理这种数据类型。list1=[2,4,6,8,10]list2=map(lambdax:x**2,list1)foreinlist2:print(e,end=",")#结果是:4,16,36,64,100,list1=["china","japan","hello"]list2=map(lambdax:x.title(),list1)#title()首字母大小foreinlist2:print(e,end=",")#结果是:China,Japan,Hello,10.2Python函数式编程常用的函数2.reduce()函数reduce()函数接收的参数和map()类似,一个函数f(),一个列表list,但reduce()传入的函数f()必须接收两个参数。reduce()对列表list的每个元素反复调用函数f(),并返回最终结果值。fromfunctoolsimportreducedeff(x,y):returnx+yreduce()还可以接收第3个可选参数,作为计算的初始值。reduce(f,[1,3,5,7,9],100)结果将变为125。reduce(f,[1,3,5,7,9])结果为25。10.2Python函数式编程常用的函数3.filter()函数filter()函数接收一个函数f()和一个list,这个函数f()的作用是对每个元素进行判断,返回True或False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。defis_odd(x):returnx%2==1利用filter()过滤掉偶数:filter(is_odd,[1,4,6,7,9,12,17])#结果[1,7,9,17]10.2Python函数式编程常用的函数4.zip()函数zip()函数以一系列列表作为参数,将列表中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。a=[1,2,3]b=[4,5,6]zipped=zip(a,b)forelementinzipped:print(element)(1,4)(2,5)(3,6)10.2Python函数式编程常用的函数5.sorted()函数Python内置的sorted()函数可对list进行排序:>>>sorted([36,5,12,9,21])#默认升序,所以结果是[5,9,12,21,36]但sorted()也是一个高阶函数,Python3.7中它的格式如下:sorted(list,key=None,reverse=False)key指定的函数将作用于list的每个元素上,并根据key函数返回的结果排序。sorted([36,5,-12,9,-21],key=abs)#结果是[5,9,-12,-21,36]students=[('john','A',15),('jane','B',12),('dave','B',10)]sorted(students,key=lambdas:s[2])#按照年龄来排序10.2Python函数式编程常用的函数5.sorted()函数Python内置的sorted()函数可对list进行排序:>>>sorted([36,5,12,9,21])#默认升序,所以结果是[5,9,12,21,36]但sorted()也是一个高阶函数,Python3.7中它的格式如下:sorted(list,key=None,reverse=False)key指定的函数将作用于list的每个元素上,并根据key函数返回的结果排序。sorted([36,5,-12,9,-21],key=abs)#结果是[5,9,-12,-21,36]students=[('john','A',15),('jane','B',12),('dave','B',10)]sorted(students,key=lambdas:s[2])#按照年龄来排序10.3迭代器迭代器是访问集合内元素的一种方式。迭代器对象从序列(列表、元组、字典、集合)的第一个元素开始访问,直到所有的元素都被访问一遍后结束。迭代器不能回退,只能往前进行迭代。使用内建函数iter(iterable)可以获取序列的迭代器对象,方法如下:

迭代器对象=iter(序列对象)使用next()函数可以获取迭代器的下一个元素,如下:next(迭代器对象)list=['china','Japan',333]it=iter(list)#获取迭代器对象print(next(it))print(next(it))print(next(it))chinaJapan33310.4普通编程方式与函数式编程的对比【例10-2】以普通编程方式计算列表元素中正数之和。list=[2,-6,11,-7,8,15,-14,-1,10,-13,18]sum=0foriinrange(len(list)):iflist[i]>0:sum+=list[i]print(sum)fromfunctoolsimportreducelist=[2,-6,11,-7,8,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论