python筆記三:函數式編程

來源:互聯網
上載者:User

標籤:

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

 

python筆記三:函數式編程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.