1. 当前所在位置:
  2. 首页
  3. 街机捕鱼

python的匿名函数lambda解释及用法

2018-12-28 admin
  lambda函数的语法只包含一个语句,如下:lambdaarg1,arg2,.....argn:expression(主要是看下面的例子)
 
  代码示例:
 
  复制代码
 
  #-*-coding:utf-8-*-
 
  #__author__="www.iplaypy.com"
 
  #普通python函数
 
  deffunc(a,b,c):
 
  returna+b+c
 
  printfunc(1,2,3)
 
  #返回值为6
 
  #lambda匿名函数
 
  f=lambdaa,b,c:a+b+c
 
  printf(1,2,3)
 
  #返回结果为6
 
  复制代码
 
  #大家注意观察上面的Python示例代码,f=lambdaa,b,c:a+b+c中的关键字lambda表示匿名函数,
 
  #冒号:之前的a,b,c表示它们是这个函数的参数。
 
  #匿名函数不需要return来返回值,表达式本身结果就是返回值。
 
  (以下是我复制过来的一些代码,正是通过这些代码让我对匿名函数有了一个比较深入的了解,所以建议大家认真看看,)
 
  无参匿名函数:
 
  ------
 
  >>>t=lambda:True#分号前无任何参数
 
  >>>t()
 
  True
 
  等价于下面的def定义的函数
 
  >>>deffunc():returnTrue
 
  >>>func()
 
  True
 
  ------
 
  >>>s="thisis\na\ttest"#建此字符串按照正常情形输出
 
  >>>s
 
  'thisis\na\ttest'
 
  >>>prints.split()#split函数默认分割:空格,换行符,TAB
 
  ['this','is','a','test']
 
  >>>''.join(s.split())#用join函数转一个列表为字符串
 
  'thisisatest'
 
  等价于
 
  >>>(lambdas:''.join(s.split()))("thisis\na\ttest")
 
  带参数匿名函数
 
  >>>lambdax:x**3#一个参数
 
  >>>lambdax,y,z:x+y+z#多个参数
 
  >>>lambdax,y=3:x*y#允许参数存在默认值
 
  匿名函数调用
 
  #直接赋值给一个变量,然后再像一般函数调用
 
  ------
 
  >>>c=lambdax,y,z:x*y*z
 
  >>>c(2,3,4)
 
  24
 
  ------
 
  >>>c=lambdax,y=2:x+y#使用了默认值
 
  >>>c(10)#不输的话,使用默认值2
 
  12
 
  ------
 
  >>>a=lambda*z:z#*z返回的是一个元祖
 
  >>>a('Testing1','Testing2')
 
  ('Testing1','Testing2')
 
  ------
 
  >>>c=lambda**Arg:Arg#arg返回的是一个字典
 
  >>>c()
 
  {}
 
  #直接后面传递实参
 
  ------
 
  >>>(lambdax,y:xifx>yelsey)(101,102)
 
  102
 
  ------
 
  >>>(lambdax:x**2)(3)
 
  9
 
  #lambda返回的值,结合map,filter,reduce使用
 
  >>>filter(lambdax:x%3==0,[1,2,3,4,5,6])
 
  [3,6]
 
  等价于下面的列表推导式
 
  >>>l=[xforxin[1,2,3,4,5,6]ifx%3==0]
 
  >>>l
 
  [3,6]
 
  嵌套使用
 
  #lambda嵌套到普通函数中,lambda函数本身做为return的值
 
  ------
 
  >>>defincrement(n):
 
  ...returnlambdax:x+n
 
  ...
 
  >>>f=increment(4)
 
  >>>f(2)
 
  6
 
  ------
 
  >>>defsay():
 
  ...title='Sir,'
 
  ...action=lambdax:title+x
 
  ...returnaction
 
  ...
 
  >>>act=say()
 
  >>>act('Smith!')
 
  'Sir,Smith!'
 
  大量例子:
 
  例01:字符串联合,有默认值,也可以x=(lambda...)这种格式
 
  >>>x=(lambdax="Boo",y="Too",z="Zoo":x+y+z)
 
  >>>x("Foo")
 
  'FooTooZoo'
 
  例02:和列表联合使用
 
  >>>L=[lambdax:x**2,\
 
  lambdax:x**3,\
 
  lambdax:x**4]
 
  >>>forfinL:
 
  ...printf(2)
 
  ...
 
  4
 
  8
 
  16
 
  也可以如下面这样调用
 
  >>>printL[0](3)
 
  9
 
  例03:和字典结合使用
 
  >>>key='B'
 
  >>>dic={'A':lambda:2*2,\
 
  ...'B':lambda:2*4,\
 
  ...'C':lambda:2*8}
 
  >>>dic[key]()
 
  8
 
  例04:求最小值
 
  >>>lower=lambdax,y:xifx<yelsey
 
  >>>lower('aa','ab')
 
  'aa'
 
  例05:和map及list联合使用
 
  >>>importsys
 
  >>>showall=lambdax:list(map(sys.stdout.write,x))
 
  >>>showall(['Jerry\n','Sherry\n','Alice\n'])
 
  Jerry
 
  Sherry
 
  Alice
 
  >>>showall(['Jerry','Sherry','Alice'])
 
  JerrySherryAlice
 
  等价于下面
 
  >>>showall=lambdax:[sys.stdout.write(line)forlineinx]
 
  >>>showall(('I\t','Love\t','You!'))
 
  ILoveYou![None,None,None]
 
  例06:在Tkinter中定义内联的callback函数
 
  importsys
 
  fromTkinterimportButton,mainloop
 
  x=Button(text='Pressme',
 
  command=(lambda:sys.stdout.write('Hello,World\n')))
 
  x.pack()
 
  x.mainloop()
 
  >>>
 
  Hello,World!
 
  Hello,World!
 
  例07:lambda和map联合使用,
 
  >>>out=lambda*x:sys.stdout.write(''.join(map(str,x)))
 
  >>>out('This','is','a','book!\n')
 
  Thisisabook!
 
  例08:判断字符串是否以某个字母开头
 
  >>>print(lambdax:x.startswith('B'))('Bob')
 
  True
 
  -----
 
  >>>Names=['Anne','Amy','Bob','David','Carrie','Barbara','Zach']
 
  >>>B_Name=filter(lambdax:x.startswith('B'),Names)
 
  >>>B_Name
 
  ['Bob','Barbara']
 
  例09:lambda和map联合使用:
 
  >>>squares=map(lambdax:x**2,range(5))
 
  >>>squares
 
  [0,1,4,9,16]
 
  例10.lambda和map,filter联合使用:
 
  >>>squares=map(lambdax:x**2,range(10))
 
  >>>filters=filter(lambdax:x>5andx<50,squares)
 
  >>>filters
 
  [9,16,25,36,49]
 
  例11.lambda和sorted联合使用
 
  #按death名单里面,按年龄来排序
 
  #匿名函数的值返回给key,进来排序
 
  >>>death=[('James',32),
 
  ('Alies',20),
 
  ('Wendy',25)]
 
  >>>sorted(death,key=lambdaage:age[1])#按照第二个元素,索引为1排序
 
  [('Alies',20),('Wendy',25),('James',32)]
 
  例12.lambda和reduce联合使用
 
  >>>L=[1,2,3,4]
 
  >>>sum=reduce(lambdax,y:x+y,L)
 
  >>>sum
 
  10
 
  例13.求2-50之间的素数
 
  #素数:只能被1或被自己整除的数
 
  >>>nums=range(2,50)
 
  >>>foriinnums:
 
  nums=filter(lambdax:x==iorx%i,nums)
 
  >>>nums
 
  [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]
 
  例14.求两个列表元素的和
 
  >>>a=[1,2,3,4]
 
  >>>b=[5,6,7,8]
 
  >>>map(lambdax,y:x+y,a,b)
 
  [6,8,10,12]
 
  例15.求字符串每个单词的长度
 
  >>>sentence="WelcomeToBeijing!"
 
  >>>words=sentence.split()
 
  >>>lengths=map(lambdax:len(x),words)
 
  >>>lengths
 
  [7,2,8]
 
  写成一行:
 
  >>>printmap(lambdax:len(x),'WelcomeToBeijing!'.split())
捕鱼驾到