一、lambda表达式

1.1、lambda表达式理解

lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去。如果要通俗的理解lambda表达式,可以结合C/C++中的逻辑宏定义和内联函数概念,lambda表达式通俗的讲是起到一个函数速写的作用,并且允许在lambda代码块内嵌入一个函数的定义。

1.2、lambda表达式使用

1.2.1 简单的求和

f = lambda x, y: x + y

print(f(1, 2))

# 输出: 3

1.2.2 lambda表达式实现n的阶乘

from functools import reduce

n = 5

out = reduce(lambda x, y : x*y, range(1, n+1))

print(out)

# 输出: 120

1.2.3 函数中使用lambda

def foo(x):

return lambda y: x + y

a = foo(2)

print(a(2))

# 输出: 4

1.2.4 把函数直接写成lambda形式

foo = lambda x: lambda y: x + y# 第一个lambda理解为用于foo函数传入x参数,第二个lambda相当于2.2中返回值里的lambda表达式

a = foo(3)

print(a(2))

# 输出: 5

1.3、通常使用lambda表达式的地方

通常会在调用接受函数作为参数的函数(或者类)时使用lambda表达式,比如python内置的sorted函数可接受一个函数作为它的key参数,这个key函数用于在决定条目排序顺序时计算比较键的值,比如:

a = ['1', '3', '5', '2', '9', '7']

print(sorted(a, key=lambda s: s.casefold()))

# 输出: ['1', '2', '3', '5', '7', '9']

sorted函数并不是lambda表达式的唯一用法,但却是最普遍的一个。

1.4、lambda使用问题(利弊及滥用问题)

二、yield关键字

2.1、yield关键字的理解与使用

yield关键字作用的通俗理解是:定义生成器(generator)时常用的一个带有return作用的关键字,当一个函数带有yield关键字,那么这个函数已经不再是通俗意义上的函数,它是一个生成器(带yield关键字的函数才是真正的迭代器)。

下面通过小程序的解读来说明yield关键字的作用与用法:

def foo():

print('hello')

while True:

r = yield 1

print('r: ', r)

a = foo()

print(next(a))

print('-'*6)

print(next(a))

输出如下

hello

1

------

r: None

1

解释:

1、程序开始执行以后,因为foo函数中有yield关键字,所以foo函数并不会真的执行,而是先得到一个生成器(相当于一个对象);

2、直到调用next方法,foo函数正式开始执行,先执行foo函数中的print方法,然后进入while循环;

3、程序遇到yield关键字,然后把yield想想成return,return了一个1之后,程序停止,并没有执行赋值给r操作,此时next(g)语句执行完成,所以输出的前两行(第一个是while上面的print的结果,第二个是return出的结果)是执行print(next(a))的结果;

4、打印分割线

5、又开始执行下面的print(next(a)),这个时候和上面那个差不多,不过不同的是,这个时候是从刚才那个next程序停止的地方开始执行的,也就是要执行r的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候r赋值是None,所以接着下面的输出就是r: None;

6、程序会继续在while里执行,又一次碰到yield,这个时候同样return 出1,然后程序停止,print函数输出的1就是这次return出的1。

说明:这里的next函数是通过yield关键字得到的生成器(前面我们说了这个生成器相当于一个对象)自带的一个方法,相当于“下一步”,next开始的地方是接着上一个next停止的地方执行的,所以调用next的时候,生成器并不会从foo函数的开始执行,而是从上一次停止的地方开始执行,在遇到下一个yield的时候结束。

下面介绍一下生成器对象中的另一个函数:send函数

def foo():

print('hello')

while True:

r = yield 1

print('r: ', r)

a = foo()

print(next(a))

print('-'*6)

print(a.send(2))

输出如下

hello

1

------

r: 2

1

send函数的概念:就上面的程序而言:send是发送一个参数给r的,因为上面讲到,return的时候,并没有把1赋值给r,下次执行的时候只好继续执行赋值操作,只好赋值为None了,而如果用send的话,开始执行的时候,先接着上一次(return 1之后)执行,先把2赋值给了r,然后执行next的作用,遇见下一个的yield,return出结果后结束。

2.2 为什么使用包含yield的生成器

为什么用这个生成器,是因为如果用List的话,会占用更大的空间,比如取0~1000,一般我们可能这样写:

for n in range(1000):

a = n

这个时候range(1000)段语句就默认生成一个含有1000个数的list(也就相当于C++中定义数组时固定大小)不管你是否使用这个list,它都在那里,占用内存,直到python解释器自动回收。然而使用yield组合便相当于一个动态的数据定义过程,如下:

def foo(num):

while num < 10:

num = num + 1

yield num

for n in foo(0):

print(n, end=' ')

print('')

'''

输出如下:

1 2 3 4 5 6 7 8 9 10

'''

python lambda表达式及用法_Python:lambda表达式和yield关键字理解与使用讲解相关推荐

  1. python lambda表达式及用法_python lambda表达式简单用法

    条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: # 普通条件语句 if 1 == 1: name = 'wupeiqi' else: name = 'alex' # 三元运 ...

  2. python三元表达式求值_python 三元表达式的 列表推导式 生成器推导式

    python中三元表达式的语法如下 ===if else result = x if condition else y 另外一种三元表达式,比较少见 result = (x, y)[condition ...

  3. python lambda函数for 字符串_Python Lambda

    版权所有,未经许可,禁止转载 lambda函数是一个简短的匿名函数. lambda函数可以接受任意数量的参数,但只能包含一个表达式. 语法 lambda 参数 : 表达式 接受参数,执行表达式,返回结 ...

  4. python中max函数用法_Python中max函数用法实例分析

    Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...

  5. python中symbols函数用法_Python中偏函数用法示例

    本文实例讲述了Python中偏函数用法.分享给大家供大家参考,具体如下: python中偏函数 当一个函数有很多参数时,调用者就需要提供多个参数.如果减少参数个数,就可以简化调用者的负担. 比如,in ...

  6. python中case的用法_python中Switch/Case实现的示例代码

    python 的 python中Switch/Case实现的示例代码 学习Python过程中,发现没有switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现 ...

  7. python 字典定义日志用法_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  8. [转载] python里字典的用法_python中字典(Dictionary)用法实例详解

    参考链接: Python字典dictionary copy方法 本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映 ...

  9. python中tile的用法_Python:numpy中的tile函数

    在学习机器学习实教程时,实现KNN算法的代码中用到了numpy的tile函数,因此对该函数进行了一番学习: tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复 ...

最新文章

  1. 多项式概率分布(Multinomial probability distribution)和分类分布(categorical distribution)
  2. Nuxt爬坑系列之vuex
  3. React Native之通过createStackNavigator实现携带参数的页面与页面之间的跳转
  4. Redis的数据结构之字符串
  5. 编程之美-翻烙饼Java实现
  6. python 自动化测试数据并发送到http-nodejs server
  7. Python实现在当前目录新建目录img, 里面包含100个文件, 100个文件名 各不相同(X4G5.png)
  8. tftp 查看服务器文件,如何从命令提示符列出Windows tftp服务器目录和文件?
  9. zabbix中mysql连不上的排错_zabbix使用排错 - oschina130111的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. Selenium-鼠标操作
  11. 改变iOS app的icon(iOS10.3)
  12. Proteus ISIS仿真软件中英文元件名称对照
  13. 菜鸟教程Python100例-笔记
  14. .net 访问共享文件夹
  15. 什么是服务器的上行带宽和下行带宽
  16. php+aira2+ffmpeg下载m3u8文件并保存成mp4
  17. 【5 于博士Cadence SPB15.7 快速入门视频】allegro的测量工具的使用
  18. 免费的在线白板协作工具有哪些?
  19. 诺禾-实验技巧之WB篇
  20. C语言与java中函数传参比较

热门文章

  1. hbase meta中分区信息错误的记录
  2. BZOJ3597 SCOI2014方伯伯运椰子(分数规划+spfa)
  3. Docker一些常用命令
  4. iOS绘图框架CoreGraphics分析
  5. hihoCoder挑战赛25
  6. nsautoreleasepool研究
  7. 5、main方法详解
  8. 天空象棋——网站与用户
  9. JS正则验证邮箱的格式
  10. C++ 中结构体的继承关系