<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] ## 1. 可變參數 > 1. 參數以一個*號開頭的代表著一個任意長度的元組(tuple),列表,變量,可以接收連續一串參數,如上面代碼里傳的是1,2,3,你可以更多。 > 2. 參數以兩個*號開頭的代表著一個字典,參數的形式是“key=value”,接受連續任意多個參數。 1. 實例 ~~~ def foo(x,a=1,**keys): print(x) print(a) print(keys) if __name__ == '__main__': foo("xxx",a="a",b="b",c="c") ~~~ 結果 ~~~ xxx a {'b': 'b', 'c': 'c'} ~~~ 2. 變參2 ~~~ class test: def param(self,x,*l,**t): print(x) print("l:",l) print("t:",t) print("name:",t.get('name')) if __name__ == '__main__': t1 = test() s = [1,'dd'] t1.param(12,s,'dailin',name='dailin',age=25) ~~~ 得到 ~~~ 12 l: ([1, 'dd'], 'dailin') t: {'name': 'dailin', 'age': 25} name: dailin ~~~ ## 2. 閉包 1. 什么是閉包 內部函數對外部函數作用域內變量的引用(非全局變量),則成內部函數為閉包。 2. 例如 ~~~ def test(number): def test_in(number_in): print("in test_in 函數, number_in is %d"%number_in) return number+number_in return test_in ~~~ ~~~ In [11]: ret = test(20) # 返回test_in函數(引用外部函數的number變量) ...: print(ret(100)) # 調用ret函數 ...: print(ret(200)) in test_in 函數, number_in is 100 120 in test_in 函數, number_in is 200 220 ~~~ ~~~ def line_conf(a, b): def line(x): return a*x + b return line line1 = line_conf(1, 1) line2 = line_conf(4, 5) print(line1(5)) print(line2(5)) ~~~ ~~~ 這個例?中, 函數line與變量a,b構成閉包。 在創建閉包的時候, 我們通過line_conf的參數a,b說明了這兩個變量的取值, 這樣, 我們就確定了函數的最終形式(y = x + 1和y = 4x + 5)。 我們只需要變換參數a,b, 就可以獲得不同的 直線表達函數。 由此, 我們可以看到, 閉包也具有提?代碼可復?性的作? ~~~ ## 3. 裝飾器 ### 1. 什么是裝飾器 > * 寫代碼要遵循 開放封閉 原則, 雖然在這個原則是?的?向對象開發, 但是也適?于函數式編程, 簡單來說, 它規定已經實現的功能代碼不允許被修改, > 但可以被擴展, 即: > 封閉: 已實現的功能代碼塊 > 開放: 對擴展開發 ~~~ def w1(func): def inner(): print("w1") func() return inner @w1 def f1(): print('f1') if __name__ == '__main__': f1() ~~~ 結果 w1 f1 ~~~ python解釋器就會從上到下解釋代碼, 步驟如下: 1. def w1(func): ==>將w1函數加載到內存 2. @w1 ~~~ 此時,沒有發生調用,解釋器僅僅會解釋這些代碼,內部代碼不會被執行(未調用) * @w1內部會執??下操作: 1. 調用裝飾器 被@w1標識的函數f1,會被作為w1函數的參數,即@w1等價于w1(f1),內部回去執行w1的代碼: 返回對f1裝飾后的函數 ~~~ def inner(): #驗證 1 #驗證 2 #驗證 3 f1() # func是參數, 此時 func 等于 f1 return inner# 返回的 inner, inner代表的是函數, ?執?函數 ,其實 ~~~ 2. 將裝飾后的函數,返回給源函數 將執?完的w1函數返回值 賦值 給@w1下?的函數的函數名f1 即將w1的返回值再重新賦值給 f1 此時f1指向裝飾后的函數inner,調用f1,就是調用inner 3. 裝飾器的套用 ~~~ def makeBold(fn): def wrapped(): return "<b>" + fn() + "</b>" return wrapped #定義函數: 完成包裹數據 def makeItalic(fn): def wrapped(): return "<i>" + fn() + "</i>" return wrapped @makeBold def test1(): return "hello world-1" @makeItalic def test2(): return "hello world-2" @makeBold @makeItalic def test3(): return "hello world-3" print(test1()) print(test2()) print(test3()) ~~~ 結果(先調用下邊的裝飾器) ~~~ <b>hello world-1</b> <i>hello world-2</i> <b><i>hello world-3</i></b> ~~~ 3. 帶參數的裝飾器 ~~~ from time import ctime, sleep def timefun(func): # 這里調用接收一個函數,寫明就行不帶參數啥的 def wrappedfunc(a, b): # 這里和源函數一樣(兩個參數) print("%s called at %s"%(func.__name__, ctime())) print(a, b) func(a, b) return wrappedfunc @timefun def foo(a, b): print(a+b) if __name__ == '__main__': foo(3,5) sleep(2) foo(2,4) ~~~ 結果 ~~~ foo called at Mon Oct 30 09:40:35 2017 3 5 8 foo called at Mon Oct 30 09:40:37 2017 2 4 6 ~~~ 4. 變長參數 ~~~ from time import ctime, sleep def timefun(func): def wrappedfunc(*args, **kwargs): print("%s called at %s"%(func.__name__, ctime())) func(*args, **kwargs) return wrappedfunc @timefun def foo(a, b, c): print(a+b+c) @timefun def foo1(a,b,c,d): print(a + b + c+d) if __name__ == '__main__': foo(3,5,7) sleep(2) foo(2,4,9) foo1(1,2,3,4) ~~~ ### 2. 裝飾器的作用 1. 引??志 2. 函數執?時間統計 3. 執?函數前預備處理 4. 執?函數后清理功能 5. 權限校驗等場景 6. 緩存
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看