《(本科)第10章函数式编程 ppt课件.ppt》由会员分享,可在线阅读,更多相关《(本科)第10章函数式编程 ppt课件.ppt(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、课程主讲人:第10章 函数式编程 第第10章章 函数式编程函数式编程 主讲主讲 夏敏捷夏敏捷什么是函数式编程 函数函数式编程Functional Programming,是一种编程的基本风格,也就是构建程序结构的方式。函数式编程虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算,也就是可以使用表达式编程。 函数式编程的一个特点就是,允许把函数本身函数本身作为参数参数传入另一个函数,还允许返回一个函数一个函数。Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。10.1 高阶函数 1. 1. 高阶函数概念高阶函数概念高阶函数它是可以
2、将其他函数作为参数或返回结果的函数。例如,定义一个简单的高阶函数:def add(x, y, f): return f(x) + f(y) add(-5, 9, abs) #abs(-5) + abs(9)add(65, 66, chr) #AB10.1 高阶函数 1. 1. 返回函数返回函数高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。def calc_sum(*args): ax = 0 for n in args: ax = ax + n return axdef lazy_sum(*args): def sum(): ax = 0 for n in args: ax
3、= ax + n return ax return sum f = lazy_sum(1, 3, 5, 7, 9) ffunction lazy_sum.sum at0 x101c6ed90 f()25当当lazy_sum返回函数返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为时,相关参数和变量都保存在返回的函数中,这种称为闭包闭包(Closure)闭包 y=ax+b y=ax+b 编写函数计算编写函数计算y y的值。的值。 def line_conf(a,b): def line(x): return a*x+b return line line_one=line_conf(3
4、,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.2 Python函数式编程常用的函数 1 1map()map()函数函数map()是 Python 内置的高阶函数,有2个参数,一个是函数f(),一个是列表list,并通过把函数f()依次作用在 list 的每个元素上,得到一个新的新的 list list作为map()函数的返
5、回结果。def f(x): return x*xlist1= map( f, 1, 2, 3, 4, 5, 6, 7, 8, 9 )print (list(list1)1, 4, 9, 10, 25, 36, 49, 64, 8110.2 Python函数式编程常用的函数 1 1map()map()函数函数map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。list1= 2, 4, 6, 8, 10list2 = map(lambda x: x * 2, list1)for e in list2: print(e,e
6、nd=,) # 结果是:4,16,36,64,100, list1= china, japan,hello list2 = map(lambda x: x.title(), list1) #title()首字母大小for e in list2: print(e,end=,) # 结果是:China,Japan,Hello,10.2 Python函数式编程常用的函数 2 2reduce()reduce()函数函数reduce()函数接收的参数和map()类似,一个函数f(),一个列表list,但reduce()传入的函数f()必须接收两个两个参数。reduce()对列表list的每个元素反复调用
7、函数f(),并返回最终结果值。from functools import reducedef f(x, y): return x + yreduce()还可以接收第3个可选参数,作为计算的初始值。reduce(f, 1, 3, 5, 7, 9, 100)结果将变为125。reduce(f, 1, 3, 5, 7, 9)结果为25。10.2 Python函数式编程常用的函数 3 3filter()filter()函数函数filter()函数接收一个函数f()和一个list,这个函数f()的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元
8、素,返回由符合条件元素组成的新list。def is_odd(x): return x % 2 = 1利用filter()过滤掉偶数:filter(is_odd, 1, 4, 6, 7, 9, 12, 17) #结果 1, 7, 9, 17def is_odd(x): if x % 2 = 1: return True else: return False10.2 Python函数式编程常用的函数 4 4zip()zip()函数函数zip()函数以一系列列表作为参数,将列表中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。a = 1,2,3b = 4,5,6zipped = zip(
9、a,b)for element in zipped: print(element)(1, 4)(2, 5)(3, 6)10.2 Python函数式编程常用的函数 5 5sorted()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函数返回的结果排序。sor
10、ted(36, 5, -12, 9, -21,key=abs) #结果是5, 9, -12, -21, 36students = (john, A, 15), (jane, B, 12), (dave,B, 10)sorted(students, key=lambda s: s2) #按照年龄来排序10.2 Python函数式编程常用的函数 5 5sorted()sorted()函数函数Python内置的 sorted()函数可对list进行排序:sorted(36, 5, 12, 9, 21) #默认升序,所以结果是5, 9, 12, 21, 36但 sorted()也是一个高阶函数,Pyt
11、hon3.7中它的格式如下:sorted(list,key=None,reverse=False)key指定的函数将作用于list的每个元素上,并根据key函数返回的结果排序。sorted(36, 5, -12, 9, -21,key=abs) #结果是5, 9, -12, -21, 36students = (john, A, 15), (jane, B, 12), (dave,B, 10)sorted(students, key=lambda s: s2) #按照年龄来排序10.3 迭代器迭代器是访问集合内元素的一种方式。迭代器是访问集合内元素的一种方式。迭代器对象从序列(列表、元组、字典
12、、集合)的第一个元素开始迭代器对象从序列(列表、元组、字典、集合)的第一个元素开始访问,直到所有的元素都被访问一遍后结束。迭代器不能访问,直到所有的元素都被访问一遍后结束。迭代器不能回退回退,只,只能能往前往前进行迭代。进行迭代。使用内建函数使用内建函数iter(iterable)iter(iterable)可以获取序列的迭代器对象,方法如下:可以获取序列的迭代器对象,方法如下: 迭代器对象迭代器对象 = iter(= iter(序列对象序列对象) )使用使用next()next()函数可以获取迭代器的下一个元素,如下:函数可以获取迭代器的下一个元素,如下: next( next(迭代器对象迭
13、代器对象) )list = china,Japan, 333it = 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, 18sum = 0for i in range(len(list): if list i0: sum += list iprint(sum)from functools import reducelist =2, -6, 11, -7, 8, 15, -14, -1, 10, -13, 18sum = filter(lambda x: x0, list)s = reduce(lambda x,y: x+y, sum)print(s)通过对比,函数式编程具有如下特点:(1)代码更简单代码更简单。数据,操作和返回值都放在一起。(2) 没有循环体,几乎没有临时变量没有循环体,几乎没有临时变量,也就不用分析程序的流程和数据变化过程了。(3)代码用来实现做什么,而不是怎么去做。
限制150内