python允许用lambda关键字创造匿名函数。

匿名函数是因为不需要以标准的方式来声明,比如说,使用def语句。

但是,作为函数,它们也能有参数。

一个完整的lambda“语句”代表了一个表达式,这个表达式的定义体必须和声明放在同一行。

参数时可选的,如果使用参数的话,参数通常也是表达式的一部分。

核心知识点:

用合适的表达式调用一个lambda生成一个可以像其他函数一样使用的函数对象

它们可以被传给其他函数,用额外的引用别名化,作为容器对象以及可调用的对象被调用。(如果需要,可以带参数)

当被调用的时候,如果给定相同的参数的话,这些对象会生成一个和相同表达式等阶的结果。

它们和那些等价表达式计算值相同的函数是不能区分的。

可以来看个简单的例子:

  1. >>> def true():
  2. ... return True
  3. ...
  4.  
  5. >>> lambda:True
  6. <function <lambda> at 0x000002B6A99BBF28>
  7. >>> TRUE = lambda:True
  8.  
  9. #上面都是创建两个总是返回True的函数
  10. >>> true()
  11. True
  12.  
  13. >>> TRUE()
  14. True
  15. #可以发现结果完全是相同的

上面的例子说明,使用匿名函数完全是行得通的。

我们还可以将lambda表达式赋值给一个如列表和元祖的数据结构,同时默认以及可变的参数也是允许的。

  1. >>> def kebi(x,y=2): #我可以设置默认值
  2. ... return x+y
  3. ...
  4.  
  5. >>> a = lambda x,y =2:x+y #我也可以设置默认值
  6.  
  7. #上面两个函数功能一样
  8.  
  9. >>> def maoxian(*z):return z #参数收集返回元祖
  10. ...
  11. >>>
  12. >>> b = lambda *z:z #收集我也可以
  13.  
  14. #上面两个函数功能也一样
  15.  
  16. #光说不练可不行
  17. >>> a(3) #有默认值
  18. 5
  19. >>> a(4,5)
  20. 9
  21. >>> kebi(3)
  22. 5
  23. >>> kebi(4,5)
  24. 9
  25.  
  26. >>> maoxian(1,2,'z','iu13') #函数定义的只有一个参数,却可以收集多个到一个元祖里面
  27. (1, 2, 'z', 'iu13')
  28. >>> b(1,2,'z','iu13')
  29. (1, 2, 'z', 'iu13')

最后再来阐述一个问题,为什么要给函数赋值一个变量?

  1. >>> a = lambda x,y =2:x+y

之前在使用传统函数的总是不明白为啥要赋值?

我们可以把每个函数看作是一个对象,漂浮在内存中。

我们虽然创建了一个函数,但没有地方保存它,也没有调用它。

这个函数在创建的时候引用计数被设置为True,但是如果,没有引用,计数又会回到零,这样就会被垃圾回收。

为了保存对象,可以把它赋值到一个变量上,以后也就可以随时调用,也不会自动被删除了。

函数编程——匿名函数与lambda(一)的更多相关文章

  1. 浅析匿名函数、lambda表达式、闭包(closure)区别与作用

    浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...

  2. 匿名函数:Lambda表达式和匿名方法

    匿名函数一个"内联"语句或表达式,可在需要委托类型的任何地方使用.可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数: Lamb ...

  3. 3 委托、匿名函数、lambda表达式

    委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方 ...

  4. 用委托、匿名函数、Lambda的方式输出符合要求的数

    最近看了一些博客,对委托和匿名函数和Lambda的方式有了一些更深的理解,在前人的基础上.我也写3个例子 using System; using System.Collections.Generic; ...

  5. C#语法之匿名函数和Lambda表达式

    上一篇博客主要是对委托和事件做了一小结,这篇是在上一篇博客的基础上对匿名函数和Lambda表达式小结.还是接着上一篇说起,在上一篇中也说了委托是一种数据结构,主要是解决让函数作为参数的问题.在使用委托 ...

  6. python基础----内置函数----匿名函数(lambda)

    Python3版本所有的内置函数: 1. abs() 获取绝对值 >>> abs(-) >>> abs() >>> abs() >>& ...

  7. 匿名函数、lambda表达式

    匿名函数 func = lambda x: y #x是形参,y是返回值 键字lambda表示匿名函数,冒号前面的x表示函数参数,冒号后面的y表示匿名函数的返回值. 例1:返回列表中长度大于等于3的元素 ...

  8. 测开之路八十二:匿名函数:lambda表达式

    # 匿名函数:lambda表达式# lambda 参数: 逻辑f = lambda name: print(name)f('tom') f2 = lambda x, y: x + yprint(f2( ...

  9. [C#学习教程-委托]001.大道至简之委托(代理),匿名函数,Lambda表达式

    引言:此文翻译自CodeProject上的同名文章<C# Delegates,Anonymous Methods, and Lambda Expressions>,在此一起Mark一下,此 ...

随机推荐

  1. Angularjs学习笔记11_手工初始化

    http://my.oschina.net/fuckBAT/blog/375579 Angular的编译机制允许开发人员给浏览器添加新的Html语法,允许我们添加一些html节点,attribute, ...

  2. 1.const

    在C++中,const 的含义并没有改变,只是对细节进行了一些调整,以下是最主要的两点. 一.C++中的 const 更像编译阶段的 #define 先来看下面的两条语句: ; int n = m; ...

  3. JSON串常用函数

    1.JSON.parse() parse 用于从一个字符串中解析出json 对象. 例如 var str='{"name":"cpf","age&qu ...

  4. openWRT自学---针对backfire版本的主要目录和文件的作用的分析整理

    特别说明:要编译backfire版本,一定要通过svn下载:svn co svn://svn.openwrt.org/openwrt/branches/backfire,而不能使用http://dow ...

  5. Problem #3263 丽娃河的狼人传说 区间满足灯数,r排序后贪心。

    丽娃河的狼人传说 Time limit per test: 1.0 seconds Time limit all tests: 1.0 seconds Memory limit: megabytes ...

  6. 进出口流程 & 报关单据

    出口流程 一. 委托人 1. 需找货运代理公司 2. 向代理公司询问价格 一般为 ALL IN 价格( 空运费+燃油费+战险费 ) 总费用 = ALL IN 价格 * ( 货物公斤数 ) ALL IN ...

  7. asp.net 关于字符串内范围截取的一点方法总结

    前两天有一位网友提出了一个字符串内截取字符串的问题,除了用普通的字符串截取的方式外,我推荐的是用LINQ方式来截取.两者实际上差别不是很大,都是采用字符串截取方式,但后者从写法和观察效果会比前者简单实 ...

  8. ChemDraw能够生成化学性质报告吗

    ChemDraw破解版是一种不安全的软件版本,危害用户信息安全,一些不法分子正是因利用用户寻求免费软件的心理以ChemDraw破解版.ChemDraw注册机为噱头传播不安全信息.如果使用者已经成功安装 ...

  9. MariaDB二进制包简单安装部署

    一.简介: MySQL最早是由Michael Widenius在所研发,而在后来Michael先生以10亿美元的价格把MySQL卖给了SUN以后不久SUN就被Oracle公司给收购了,在Oracle收 ...

  10. poj2528

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 56864   Accepted: 16445 ...