python中的lambda表达式用法详解


Posted in Python onJune 22, 2016

本文实例讲述了python中的lambda表达式用法。分享给大家供大家参考,具体如下:

这里来为大家介绍一下lambda函数。

lambda 函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方 。下面的例子比较了传统的函数定义def与lambda定义方式:

>>> def f ( x ,y):
...   return x * y
...
>>> f ( 2,3 )
6
>>> g = lambda x ,y: x * y
>>> g ( 2,3 )
6

可以看到,两个函数得到的结果一样,而对于实现简单功能的函数来说,使用lambda函数来定义更加精简灵活,还可以直接把函数赋值给一个变量,用变量名来表示函数名。

其实lambda函数在很多时候都是不需要赋值给一个变量的。

使用lambda函数还有一些注意事项:  lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。  lambda 函数不能包含命令,包含的表达式不能超过一个

下面简单演示一下如何使用lambda函数实现自定义排序。

class People :
  age = 0
  gender = 'male'
  def __init__ ( self , age , gender ):
    self . age = age
    self . gender = gender
  def toString ( self ):
    return 'Age:' + str ( self . age ) + ' /t Gender:' + self . gender
List = [ People ( 21 , 'male' ), People ( 20 , 'famale' ), People ( 34 , 'male' ), People ( 19 , 'famale' )]
print 'Befor sort:'
for p in List :
  print p . toString ()
List . sort ( lambda p1 , p2 : cmp ( p1 . age , p2 . age ))
print ' /n After ascending sort:'
for p in List :
  print p . toString ()
List . sort ( lambda p1 , p2 : - cmp ( p1 . age , p2 . age ))
print ' /n After descending sort:'
for p in List :
  print p . toString ()

上面的代码定义了一个People类,并通过lambda函数,实现了对包含People类对象的列表按照People的年龄,进行升序和降序排列。运行结果如下:

Befor sort:
Age:21    Gender:male
Age:20    Gender:famale
Age:34    Gender:male
Age:19    Gender:famale
After ascending sort:
Age:19    Gender:famale
Age:20    Gender:famale
Age:21    Gender:male
Age:34    Gender:male
After descending sort:
Age:34    Gender:male
Age:21    Gender:male
Age:20    Gender:famale
Age:19    Gender:famale

lambda语句被用来创建新的函数对象,并且在运行时返回它们。

例:使用lambda形式

#!/usr/bin/python
# Filename: lambda.py
def
make_repeater(n):
  return lambda s: s*n
twice = make_repeater(2)
print twice('word')
print twice(5)

输出:

$ python lambda.py
wordword
10

它如何工作

这里,我们使用了make_repeater函数在运行时创建新的函数对象,并且返回它。

lambda语句用来创建函数对象。本质上,lambda需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。注意,即便是print语句也不能用在 lambda形式中,只能使用表达式。

def与lambda的区别

它们的主要不同点是python def 是语句而python lambda是表达式 ,理解这点对你了解它们很重要。 下面看看他们的应用吧。
首先在python 里面语句是可以嵌套的,比如你需要根据某个条件来定义方法话,那只能用def了。

你用lambda就会报错了。

a = 2
if a > 1 :
  def info ():
    print 'haha'
else :
  def test ():
    print 'test'

而有的时候你需要在python 表达式里操作的时候,那需要用到表达式嵌套,这个时候python def就不能得到你想要的结果,那只能用python lambda

下面给个例子:

g = lambda x : x+2
info = [g(x) for x in range(10)]
print info

通过上面的例子,希望你能很好的理解python def和lambda的相同和不同点。如果你对python函数感兴趣的话,可以看看: python 函数返回值 ,python 函数参数

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

① python lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符,而def则会把函数对象赋值给一个变量。

② 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的例子吧

① 单个参数的:

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

结果是6

② 多个参数的:

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

结果是4

没事写程序的时候多用用python lambda就熟练了。。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
深入讲解Python中面向对象编程的相关知识
May 25 Python
用Python写一个无界面的2048小游戏
May 24 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
Dec 05 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
python3正则提取字符串里的中文实例
Jan 31 Python
Pandas之Fillna填充缺失数据的方法
Jun 25 Python
pytorch AvgPool2d函数使用详解
Jan 03 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
Mar 19 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 Python
深入浅析python中的多进程、多线程、协程
Jun 22 #Python
Python按行读取文件的简单实现方法
Jun 22 #Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 #Python
详解Python中的from..import绝对导入语句
Jun 21 #Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 #Python
深入解析Python中的__builtins__内建对象
Jun 21 #Python
浅谈Python中函数的参数传递
Jun 21 #Python
You might like
php开发中的页面跳转方法总结
2015/04/26 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
JavaScript 学习笔记之一jQuery写法图片等比缩放以及预加载
2012/06/28 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
Java遍历集合方法分析(实现原理、算法性能、适用场合)
2016/04/25 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
微信小程序 网络API 上传、下载详解
2016/11/09 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
python实现excel读写数据
2021/03/02 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
python实现淘宝购物系统
2019/10/25 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
安全生产检讨书
2014/01/21 职场文书
写自荐信三大法宝
2014/01/24 职场文书
2015年园林绿化工作总结
2015/05/23 职场文书
创业计划书之水果店
2019/07/18 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
SQLServer之常用函数总结详解
2021/08/30 SQL Server
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server