11 Lambda表达式

Lambda就一个表达式,而不是语句。 Lambda的本质就是定义一个匿名的函数。

11.1 Lambda表达式的基本格式

变量 = lambda 变量1,变量2,..变量n : 执行的操作
例如,如果要实现两个变量的相加,传统来说,会如下编写:

def add(x, y):
    return x + y
print(add(3, 5))

如果是要lambda表达式来实现,可以如下编写:
其中实现了return x+y的操作,但是不需要写return语句

f = lambda x, y: x + y
print(f(1, 2))

11.2 函数中的例子

11.2.1 例子的代码

函数可以将一个函数名称传递个另外一个函数的形参。
可以通过dict类型来实现switch的结构。

需求:实现用户输入姓名,选择输入的语言,打印相应的语言向用户问好

代码1,最简单的方式,其中日语用的是lambda表达式的方式

def hello_chinese(name):
    print('你好', name)

def hello_english(name):
    print('Hello', name)

while True:
    name = input('请输入你的姓名:\n')
    if name == 'q':
        break
    lang = input('请选择语言:\n c是中文\n e是英文\n j是日文\n')
    f = lambda name: print('こんにちは', name)
    if lang == 'c':
        hello_chinese(name)
    elif lang == 'e':
        hello_english(name)
    elif lang == 'j':
        f(name)

代码2,对上述进行改进,直接使用lambda表达式进行函数的调用
其中注释掉了f = lambda name:print(' ',name)的代码,直接进行函数的调用。
lambda表达式定义的是一个匿名函数,可以赋值给一个变量进行操作。也可以自行操作。

def hello_chinese(name):
    print('你好', name)
def hello_english(name):
    print('Hello', name)
while True:
    name = input('请输入你的姓名:\n')
    if name == 'q':
        break

    lang = input('请选择语言:\n c是中文\n e是英文\n j是日文\n')

    #f = lambda name: print('こんにちは', name)

    if lang == 'c':
        hello_chinese(name)
    elif lang == 'e':
        hello_english(name)
    elif lang == 'j':
        (lambda name: print('こんにちは', name))(name)

代码3,使用dict实现switch语句的结构

def hello_chinese(name):
    print('你好', name)


def hello_english(name):
    print('Hello', name)


while True:
    name = input('请输入你的姓名:\n')
    if name == 'q':
        break

    lang = input('请选择语言:\n c是中文\n e是英文\n j是日文\n')

    dict_lan = dict(c=hello_chinese,
                    e=hello_english,
                    j=lambda name: print('こんにちは', name)
                    )

    dict_lan.get(lang, hello_chinese)(name)

代码3,使用委托
本质就是传递一个函数名称过来,以下的例子没有进行判断,实际需要进行判断,定义了一个hello,用于接收函数名称和变量

def hello_chinese(name):
    print('你好', name)


def hello_english(name):
    print('Hello', name)


def hello(action,name):
    action(name)


while True:
    name = input('请输入你的姓名:\n')
    if name == 'q':
        break

    lang = input('请选择语言:\n c是中文\n e是英文\n j是日文\n')

    hello(hello_chinese,name)

11.2.2 例子的原理

定义了一个hello的函数,其中用两个变量,一个是action,会指向不同的函数,相当于委托相关的函数进行执行。两外一个是name,是传递过来的一个变量。
img

11.2.3 函数工具

将list中的所有元素都加上5
方法1 : 使用for循环

listA = list(range(1,11))

res = []
for x in listA:
    res.append(x+5)

print(res)
结果:
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

方法2 : 使用推导

listA = list(range(1,11))

res = [x+5 for x in listA]

print(res)
结果:
[6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

方法3 : 使用map函数

listA = list(range(1, 11))


def add_num(x):
    return x + 5


res = list(map(add_num, listA))
print(res)
结果:[6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

方法4:使用filter函数

扩展阅读:https://www.cnblogs.com/xinjing-jingxin/p/9048005.html
filter和map的区别

listA = list(range(1, 11))


def find_even(x):
    if x % 2 == 0:
        return True
    else:
        return False

res = list(filter(find_even, listA))
print(res)
结果:[2, 4, 6, 8, 10]

如果并没有定义find_even函数,并且只想用一次,可以使用lambda表达式。

listA = list(range(1, 11))

res = list(filter(lambda x: x % 2 == 0, listA))
print(res)

上面的例子如果用map呢,可以看到filter和map的区别,filter具有过滤的功能。

listA = list(range(1, 11))


def find_even(x):
    if x % 2 == 0:
        return True
    else:
        return False

res = list(filter(find_even, listA))
print(res)

res = list(map(find_even, listA))
print(res)

结果:[2, 4, 6, 8, 10]
[False, True, False, True, False, True, False, True, False, True]

实际开发中,推导的效率会更高。

posted on 2022-08-01 14:11  飞飞fly  阅读(48)  评论(0编辑  收藏  举报