匿名函数

  匿名:隐藏名字,既没有名称
  匿名函数:没有名字的函数
  函数没有名字该如何定义?函数没有名字如何调用?
    lambda 表达式
  Python 中,使用 lambda 表达式构建匿名函数。

lambda x : x ** 2    # 定义
print((lambda x : x ** 2)(4))    # 调用,输出

  使用 lambda 关键字定义匿名函数,格式为:

lambda [参数列表] : 表达式

  参数列表不需要小括号,无参就不写参数;
  冒号用来分割参数列表和表达式部分;
  不需要使用 return。表达式的值,就是匿名函数的返回值。表达式中不能出现等号;
  lambda 表达式(匿名函数)只能写在一行上,也称为单行函数。

匿名函数往往用在为高阶函数传参时,使用 lambda 表达式, 往往能简化代码。

# 返回常量的函数
print((lambda : 0)())

# 加法匿名函数,带缺省值
print((lambda x, y=3: x + y)(5))
print((lambda x, y=3: x + y)(5, y=10))

# keyword-only 参数
print((lambda x, *, y=3: x + y)(5))
print((lambda x, *, y=3: x + y)(5, y=10))

# 可变参数
print((lambda *args: args)(*range(10)))  # 10
print((lambda *args: [args])(*range(10)))  # 1
print((lambda *args: [*args])(*range(10)))  # 10
print((lambda *args: {x for x in args})(*range(10)))
print((lambda *args: {x % 2 for x in args})(*range(10)))  # 去重
print((lambda *args: (x for x in args))(*range(10)))  # 生成器表达式
for i in (lambda *args: (x for x in args))(*range(10)):
    print(i)

[x for x in (lambda *args: map(lambda x: x + 1, args))(*range(5))]  # 高阶函数
[x for x in (lambda *args: map(lambda x: (x + 1, args), args))(*range(5))]
# 例:简单排序
l1 = [1, 2, '1', 'a']  # sorted 函数


# 使用函数
def fn(x):
    if isinstance(x, str):
        return ord(x)
    return x


print(sorted(l1, key=fn))

# 使用 lambda
print(sorted(l1, key=lambda x: ord(x) if isinstance(x, str) else x))




04-23 23:50