python笔记三:函数式编程

时间:2023-03-09 17:20:34
python笔记三:函数式编程

1.概念:

  函数式编程就是一种抽象程度很http://i.cnblogs.com/EditPosts.aspx?opt=1高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作 用的。

  函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

2.高阶函数:一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。

  1)变量可以指向函数:函数本身也可以赋值给变量,即:变量可以指向函数

  f = abs

  >>> f(-10)

  2)函数名也是变量:

  abs = 10

  >>> abs(-10)出错

  把abs指向10后,就无法通过abs(-10)调用该函数了!因为abs这个变量已经不指向求绝对值函数了!

  3)传入函数:

  def add(x, y, f):

    return f(x) + f(y)

  4)map/reduce:

  map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。map()作为高阶函数,它把运算规则抽象了。

  实例:实现x*x

  def f(x):

    return x * x

  >>>map(f,[1,2,3,4,5])

  [1, 4, 9, 16, 25]

  reduce()把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

  即reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

  def fn(x, y):

    return x * 10 + y

  >>>reduce(fn, [1, 3, 5, 7, 9])

  13579

  5)filter:

  filter()函数用于过滤序列,filter()也接收一个函数和一个序列,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

  def is_odd(n):

    return n % 2 == 1

  >>>filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])

  [1, 5, 9, 15]

  6)sorted:

  def reversed_cmp(x, y):

    if x > y:

      return -1

    if x < y:

      return 1

  return 0

  >>>sorted([36, 5, 12, 9, 21], reversed_cmp)

3.返回函数:高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

  1)函数作为返回值:

  def lazy_sum(*args):

    def sum():

      ax = 0

      for n in args:

        ax = ax + n

      return ax

  return sum

  2)闭包:

  返回的函数在其定义内部引用了局部变量args,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

4.lambda:

  lambda表示匿名函数,冒号前面的x表示函数参数,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

  >>>map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])

5.装饰器:假设我们要增强某个函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

  def now():

    print '2013-12-25'

  >>>now.__name__  #可以获得函数名

  def log(func):

    def wrapper(*args, **kw):

      print 'call %s():' % func.__name__

      return func(*args, **kw)

    return wrapper

  @log

  def now():

    print '2013-12-25'

6.偏函数:

  functools.partial():把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。