1、Python lambda和Python def区别分析

Python支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做lambda的函数,是从Lisp借用来的,可以用在任何需要函数的地方。

lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda?

?
1
2
3
4
5
6
7
8
9
10
>>> def f(x):
...   return x+2
...
>>> f(1)
3
>>> f = lambda x:x+2
>>> f(1)
3
>>> (lambda x:x+2)(1)
3

Python def和Python lambda它们有相似点也有不同点。
相似点: 这两个很重要的相似点就是都可以定义一些固定的方法或者是流程,供给程序来调用,比如上面例子中定义一个变量加2的方法。 输出的结果都是3,如果你要完成一些固定的流程的话,上面几种你都可以任意选择。

上面是相同点,那么有那些不同点?
它们的主要不同点是Python def是语句而Python lambda是表达式。lambda简化了函数定义的书写形式,使代码更为简洁。但是使用函数的定义方式更为直观,易理解。

Python里面语句是可以嵌套的,比如你需要根据某个条件来定义方法,那只能用def。用lambda就会报错。

?
1
2
3
4
5
6
>>> if a==1:
...   def info():
...     print '1'*5
... else:
...   def info2():
...     print 'info2'

而有的时候你需要在python表达式里操作的时候,那需要用到表达式嵌套,这个时候Python def就不能得到你想要的结果,那只能用Python lambda,如下例子:
输出e字符串出现频率最高的字母:

?
1
2
3
4
5
6
>>> str='www.linuxeye.com linuxeye.com'
>>> L = ([(i,str.count(i)) for i in set(str)])
[(' ', 1), ('c', 2), ('e', 4), ('i', 2), ('m', 2), ('l', 2), ('o', 2), ('n', 2), ('u', 2), ('w', 3), ('y', 2), ('x', 2), ('.', 3)]
>>> L.sort(key = lambda k:k[1],reverse = True)
>>> print L[0][0]
e

2、Python的lambda匿名函数

(1)使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。

(2)对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

(3)使用lambda在某些时候让代码更容易理解。

lambda基础
lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。lambda语句构建的其实是一个函数对象,代码如下:

g = lambda x : x**2
print g
<function <lambda> at 0x00AFAAF0>

C#3.0开始,也有了lambda表达式,省去了使用delegate的麻烦写法。C#中的lambda表达式关键字是=>,看下面的一个例子,代码如下:

var array = new int[] {2, 3, 5, 7, 9};
var result = array.Where(n => n > 3); // [5, 6, 9]

C#使用了扩展方法,才使得数组对象拥有了像Where,Sum之类方便的方法。Python中,也有几个定义好的全局函数方便使用的,他们就是filter, map, reduce。代码如下:

>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>>
>>> print filter(lambda x: x % 3 == 0, foo)
[18, 9, 24, 12, 27]
>>>
>>> print map(lambda x: x * 2 + 10, foo)
[14, 46, 28, 54, 44, 58, 26, 34, 64]
>>>
>>> print reduce(lambda x, y: x + y, foo)
139

非lambda不可?
上面例子中的map的作用,和C#的Where扩展方法一样,非常简单方便。但是,Python是否非要使用lambda才能做到这样的简洁程度呢?在对象遍历处理方面,其实Python的for..in..if语法已经很强大,并且在易读上胜过了lambda。比如上面map的例子,可以写成,代码如下:

print [x * 2 + 10 for x in foo]

非常的简洁,易懂。filter的例子可以写成,代码如下:

print [x for x in foo if x % 3 == 0]

同样也是比lambda的方式更容易理解。

所以,什么时候使用lambda,什么时候不用,需要具体情况具体分析,只要表达的意图清晰就好。一般情况下,如果for..in..if能做的,我都不会选择lambda。

lambda broken?
在数学教学中,经常会使用到lambda,比如有一位老兄就遇到这样一个问题。他想创建一个函数数组fs=[f0,...,f9] where fi(n)=i+n. 于是乎,就定义了这么一个lambda函数,代码如下:

fs = [(lambda n: i + n) for i in range(10)]

但是,奇怪的是,代码如下:

>>> fs[3](4)
13
>>> fs[4](4)
13
>>> fs[5](4)
13

结果并没有达到这位老兄的预期,预期的结果应该是,代码如下:

>>> fs[3](4)
7
>>> fs[4](4)
8
>>> fs[5](4)
9

问题其实出在变量i上。上面的代码换个简单的不使用lambda的缩减版本,代码如下:

i = 1
def fs(n):
return n + i
print fs(1) # 2
i = 2
print fs(1) # 3

可见,上面没有达到预期的原因是lambda中的i使用的是匿名函数外的全局变量。修改一下,代码如下:

fs = [(lambda n, i=i : i + n) for i in range(10)]
>>> fs[3](4)
7
>>> fs[4](4)
8
>>> fs[5](4)
9

3、Python def函数

Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为:

def 函数名(参数1, 参数2, ……, 参数N):

执行语句函数名为调用的表示名,参数则是传入的参数,可以更具需要定义,也可以没有。

?
1
2
3
4
5
6
7
8
9
10
11
# 例1:简单的函数使用
# coding=gb2312
# 定义函数
def hello():
  print 'hello python!'
   
# 调用函数   
hello()
   
>>> hello python!

函数可以带参数和返回值,参数将按从左到右的匹配,参数可设置默认值,当使用函数时没给相应的参数时,会按照默认值进行赋值。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 例2:累加计算值
# coding=gb2312
# 定义函数
def myadd(a=1,b=100):
  result = 0
  i = a
  while i <= b:  # 默认值为1+2+3+……+100
    result +=
    i += 1
  return result
# 打印1+2+……+10   
print myadd(1,10)
print myadd()    # 使用默认参数1,100
print myadd(50)   # a赋值50,b使用默认值
   
>>> 55
>>> 5050
>>> 3825

Python 函数的参数传递时,值得注意的是参数传入时若为变量会被当作临时赋值给参数变量,如果是对象则会被引用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 例3:
# coding=gb2312
def testpara(p1,p2):
  p1 = 10
  p2.append('hello')
l = []   # 定义一数组对像
a = 20   # 给变量a赋值
testpara(a,l) # 变量a与对象数组l作为参数传入
print a   # 打印运行参数后的值
for v in l: # 打印数组对象的成员
  print v
     
>>> 20    # 调用函数后a变量并未被复值
>>> hello  # 而对象l数组则增加成员hello

python--lambda和def函数相关推荐

  1. Python如何使用def函数教程

    ## **实列**def hello():print("Hello word")hello()## 利用def函数进行循环结构def max(a,b):if a>b:retu ...

  2. python中的def函数括号里的默认值_Python中的默认参数值

    Python对默认参数值的处理方法是少有的几个易使大多数新手Python程序员犯错的地方之一.(通常只犯一次) 导致困惑的地方是当你使用"可变"对象作为(参数的)默认值时的(程序) ...

  3. python基础:def函数

    基本概念 1. 定义函数的使用:def 函数名(参数):                                         函数体                             ...

  4. python语法教程——def()函数

    什么是函数? 我们在编程的过程中往往会发现,实现某一功能的代码块会被频繁地使用.如果每次使用这段代码都得复制粘贴,这会使得代码冗长而又臃肿,增大了代码的阅读难度.为了方便我们实现对代码块的复用,人们提 ...

  5. Python中的def函数。

    废话不多说,直接开讲!!! def fun():a =10print(a) fun() 输出结果: def是定义一个新函数(我定义的是fun()),然后在最后打出fun(),否则输出结果为0,或者在输 ...

  6. python函数def中import_在Python中使用def函数时出现名称错误

    我正在创建一个'猜数字'游戏,并有问题时,试图运行它.我得到的错误如下:Traceback (most recent call last): File "C:\Users\Troy\Desk ...

  7. python的def函数_Python 学习之 def 函数

    共3118字, 阅读本文需要8分钟 def 函数基础 def 函数的定义 在 python 中,def 函数是用来定义一个 function() 的.基本使用 示例下面我们定义了一个 function ...

  8. python def函数_Python教程之Lambda表达式知识概述

    在Python中,除了def之外,还提供了一种生成函数对象的表达式形式,即Lambda表达式,它可以创建小的匿名函数,起到一个函数速写的作用.接下来的好程序员Python学习课程就给大家分享Lambd ...

  9. python lambda函数_python入门基础之lambda匿名函数

    lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式.lambda是一个表达式而不是一个语句.它能够出现在Python语法不允许def出现的地方.作为表达式, ...

  10. Python lambda用法及其与def的区别

    python lambda是在python中使用lambda来创建匿名函数,而用def创建的方法是有名称的,除了从表面上的方法名不一样外,python lambda还有哪些和def不一样呢? 1 py ...

最新文章

  1. 苹果回应 XcodeGhost:暂未发现个人信息受影响
  2. linux管理员常用的命令分享
  3. 在Virtualbox下为Ubuntu16.04开机自动挂载共享目录的最佳方法
  4. 【Elasticsearch】需要监控的 10 大 Elasticsearch 指标
  5. mysql学生成绩视图_mysql的视图
  6. 开课吧:Webpack的构建流程是什么?
  7. 将Maven项目转换成Eclipse支持的Java项目
  8. 解决SVN Files 的值“xxxxxxx .mine”无效 问题
  9. TM7705、TM7707使用
  10. c语言程序设计题答案,C语言程序设计习题(含答案).doc
  11. CT重建学习笔记(一)
  12. Oracle get、start、edit、spool命令,临时变量、已定义变量
  13. VR/AR时代最大的瓶颈是什么?
  14. Audience Targeting
  15. stm32 TIM1的CH1N~CH3N、CH1~CH4基本配置
  16. Billboard(海报粘贴简单的线段树)
  17. [转载] 深入 superviser
  18. 网络路由交换 -- 静态路由 和 缺省路由
  19. 【修仙境界】等级划分
  20. grid栅格布局详解

热门文章

  1. Android进阶:十三、自定义类加载器加载加密类文件
  2. python django 安装
  3. spring JdbcTemplate 在项目中的浅层(5个使用场景)封装
  4. 选redis还是memcache?
  5. 释放内存触发断点及数组、指针的NULL初始化
  6. 基础 PHP 数据类型
  7. 英国推6.5亿英镑网络安全战略 强化安全屏障
  8. loadruner中加中Java_Script
  9. 百度地图经常崩溃的问题
  10. Free 4 months Serial License Key Of Outpost Security Suite Pro 8.1