<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        深入解析Python中的lambda表達式的用法

        來源:懂視網 責編:小采 時間:2020-11-27 14:34:43
        文檔

        深入解析Python中的lambda表達式的用法

        深入解析Python中的lambda表達式的用法:普通的數學運算用這個純抽象的符號演算來定義,計算結果只能在腦子里存在。所以寫了點代碼,來驗證文章中介紹的演算規則。 我們來驗證文章里介紹的自然數及自然數運算規則。說到自然數,今天還百度了一下,據度娘說,1993年后國家規定0是屬于自然數。先定義自
        推薦度:
        導讀深入解析Python中的lambda表達式的用法:普通的數學運算用這個純抽象的符號演算來定義,計算結果只能在腦子里存在。所以寫了點代碼,來驗證文章中介紹的演算規則。 我們來驗證文章里介紹的自然數及自然數運算規則。說到自然數,今天還百度了一下,據度娘說,1993年后國家規定0是屬于自然數。先定義自

        普通的數學運算用這個純抽象的符號演算來定義,計算結果只能在腦子里存在。所以寫了點代碼,來驗證文章中介紹的演算規則。

        我們來驗證文章里介紹的自然數及自然數運算規則。說到自然數,今天還百度了一下,據度娘說,1993年后國家規定0是屬于自然數。先定義自然數及自然數的運算規則:

        用lambda表達式定義自然數(邱齊數)

        0 := λf.λx.x
        1 := λf.λx.f x
        2 := λf.λx.f (f x)
        3 := λf.λx.f (f (f x))
        ...
        

        上面定義直觀的意思就是數字n, 是f(x)的n階函數。1就是f(x), 2就是f(f(x))....,嚴格來說,這樣表述并不準確。其實每個邱奇數都是一個二階函數,它有兩個變量f和x。用二元命名函數來表達就是:

        0 -> num0(f,x)=x
        1 -> num1(f, x)=f(x)
        2 -> num2(f,x)=f(f(x))
        3 -> num3(f,x)=f(f(f(x)))
        ...
        

        其中參數f是一個函數。這一段有點繞,但是不能理解這個,對后面的lambda演算理解會比較困難。

        首先用遞歸法,定義邱齊數(自然數)

        0是自然數, 度娘說1993年后,國家規定0是屬于自然數。

        每個自然數,都有一個后續。

        用代碼表達就是:

        NUM0=lambda f: lambda x:x
        SUCC=lambda n: lambda f: lambda x: f(n(f)(x))
        

        后面則是定義運算符,包括加法,乘法,減法和冪。維基文章里沒有介紹除法,估摸著除法定義比較復雜,一時講不清楚。那我們也不驗證了。

        ################################################
        #define number calculus rules
        ################################################
         
        #define Church numeral inductively.
        #0 := λf.λx.x
        #1 := λf.λx.f x
        #2 := λf.λx.f (f x)
        #3 := λf.λx.f (f (f x))
        #...
        NUM0=lambda f: lambda x:x
        SUCC=lambda n: lambda f: lambda x: f(n(f)(x))
         
        #define Operator
        PLUS=lambda m: lambda n: m(SUCC)(n)
        MULT= lambda m: lambda n: m(PLUS(n))(NUM0)
        #define predecessor to obtain the previous number.
        PRED= lambda n: lambda f: lambda x: n(lambda g: lambda h: h(g(f)))(lambda u:x)(lambda u:u)
        SUB=lambda m: lambda n: n(PRED)(m)
        POW=lambda b: lambda e: e(b)
        

        定義完了什么是自然數和自然數的運算子。那么自然數的運算,就可以用lambda演算的方式計算了。

        問題是上面的定義都是抽象的符號演算,我們需要有一個編碼器來把上面的抽象的Church numeral符號編碼成可以人來閱讀的形式,還需把人輸入的數字解碼成抽象符號。

        ################################################
        #create encoder to input/output Church numeral
        ################################################
         
        class LambdaEncoding:
         @staticmethod
         def encoding(exp,encoder):
         return encoder().encoding(exp)
         @staticmethod
         def decoding(s, decoder):
         return decoder().decoding(s)
         
        class NumEncoder:
         def encoding(self,num):
         f=lambda x:x+1
         return str(num(f)(0))
         def decoding(self,s):
         n=int(s)
         num=NUM0
         for i in range(n):
         num=SUCC(num)
         return num
        

        嗯,有了編碼器,就可以方便的來驗證了。

        ################################################
        #calculus demo
        ################################################
        print("demo number calculus.
        "
         "don't input large number,"
         "it will cause to exceed maximum recursion depth!
        ")
         
        n1=input('input a number: ')
        n2=input('input anohter number: ')
        #decode string to Church numeral
        num1=LambdaEncoding.decoding(n1,NumEncoder)
        num2=LambdaEncoding.decoding(n2,NumEncoder)
         
        #add
        result=PLUS(num1)(num2)
         
        print('{0} + {1} = {2}'.format(
         n1,
         n2,
         LambdaEncoding.encoding(result, NumEncoder)))
         
        #mult
        result=MULT(num1)(num2)
        print('{0} X {1} = {2}'.format(
         n1,
         n2,
         LambdaEncoding.encoding(result, NumEncoder)))
        #sub
        result=SUB(num1)(num2)
        print('{0} - {1} = {2}'.format(
         n1,
         n2,
         LambdaEncoding.encoding(result, NumEncoder)))
         
        #POW
        result=POW(num1)(num2)
        print('{0} ^ {1} = {2}'.format(
         n1,
         n2,
         LambdaEncoding.encoding(result, NumEncoder)))
        

        測試結果如下:

        >>> 
        demo number calculus.
        don't input large number,it will cause to exceed maximum recursion depth!
         
        input a number: 4
        input anohter number: 3
        4 + 3 = 7
        4 X 3 = 12
        4 - 3 = 1
        4 ^ 3 = 64
        >>>
        

        神奇吧。

        lambda和def的區別
        python lambda是在python中使用lambda來創建匿名函數,而用def創建的方法是有名稱的,除了從表面上的方法名不一樣外,python lambda還有哪些和def不一樣呢?
        1 python lambda會創建一個函數對象,但不會把這個函數對象賦給一個標識符,而def則會把函數對象賦值給一個變量。
        2 python lambda它只是一個表達式,而def則是一個語句。
        下面是python lambda的格式,看起來好精簡阿。

        lambda x: print x
        

        如果你在python 列表解析里用到python lambda,我感覺意義不是很大,因為python lambda它會創建一個函數對象,但馬上又給丟棄了,因為你沒有使用它的返回值,即那個函數對象。也正是由于lambda只是一個表達式,它可以直接作為python 列表或python 字典的成員,比如:

        info = [lamba a: a**3, lambda b: b**3]
        

        在這個地方沒有辦法用def語句直接代替。因為def是語句,不是表達式不能嵌套在里面,lambda表達式在“:”后只能有一個表達式。也就是說,在def中,用return可以返回的也可以放在lambda后面,不能用return返回的也不能定義在python lambda后面。因此,像if或for或print這種語句就不能用于lambda中,lambda一般只用來定義簡單的函數。
        下面舉幾個python lambda的例子吧
        1單個參數的:

        g = lambda x:x*2
        print g(3)
        

        結果是6
        多個參數的:

        m = lambda x,y,z: (x-y)*z
        print m(3,1,2)
        

        結果是4

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        深入解析Python中的lambda表達式的用法

        深入解析Python中的lambda表達式的用法:普通的數學運算用這個純抽象的符號演算來定義,計算結果只能在腦子里存在。所以寫了點代碼,來驗證文章中介紹的演算規則。 我們來驗證文章里介紹的自然數及自然數運算規則。說到自然數,今天還百度了一下,據度娘說,1993年后國家規定0是屬于自然數。先定義自
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产福利视精品永久免费| 免费萌白酱国产一区二区三区| 国产一卡二卡3卡四卡免费| 久久亚洲精品国产精品黑人| 久久国产精品免费观看| 亚洲成AV人片在线观看无| a级毛片免费高清毛片视频| 亚洲AV综合色区无码一区爱AV| 91在线视频免费观看| 久久精品国产96精品亚洲| 成人性生交大片免费看好| 亚洲人成电影在线天堂| 18禁止观看免费私人影院| 国产精品亚洲片在线va| 女人与禽交视频免费看| MM1313亚洲精品无码久久| 亚洲国产成人五月综合网| 久久久受www免费人成| 无码乱人伦一区二区亚洲| 成人免费大片免费观看网站| 亚洲色大成网站www| 亚洲成年看片在线观看| 全黄大全大色全免费大片| 亚洲精品影院久久久久久| 久久久久国色AV免费观看性色| 美女裸免费观看网站| 亚洲不卡av不卡一区二区| 免费99精品国产自在现线| 日本系列1页亚洲系列| 亚洲VA成无码人在线观看天堂| 黄页网站在线看免费| 免费精品久久久久久中文字幕 | 成人毛片免费在线观看| 国产99久久亚洲综合精品| 亚洲日韩aⅴ在线视频| 国产精品免费观看久久| 一级毛片免费毛片毛片| 亚洲美女视频网址| 亚洲M码 欧洲S码SSS222| **一级一级毛片免费观看| 特级av毛片免费观看|