高阶函数
什么叫高阶函数 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
举例 变量指向函数 f=abs abs(-10) f(-10) 传入函数作为另一函数的参数 def add(x,y,f): return f(x)+f(y)
内置高阶函数
1)lambda函数
定义:匿名函数,当需要一个函数,但是不需要这个函数的名字的时候,则可以通过lambda表达式来实现 通过lambda表达式,减少程序中的函数名字和代码量,实现更简洁的代码
语法
lambda 参数:表达式 lambda x, y: x + y
例
lambda x, y: x + y 等价于 >>> def sum(x, y): ... return x + y ... >>> sum(1,2) 3 >>> a = lambda x, y: x + y >>> a(1, 2) 3
2)map函数
定义:map函数接收两个参数,第一个是函数,第二个是列表(可迭代对象) 将函数作用在序列的每个元素上, 然后创建由每次函数应用组成的返回值列表 map函数能够用列表解析表达式来实现
语法
map( 函数,列表)
举例
>>> map((lambda x: x*x), [1,2,3]) >>> def f(x): ... return x * x ... >>> l = [1,2,3] >>> map(f,l) [1, 4, 9] [1, 4, 9] 列表解析实现 >>> [x * x for x in [1,2,3]] [1, 4, 9]
3)reduce和函数
定义:reduce跟map类似,也是接收函数和列表
区别:reduce将列表中两个元素放入函数计算并得到值,然后将此值与列表的下一个元素放入函数计算得到另外一个值 reduce这种“折叠”的处理方式,最终可以得到一个值 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
语法:
reduce( 函数,列表) reduce每次从列表中取出2个元素放入函数 reduce(func, [1, 2, 3]) func(func(1, 2), 3)
举例:
1.序列求和的reduce实现 >>> def add(x, y): ... return x + y ... >>> reduce(add, [1, 3, 5, 7, 9]) >>> reduce( , [1, 3, 5, 7, 9]) 25 2.数字列表转换成数[1,3,5,7,9] ->13579 >>> def fn(x, y): ... return x * 10 + y ... >>> reduce(fn, [1, 3, 5, 7, 9]) 13579 3.对2改进实现str转换成int >>> def fn(x, y): ... return x * 10 + y ... >>> def char2num(s): ... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] ... >>> reduce(fn, map(char2num, '13579')) 13579 4.最终整理成一个str2int函数 def str2int(s): def fn(x, y): return x * 10 + y def char2num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] return reduce(fn, map(char2num, s)) 5.用lambda简化 def str2int(s): return reduce(lambda x,y: x*10+y, map(lambda s:{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s], s))
4)filter函数
定义 filter函数是一个过滤函数,根据True或False来决定最终结果,如果是True则保留下来
语法:
filter( 函数,列表)
举例
保留正数 >>> def Pos(n): ... return n > 0 ... >>> filter(Pos,[-1, 1, 0, -2, 3]) [1, 3] 去掉偶数 >>> def odd(n): ... return n % 2 == 1 ... >>> filter(odd,range(10)) [1, 3, 5, 7, 9]
返回函数
定义 函数作为结果被输出 内置函数中如map函数,是将函数作为输入
举例
>>> def sum2(x, y): ... def sum1( ): ... return x + y ... return sum1 ... >>> s = sum2(1, 2) >>> s() 3 >>> s = sum2(1, 3) >>> s() 4 例2 >>> def closure( ): ... i = 10 ... def clo2( ): ... return i * i ... return clo2 ... >>> c = closure( ) >>> c <function clo2 at 0x10bc166e0> >>> c( ) 100
闭包 定义 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。 举例
>>> def sum2(x, y): ... def sum1( ): ... return x + y ... return sum1 ... 注:函数sum1调用函数sum2的变量x,y
装饰器(Decorator)
定义 装饰器(Decorator)采用函数作为参数,然后对此函数进行装饰,增强其功能 装饰器可以为函数增加功能,但是无需修改原有函数内部结构 装饰器是闭包的高阶应用,闭包是内部函数调用外部函数的变量,装饰器是调用函数
语法
定义装饰器 def deco(func): def wrapper( ): 函数体包括func( ) return wrapper 定义函数 def func( ): 函数体 装饰函数 @deco 带参数的装饰器 不带参数的装饰器 def func( ) 函数体
举例
例1 不带参数的装饰器 >>> def deco(func): ... def wrapper(): ... print 'this is a decorator!' ... return func() ... return wrapper ... >>> @deco ... def f1(): ... print 'this is a function!' ... >>> f1() this is a decorator! this is a function! 注明 本质上看,上面的装饰器的作用相当于 f1= deco( f1 ) f1函数作为deco函数的输入 例2 带参数的装饰器 >>> def deco(func): ... def wrapper(n): ... print 'this is a decorator!', n ... return func(n) ... return wrapper ... >>> @deco ... def f1(n): ... print 'this is a function!' ... >>> f1('test') this is a decorator! test this is a function! >>> f1('test2') this is a decorator! test2 this is a function
递归函数
定义:若函数内部调用自身,则这个函数便是递归函数
语法
factorial(N) = N! = N * (N-1)! = N * (N-1) * (N-2)! : = N * (N-1) * (N-2) ... * 3 * 2 * 1 为了获得 factorial(N)的值, 需要计算 factorial(N-1);为了找到 factorial(N-1), 需要计算 factorial(N-2)等……
举例
计算阶乘n! >>> def fact(n): ... if n == 1: ... return 1 ... else: ... return n * fact(n - 1) ... >>> fact(5) 120
生成器
定义 在 Python 中,带有 yield 的函数被称之为 generator(生成器) 生成器是特定的函数, 允许返回一个值, 然后"暂停"代码的执行, 稍后恢复 使用yield语句一次返回一个结果,在每个结果之间挂起和继续它们的状态 通过生成器,可以节省内存空间,使得函数结果散落在不同时间的请求上
语法
yield vs return return返回结果并结束函数 yield返回结果并挂起当前状态,并于下次再次执行
举例
例1 编写生成器函数 >>> def num( ): ... print 'first' ... yield 1 ... print 'second' ... yield 2 ... print 'Third' ... yield 3 ... print 'Over' ... 生成生成器对象 >>> n = num() 通过next()函数调用 >>> next(n) first 1 >>> next(n) second 2 >>> next(n) Third 3 >>> next(n) Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration Over 例2 >>> def squars(N): ... for i in range(N): ... yield i ** 2 ... >>> s = squars(5) >>> s.next() 0 >>> s.next() 1 >>> s.next() 4 >>> s.next() 9 >>> s.next() 16 >>> s.next() Traceback (most recent call last): File "<input>", line 1, in <module> StopIteration
来源:oschina
链接:https://my.oschina.net/u/4442211/blog/3211415