写点什么

Python 进阶 (十四) 高阶函数

  • 2022-10-12
    江苏
  • 本文字数:1845 字

    阅读完需:约 6 分钟

Python进阶(十四)高阶函数

一、前言

在慕课网完成了廖雪峰老师的《Python入门》与《Python进阶》两门基础课程。在此做一下简单的知识点小结。

二、函数式编程

Python特点:


  • 不是纯函数式编程(允许变量存在);

  • 支持高阶函数(可以传入函数作为变量);

  • 支持闭包(可以返回函数);

  • 有限度的支持匿名函数;


高阶函数:


  • 变量可以指向函数;

  • 函数的参数可以接收变量;

  • 一个函数可以接收另一个函数作为参数;


def add(x,y,f):      return f(x)+f(y)  #14add(-5,9,abs)  
复制代码

三、内置高阶函数 map()

map 函数有两个参数,一个是函数,另一个是列表,返回值为对传入的列表中每一个元素执行传入的函数操作之后得到的列表;


def format_name(s):      return s.title()
print map(format_name, ['adam', 'LISA', 'barT'])
复制代码

四、内置高阶函数 reduce()

reduce函数也有两个参数,一个是函数,另一个是列表,返回值为对list的每一个元素反复调用函数f,得到最终结果,以下函数为连乘;


def prod(x, y):      return x*y;  
print reduce(prod, [2, 4, 5, 7, 12])
复制代码

五、内置高阶函数 filter()

filter函数接受函数参数 f 和列表参数lst,f 对 lst 元素进行判断,返回 lst 元素中调用 f 函数结果为 true 的元素组成的列表(将不满足 f 函数条件的元素过滤掉);


import math    def is_sqr(x):      return int(math.sqrt(x))*int(math.sqrt(x))==x    print filter(is_sqr, range(1, 101))  
复制代码

六、自定义排序函数 sorted()

sorted函数接受一个列表 lst 和一个函数参数 f,f 为自定义的比较 lst 元素大小的函数,返回值为 lst 中元素按 f 函数排列的列表;


def cmp_ignore_case(s1, s2):      return cmp(s1.lower(),s2.lower())  
print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
复制代码


返回函数:


def calc_prod(lst):      def prod(x,y):          return x*y;      def g():        return reduce(prod,lst)      return g;   f = calc_prod([1, 2, 3, 4])  print f()  
复制代码

七、闭包

内层函数使用外层函数的参数,然后返回内层函数;


def count():      fs = []      for i in range(1, 4):          def f(j):              def g():                return j*j;              return g          fs.append(f(i))      return fs  
f1, f2, f3 = count() print f1(), f2(), f3()
复制代码

八、匿名函数

传入函数参数不需要显式定义函数,可以用lambda x:statement x为参数,statement为对参数执行的语句;


def is_not_empty(s):      return s and len(s.strip()) > 0  
print filter(lambda s:s and len(s.strip())>0, ['test', None, '', 'str', ' ', 'END'])
复制代码

九、装饰器

给函数添加新功能,并简化该函数调用;

9.1 无参数装饰器

def log(f):     def fn(*args, **kw): #*args,**kw保证对任意个数参数都能正常调用          print 'call ' + f.__name__ + '()...'          return f(*args, **kw)    return fn @log   #调用日志装饰器  def factorial(n):      return reduce(lambda x,y: x*y, range(1, n+1))  #call factorial()...  #3628800  print factorial(10)  
复制代码

9.2 带参数装饰器

def log(prefix):      def log_decorator(f):          def wrapper(*args, **kw):              print '[%s] %s()...' % (prefix, f.__name__)              return f(*args, **kw)          return wrapper      return log_decorator   @log('DEBUG') #DEBUG为给装饰器传入的参数  def test():      pass  #[DEBUG] test()...  #None  print test()  
复制代码


利用 functool.wraps 作用在返回的新函数上,使得调用装饰器以后不改变原函数的信息


import time, functools  def performance(unit):      def perf_decorator(f):          @functools.wraps(f)          def wrapper(*args, **kw):              t1 = time.time()              r = f(*args, **kw)              t2 = time.time()              t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)              print 'call %s() in %f %s' % (f.__name__, t, unit)              return r          return wrapper      return perf_decorator   @performance('ms')  def factorial(n):      return reduce(lambda x,y: x*y, range(1, n+1))  print factorial.__name__  
复制代码

十、偏函数

functools.partial(f,f的默认参数) 减少需要提供给 f 的参数


import functools  int2 = functools.partial(int, base=2)  int2('1000000')  #64
复制代码


发布于: 刚刚阅读数: 4
用户头像

No Silver Bullet 2021-07-09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
Python进阶(十四)高阶函数_Python_No Silver Bullet_InfoQ写作社区