最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析Python中的lambda表達(dá)式的用法

 更新時間:2015年08月28日 12:20:02   作者:阿托  
這篇文章主要介紹了深入解析Python中的lambda表達(dá)式的用法,包括其與def之間的區(qū)別,需要的朋友可以參考下

普通的數(shù)學(xué)運(yùn)算用這個純抽象的符號演算來定義,計算結(jié)果只能在腦子里存在。所以寫了點(diǎn)代碼,來驗(yàn)證文章中介紹的演算規(guī)則。

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

用lambda表達(dá)式定義自然數(shù)(邱齊數(shù))

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

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

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)))
...

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

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

0是自然數(shù),  度娘說1993年后,國家規(guī)定0是屬于自然數(shù)。

每個自然數(shù),都有一個后續(xù)。

用代碼表達(dá)就是:

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

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

################################################
#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)

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

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

################################################
#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

嗯,有了編碼器,就可以方便的來驗(yàn)證了。

################################################
#calculus demo
################################################
print("demo number calculus.\n"
   "don't input large number,"
   "it will cause to exceed maximum recursion depth!\n")
 
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)))

測試結(jié)果如下:

>>> 
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的區(qū)別
python lambda是在python中使用lambda來創(chuàng)建匿名函數(shù),而用def創(chuàng)建的方法是有名稱的,除了從表面上的方法名不一樣外,python lambda還有哪些和def不一樣呢?
1 python lambda會創(chuàng)建一個函數(shù)對象,但不會把這個函數(shù)對象賦給一個標(biāo)識符,而def則會把函數(shù)對象賦值給一個變量。
2 python lambda它只是一個表達(dá)式,而def則是一個語句。
下面是python lambda的格式,看起來好精簡阿。

lambda x: print x

如果你在python 列表解析里用到python lambda,我感覺意義不是很大,因?yàn)閜ython lambda它會創(chuàng)建一個函數(shù)對象,但馬上又給丟棄了,因?yàn)槟銢]有使用它的返回值,即那個函數(shù)對象。也正是由于lambda只是一個表達(dá)式,它可以直接作為python 列表或python 字典的成員,比如:

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

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

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

結(jié)果是6
多個參數(shù)的:

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

結(jié)果是4

相關(guān)文章

最新評論

云霄县| 皮山县| 北京市| 颍上县| 延津县| 云南省| 连山| 东光县| 冕宁县| 兰州市| 罗田县| 大足县| 江华| 抚松县| 衡水市| 齐齐哈尔市| 汝阳县| 阜宁县| 罗田县| 霍山县| 昌宁县| 揭东县| 武清区| 施秉县| 祁东县| 页游| 青州市| 夏河县| 瑞昌市| 商都县| 沾化县| 温宿县| 罗定市| 涿州市| 大余县| 巴东县| 福安市| 义马市| 星座| 铜梁县| 富顺县|