python筆記三:函數式編程 -开发者知识库

python筆記三:函數式編程 -开发者知识库,第1张

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():把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單。

 

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复