前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - lambda 表达式

Python - lambda 表达式

作者头像
小菠萝测试笔记
发布2021-08-13 13:04:46
6530
发布2021-08-13 13:04:46
举报
文章被收录于专栏:自动化、性能测试

Python 中的函数是第一类对象

  • 好像很多地方都会看到这样一句话
  • Python 创始人也说过,所有的对象都是第一类对象

什么是第一类对象

  • 在上面中所说的第一类对象,其实是指函数作为一个对象,与其它对象具有相同的地位
  • 具体来说,数值可以被赋值给变量、作为参数传递给函数、作为返回值
  • 因为函数和数值具有相同的地位,所以函数也可以被赋值给变量、作为参数传递给函数、作为返回值

将对象赋值给变量

可以将数值、字符串、列表、字典类型的对象赋值给变量

代码语言:javascript
复制
number = 123
string = "hello"
list = [1, 2, 3]
dict = {'name': 'tom', 'age': 12}

将对象作为参数传递

可以将数值、字符串、列表、字典类型的对象作为参数传递给函数

代码语言:javascript
复制
print(123)
print("hello")
print([1, 2, 3])
print({'name': 'tom', 'age': 12})

将对象用作返回值

可以将数值、字符串、列表、字典类型的对象作为函数的返回值

代码语言:javascript
复制
def return_number():
    return 123

def return_string():
    return "hello"

def return_list():
    return [1, 2, 3]    

def return_dict():    
    return {'name': 'tom', 'age': 12}

将函数作为第一类对象

将函数作为第一类对象,函数具有和数值、字符串、列表、字典等类型的对象具有相同的地位

将函数赋值给变量
代码语言:javascript
复制
def max(a, b):
    if a > b:
        return a
    else:
        return b


var = max
print(var(1, 2))


# 输出结果
2
将函数作为参数传递
代码语言:javascript
复制
def func():
    print("function")


def pass_func(data):
    print("pass func")
    data()


pass_func(func)


# 输出结果
pass func
function
将函数作为返回值
代码语言:javascript
复制
def func():
    print("function")


def return_func():
    print("pass func")
    return func


# 等价 var = func
var = return_func()
var()

将函数作为第一类对象的意义

将函数作为第一类对象,是一种重要的抽象机制,极大的提升了程序的灵活性

实战栗子
  • 存在一个列表 [1, -1, 2, -2, 3, -3]
  • 打印输出列表中的正数
  • 打印输出列表中的负数
包含重复性代码的解决方法

代码结构完全相同,只是条件判断不同

代码语言:javascript
复制
# 重复性代码解决方法
list = [1, -1, 2, -2, 3, -3]


def print_positive(list):
    for item in list:
        if item > 0:
            print(item)


def print_negative(list):
    for item in list:
        if item < 0:
            print(item)


print_positive(list)
print_negative(list)


# 输出结果
1
2
3
-1
-2
-3
将函数作为参数传递
代码语言:javascript
复制
# 重复性代码解决方法
list = [1, -1, 2, -2, 3, -3]

def positive(x):
    return x > 0


def negative(x):
    return x < 0


def test(list, select_fun):
    for item in list:
        if select_fun(item):
            print(item)


test(list, positive)
test(list, negative)


# 输出结果
1
2
3
-1
-2
-3

匿名函数 lambda

为什么有 lambda 匿名函数
  • 在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便
  • Python 提供了 lambda 表达式对匿名函数提供支持
lambda 表达式的语法
代码语言:javascript
复制
lambda args: expression

expression 只允许是一条表达式,所以使用很受限

lambda 表达式小栗子
代码语言:javascript
复制
lambda x:x>2

等价函数写法

代码语言:javascript
复制
def select_positive(x):
    return x > 0
使用 lambda 表达式重写上面的将函数作为参数传递
代码语言:javascript
复制
def test(list, select_fun):
    for item in list:
        if select_fun(item):
            print(item)


list = [1, -1, 2, -2, 3, -3]

test(list, lambda x: x > 0)
test(list, lambda x: x < 0)


# 输出结果
1
2
3
-1
-2
-3

map 函数

使用 Python 内置的 map 函数时,通常会用到 lambda 表达式

函数语法
代码语言:javascript
复制
map(function, list)
  • map 函数接收两个参数 function 和 list
  • function 是一个函数,list 是一个可以被遍历的序列
  • map 将传入的函数依次作用到序列的每个元素,并把结果作为新的序列返回
map 函数原理
  • 图的左边是一个序列 list,包含 3 个元素 1、2、3
  • 调用函数 map 时,需要提供一个函数 y = f (x),函数 f 将输入 x 映射为输出 y
  • 将函数 f 对图的左边的序列中的每个元素依次作用,得到图的右边的序列
  • 图的右边是一个序列 list,包含 3 个元素 f (1)、f (2)、f (3)
非 lambda 的写法
代码语言:javascript
复制
list = [1, 2, 3]


def test(x):
    x += 5
    return x


list1 = map(test, list)
for i in list1:
    print(i)


# 输出结果
6
7
8
lambda 的写法
代码语言:javascript
复制
list = [1, 2, 3]

list1 = map(lambda x: x + 5, list)
for i in list1:
    print(i)


# 输出结果
6
7
8

lambda 表达式栗子一:将 lambda 赋值给变量

  • 将 lambda 表达式赋值给一个变量
  • 这样调用这个变量,相当于调用了一个函数
代码语言:javascript
复制
f = lambda a, b: a if a > b else b
print(f(1, 2))


# 输出结果
2


# lambda 表达式等价写法
def test(a, b):
    if a > b:
        return a
    else:
        return b

lambda 表达式栗子二:将 lambda 作为函数参数传递

代码语言:javascript
复制
f = lambda x: x if x > 0 else 0


def test(f, x):
    if f(x):
        print("正数")
    else:
        print("负数")


test(f, 1)
test(f, -1)


# 输出结果
正数
负数


# lambda 表达式等价写法
def func(x):
    if x > 0:
        return x
    else:
        return 0

lambda 表达式栗子三:将 lambda 作为函数返回值

代码语言:javascript
复制
f = lambda a, b, c: a * b * c


def test(a, b, c):
    a += 1
    b += 2
    c += 3
    return f(a, b, c)


print(test(1, 2, 3))


# 输出结果
48


# 等价写法
def test(a, b, c):
    return a * b * c

Python 内置函数接受函数作为参数

  • filter(function, iterable):用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
  • sorted(iterable, cmp=None, key=None, reverse=False):对所有可迭代的对象进行排序操作
  • map(function, iterable, ...):根据提供的函数对指定序列做映射
  • reduce(function, iterable[, initializer]):会对参数序列中元素进行累积

后面再详说这些函数

总结

lambda 表达式常用场景:当某些功能代码只用一次的时候,可以用 lambda 代替

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python 中的函数是第一类对象
  • 什么是第一类对象
  • 将对象赋值给变量
  • 将对象作为参数传递
  • 将对象用作返回值
  • 将函数作为第一类对象
    • 将函数赋值给变量
      • 将函数作为参数传递
        • 将函数作为返回值
        • 将函数作为第一类对象的意义
          • 实战栗子
            • 包含重复性代码的解决方法
              • 将函数作为参数传递
              • 匿名函数 lambda
                • 为什么有 lambda 匿名函数
                  • lambda 表达式的语法
                    • lambda 表达式小栗子
                      • 使用 lambda 表达式重写上面的将函数作为参数传递
                      • map 函数
                        • 函数语法
                          • map 函数原理
                            • 非 lambda 的写法
                              • lambda 的写法
                              • lambda 表达式栗子一:将 lambda 赋值给变量
                              • lambda 表达式栗子二:将 lambda 作为函数参数传递
                              • lambda 表达式栗子三:将 lambda 作为函数返回值
                              • Python 内置函数接受函数作为参数
                              • 总结
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档