Python之函数进阶-匿名函数
匿名函数
- 匿名:隐藏名字,即没有名称
- 匿名函数:没有名字的函数。
- Lambda表达式 Python中,使用Lambda表达式构建匿名函数。
- 使用lambda关键字定义匿名函数,格式为 lambda [参数列表]: 表达式
- 参数列表不需要小括号。无参就不写参数
- 冒号用来分割参数列表和表达式部分
- 不需要使用return。表达式的值,就是匿名函数的返回值。表达式中不能出现等号 lambda表达式(匿名函数)只能写在一行上,也称为单行函数
- 匿名函数往往用在为高阶函数传参时,使用lambda表达式,往往能简化代码
lambda : 0# lambda匿名函数
# 返回结果:<function __main__.<lambda>()>
(lambda : 0)()# 调用Lambda函数
# 返回结果:0
(lambda x: 100)()# 参数x没有给值
# 报错内容:TypeError: <lambda>() missing 1 required positional argument: 'x'
(lambda x: 100)(1)# 参数x给值
# 返回结果:100
(lambda x: 100)(x=111)# 返回结果:100
def a():return Noneb = lambda : None # 单行函数,只能写一行的函数
print(a.__name__)
print(b.__name__)# lambda是匿名函数,没有名字
# 返回结果:a
# 返回结果:<lambda>
(lambda x, y=10: x + y)(5)# lambda匿名函数,加法计算
# 返回结果:15
(lambda x, y=10: x + y)(y=11, x=5)# lambda匿名函数,加法计算
# 返回结果:16
(lambda x, *, y=10: x + y)(5, y=6)# lambda匿名函数,加法计算
# 返回结果:11
(lambda x, /, *, y=10: x + y)(5, y=6)# lambda匿名函数,加法计算
# 返回结果:11
f = lambda x, /, *, y=10: x + y
print(f(5, y=11))# lambda匿名函数,加法计算
# 返回结果:16
(lambda *args: [i for i in args])(range(5)) # 因为没有解构
# 返回结果:[range(0, 5)]
(lambda *args: [i for i in args])(*range(5))# 因为没有解构
# 返回结果:[0, 1, 2, 3, 4]
(lambda *args: [i+1 for i in args])(*range(5))# 因为没有解构
# 返回结果:[1, 2, 3, 4, 5]
(lambda *args: list((i+1 for i in args)))(*range(5))# 使用了生成器
# 返回结果:[1, 2, 3, 4, 5]
(lambda *args: (i+1 for i in args))(*range(5))# 生成了一个生成器表达式
# 返回结果:<generator object <lambda>.<locals>.<genexpr> at 0x105bb2670>
(lambda *args: {i%3 for i in args})(*range(5))# 返回集合,i%3返回3的余数,0,1,2
# 返回结果:{0, 1, 2}
dict(map(lambda x:(x, x+1), range(5)))# 生成字典
# 返回结果:{0: 1, 1: 2, 2: 3, 3: 4, 4: 5}
dict(map(lambda x:(str(x), x+1), range(5)))# 生成字典
# 返回结果:{'0': 1, '1': 2, '2': 3, '3': 4, '4': 5}
",".join(map(str, range(5)))# join字符串拼接
# 返回结果:'0,1,2,3,4'
{str(i):i+1 for i in range(5)} # 字典解析式
# 返回结果:{'0': 1, '1': 2, '2': 3, '3': 4, '4': 5}
# 需求:我要一个字典,kv对,key对应的value必须是列表
d1 = {k:[] for k in 'abcde'}
print(d1)
d1['a'].append(1)
print(d1)# 每次返回的结果都是全新的,所以修改列表中的值没有覆盖其他
# 返回结果:{'a': [], 'b': [], 'c': [], 'd': [], 'e': []}
# 返回结果:{'a': [1], 'b': [], 'c': [], 'd': [], 'e': []}
d1 = dict(map(lambda x: (x, []), 'abcde'))
print(d1)
d1['a'].append(1)
print(d1)# lambda实现,每次返回的结果都是全新的,所以修改列表中的值没有覆盖其他
# 返回结果:{'a': [], 'b': [], 'c': [], 'd': [], 'e': []}
# 返回结果:{'a': [1], 'b': [], 'c': [], 'd': [], 'e': []}
d1 = dict.fromkeys('abcde', [])
print(d1)
d1['a'].append(1)
print(d1)# 指向同一个列表,1个边都会变
# 返回结果:{'a': [], 'b': [], 'c': [], 'd': [], 'e': []}
# 返回结果:{'a': [1], 'b': [1], 'c': [1], 'd': [1], 'e': [1]}
d1 = {k:[] for k in 'abcde'}
print(d1)
d1['a'].append(1)
print(d1)
d1['f'] = []
d1['f'].append(100)
print(d1)# 字典中添加kv对
# 返回结果:{'a': [], 'b': [], 'c': [], 'd': [], 'e': []}
# 返回结果:{'a': [1], 'b': [], 'c': [], 'd': [], 'e': []}
# 返回结果:{'a': [1], 'b': [], 'c': [], 'd': [], 'e': [], 'f': [100]}
from collections import defaultdictd2 = defaultdict(list)
d2['t'].extend(range(5)) # d2['t'] KeyError,会创建 d2['t'] = list()
print(d2)# d2往t这个key中extend(扩展)内容时,如果没有t这个key,就会调用list进行创建
# 返回结果:defaultdict(<class 'list'>, {'t': [0, 1, 2, 3, 4]})
from collections import defaultdictd2 = defaultdict(list)
d2['m'].add(100)
print(d2)# 报错说明,list对象没有add的属性
# 报错内容:AttributeError: 'list' object has no attribute 'add'
from collections import defaultdictd2 = defaultdict(set)
d2['m'].add(100)
print(d2)# 把list换成set(集合)就可以了。
# 返回结果:defaultdict(<class 'set'>, {'m': {100}})
from collections import defaultdictd2 = defaultdict(list)
d2['m'].append(100)
print(d2)# 返回结果:defaultdict(<class 'list'>, {'m': [100]})
from collections import defaultdictd2 = defaultdict(lambda : list())
d2['m'].append(100) # d2['m'] = (lambda :list())() => list() => []
print(d2)# 返回结果:defaultdict(<function <lambda> at 0x107e90f40>, {'m': [100]})
from collections import defaultdictd2 = defaultdict(lambda : {100})print(d2['m'])
print(d2)# 返回结果:{100}
# 返回结果:defaultdict(<function <lambda> at 0x107ac23e0>, {'m': {100}})
字典的值比较
x = ['a', 1, 'b', 20, 'c', 32]
print(sorted(x, key=str)) # 比较# 返回结果:[1, 20, 32, 'a', 'b', 'c']