<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        版權申明:本文為博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須注明原文網址
      
        http://www.rzrgm.cn/Colin-Cai/p/12977127.html 
      
        作者:窗戶
      
        QQ/微信:6679072
      
        E-mail:6679072@qq.com

        理論上,函數是一等公民(first class function)的語言都可以使用函數式編程,從而利用算子(高階函數)來做裝飾器。

        裝飾器一般是這樣一個算子,它接受一個函數作為參數,返回另外一個函數。裝飾器,顧名思義,就是把一個函數“裝飾”一下,得到另外一個函數。為何要裝飾一下呢?目的一般是可能設計上需要對函數做一些改裝,比如原函數輸出結果需要再加工加工,或者原函數的輸入參數傳入不一樣,或者兩者兼有之,等等。

       

        迭代是編程中常用的手段,它的計算方式表現為狀態的不斷變換,且狀態的變換具有唯一性。

        比如我們使用Scheme來表示迭代。

      ;stat代表當前狀態,next代表狀態改變函數,final?代表判斷狀態是否終止
      (define (iterate-orgin stat next final?)
        (if (final? stat)
            stat
            (iterate-orgin (next stat) next final?)))
      
      ;將next函數和final?函數封成一個函數
      (define (iterate stat f-stat)
        (iterate-orgin stat (f-stat 'next) (f-stat 'final)))
      
      ;最終我們需要的迭代函數
      (define (it f-stat)
        (lambda (stat) (iterate stat f-stat)))

        

        以上構造出一個算子it,就是用來“裝飾”迭代的函數。

        我們構造一個對list求和的迭代:

        可以每次把list的前面兩個相加,比如對(1 2 3 4 5)求和,經過以下狀態:

        (1 2 3 4 5)

        (3 3 4 5)

        (6 4 5)

        (10 5)

        (15)

        15

        得到最后結果15。

        代碼可以如下:

      (define (make-sum-func sym)
       (if (eq? sym 'next);next函數
        (lambda (lst)
         (if (pair? lst)
          (if (null? (cdr lst))
           (car lst)
           (cons (+ (car lst) (cadr lst)) (cddr lst)))
          lst))
        (if (eq? sym 'final?);final?函數
         (lambda (lst) (not (pair? lst)))
         '())))

       

        然后測試一下((it make-sum-func) '(1 2 3 4 5)),得到最后結果15。

        上面兩個函數寫在一起,我們還可以再分離一下。

        

      ;定義一個打包函數
      (define (wrap-next-final next final?)
       (lambda (sym)
        (if (eq? sym 'next)
         next
         (if (eq? sym 'final?)
          final?
          '()))))
      
      ;下面next和final?兩個函數可以分開寫
      (define make-sum-next
       (lambda (lst)
        (if (pair? lst)
         (if (null? (cdr lst))
          (car lst)
          (cons (+ (car lst) (cadr lst)) (cddr lst)))
         lst)))
      
      (define make-sum-final?
       (lambda (lst) (not (pair? lst))))
      
      ;于是函數就可以下面這樣表示
      (define make-sum-func (wrap-next-final make-sum-next make-sum-final?))

       

        總而言之,裝飾器就是這樣一類算子。

       

        Python也是這樣,只是Python提供了@這樣的語法,實際上是個語法糖,與其說是簡寫,倒是更像是個語法提醒這是一個裝飾器。

        我們這次希望來顯示一下mysym,還是用求和。

        先寫一個簡單的mysum函數用于求和: 

      def mysum(*args):
          ret = 0
          for i in args:
              ret += i
          return ret

       

        做一個算子,來擴充它的輸入參數:

        這里需要用來判斷一個對象是否是可迭代對象,

        from collections import Iterable

        然后,如果判斷對象x是否是可迭代對象,只需要:

        isinstance(x, Iterable)

        算子如下:

      from collections import Iterable
      def args_expan(f):
          def f2(*args):
              lst = []
              for i in args:
                  if isinstance(i, Iterable):
                      lst.append(f(*i))
                  else:
                      lst.append(i)
              return f(*lst)
          return f2

       

        然后在mysum前添加裝飾器標志

      @args_expan
      def mysum(*args):
          ret = 0
          for i in args:
              ret += i
          return ret

       

        測試如下:

      print(mysum(1,2,3,4,5))
      print(mysum((1,2,3,4,5)))
      print(mysum([1,2,3,4,5]))
      print(mysum(range(1,6)))
      print(mysum(map(lambda x:x+1, range(5))))
      print(mysum(filter(lambda x:x<6, range(10))))
      
      #構造了一個生成器
      def gen_range(a, b):
          while a < b:
              yield a
              a += 1
      
      print(mysum(\
          filter(lambda x:x<6, range(10)), \
          6, \
          [7,8], \
          (9, 10), \
          map(lambda x:x+11, range(10)), \
          gen_range(21,101)))

       

        運行得到:

      15
      15
      15
      15
      15
      15
      5050

        終于看到,函數功能已被擴充。

        這個裝飾器還可以裝飾別的函數,比如乘積、統計等。

       

        從而,裝飾器就是這樣一個算子,一般用來改造函數的輸入或輸出,避免重復寫代碼。

      posted on 2020-05-31 13:50  窗戶  閱讀(444)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 精品综合久久久久久98| 亚洲人成亚洲人成在线观看| 偷拍专区一区二区三区| 无码少妇一区二区三区免费| 免费无码国模国产在线观看| 韩国三级+mp4| 久久久久青草线蕉亚洲| 门国产乱子视频观看| 日本熟妇人妻一区二区三区| 柘城县| 无码福利写真片视频在线播放| 色猫咪av在线网址| 亚洲一区二区精品极品| 香蕉亚洲欧洲在线一区| 三上悠亚日韩精品二区| 亚洲日本精品国产第一区| 东京热人妻无码一区二区av| 亚洲黄色一级片在线观看| 部精品久久久久久久久| 国产精品视频免费一区二区| 色噜噜亚洲男人的天堂| 焦作市| 加勒比中文字幕无码一区| 色就色中文字幕在线视频| 天天澡日日澡狠狠欧美老妇| 强插少妇视频一区二区三区| 免费看婬乱a欧美大片| 久久99精品久久久久久9| 国产精品一区二区三区污| 黑人巨大av无码专区| 国产在线精品中文字幕| 成人性影院| 久久亚洲精品11p| 中国女人和老外的毛片| 在线看国产精品自拍内射| 国产成人一区二区三区| 人妻中文字幕不卡精品| 国产精品自在拍首页视频8| 亚洲色最新高清AV网站| 免费观看全黄做爰大片| 久久夜色精品国产亚av|