1.匿名函数
匿名函数的使用使得程序更加简洁。匿名函数不需要return来返回值,表达式本身结果就是返回值。一般匿名函数通过lambda表达式来实现。
2.lambda表达式
1)python执行一些脚本时,使用lambda表达式可以省去函数定义过程,比如说我们只是需要写个简单的程序来管理服务器时间,我们就不需要专门定义一个函数再写调用,使用lambda就可以使得代码更加简洁。

2)对于一些比较抽象并且整个程序执行下来只需要调用一两次的函数,有时候给函数起个名字也是比较头疼的问题,使用labmda就不需要考虑命名问题了。

3)简化代码的可读性,由于普通函数阅读经常要跳到开头def定义部分,使用lambda表达式就可以省略以上步骤。

【语法】:lambda 原函数参数:原函数返回值。示例:

g = lambda x: 2 * x + 1
print(g(5))  #【输出】:11

下面举例说明多参数的情况:

g = lambda x, y: x + y
print(g(3,7))  #【输出】:10

3.两个很厉害的内置函数
1)filter()(过滤器)
filter有两个参数,第一个参数可以是一个函数(function),也可以是一个None对象;第二个参数是一个可迭代的数据iterable。如果第一个参数是函数,则将第二个可迭代数据里的每一个元素作为函数的参数进行计算,把返回结果为True的值筛选出来,生成一个列表。如果第一个参数为None,则把第二个参数里为True的值筛选出来。

简单来说,filter(x, y)中,x是筛选条件,y是筛选对象。下面举例说明:

---------------------------------------------- ex1 ----------------------------------------------

a = filter(None, [1, 0, False, True])
print(a)       #【输出】:<filter object at 0x00000228FF370080>
'''我们发现,此时输出的是一个对象,我们用list方法把它变成一个列表:'''
print(list(a)) #【输出】:[1, True]

---------------------------------------------- ex2 ----------------------------------------------

def odd(x):
    return x % 2

temp = range(10)
show = filter(odd, temp)
a = list(show)
print(a)      #【输出】:[1, 3, 5, 7, 9]

---------------------------------------------- ex3 ----------------------------------------------
#在学习了lambda表达式后,上面的程序完全可以用一行代码实现:

a = list( filter( lambda x: x % 2, range(10) ) )
print(a)      #【输出】:[1, 3, 5, 7, 9]

2)map()(映射)
map() 与filter()类似,它也有两个内置参数,一个是函数,一个是可迭代序列,其功能是将序列的每一个元素作为函数的参数进行运算和加工,直到可迭代序列的每个元素都加工完毕,返回所有加工后的元素构成的新序列。

简单理解:map(x, y)中,x是函数,y是一系列自变量,map()后返回因变量。举例说明:

a = list( map( lambda x: x * 2, range(10) ) )
print(a)        #【输出】:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

4.思考与练习
--------------------------------------------------- ex1 ---------------------------------------------------
1. 请使用lambda表达式将下边函数转变为匿名函数

def fun_A(x, y = 3):
    return x*y
'''转变为lambda表达式后为:'''
lambda x, y = 3 : x * y

--------------------------------------------------- ex2 ---------------------------------------------------
2. 请将下面的匿名函数转变为普通函数

lambda x : x if x % 2 else None
'''转变为普通函数后为:'''
def function(x):
    if x % 2:
        return x
    else:
        return None

--------------------------------------------------- ex3 ---------------------------------------------------
3. 利用filter()和lambda()表达式快速求出100以内所有3的倍数

a = list( filter( lambda n : not( n % 3 ), range( 1, 100 ) ) )
print( a )
#【输出】:[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
'''
【分析】:在(n % 3)中,若该式有余数,则为True。若该式无余数,则为False,加上not,则当上式余数为0时为真。
'''

--------------------------------------------------- ex4 ---------------------------------------------------
4.还记得列表推导式吗?请使用列表推导式代替filter()和lambda组合

a = [ i for i in range( 1, 100 ) if not( i%3 ) ]
print(a)
#【输出】:[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
'''可见列表推导式更加简单'''

--------------------------------------------------- ex5 ---------------------------------------------------
5.还得zip吗?使用zip会将两数以元组的形式绑定在一起,例如:

a = list( zip( [1, 3, 5, 7, 9], [2, 4, 6, 8,10] ) )
print(a)
#【输出】:[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
'''
但如果希望打包的形式是灵活多变的列表,而不是元组,( 希望是[ [1,2],[3,4],[5,6],[7,8],[9,10] ] )如何做到?(采用map和lambda表达式)
'''
a = list( map( lambda x, y : [x, y], [1,3,5,7,9], [2,4,6,8,10] ) )
print(a)
#【输出】:[ [1,2],[3,4],[5,6],[7,8],[9,10] ] 
'''上面代码中,[1,3,5,7,9]实际上就相当于lambda x, y中的x'''

--------------------------------------------------- ex6 ---------------------------------------------------
6.请判断下面表达式的输出结果:

def make_repeat(n):
    return lambda s : s * n

double = make_repeat(2)
print( double(8) )
print( double('Hello') )

'''
【解析】:上面的函数返回值为一个lambda表达式,实际上也就相当于一个嵌套函数,所以 double(s) 实际上等于 double(2)(s) ,故输出:'''
#16
#HelloHello