Python之函数进阶-匿名函数

Python之函数进阶-匿名函数

匿名函数

  • 匿名:隐藏名字,即没有名称
  • 匿名函数:没有名字的函数。
  • Lambda表达式 Python中,使用Lambda表达式构建匿名函数。
    • 使用lambda关键字定义匿名函数,格式为 lambda [参数列表]: 表达式
    • 参数列表不需要小括号。无参就不写参数
    • 冒号用来分割参数列表和表达式部分
    • 不需要使用return。表达式的值,就是匿名函数的返回值。表达式中不能出现等号 lambda表达式(匿名函数)只能写在一行上,也称为单行函数
    • 匿名函数往往用在为高阶函数传参时,使用lambda表达式,往往能简化代码

lambda : 0

# lambda匿名函数
# 返回结果:()>
(lambda : 0)()

# 调用Lambda函数
# 返回结果:0
(lambda x: 100)()

# 参数x没有给值
# 报错内容:TypeError: () missing 1 required positional argument: 'x'
(lambda x: 100)(1)

# 参数x给值
# 返回结果:100
(lambda x: 100)(x=111)

# 返回结果:100
def a():
    return None

b = lambda : None # 单行函数,只能写一行的函数
print(a.__name__)
print(b.__name__)

# lambda是匿名函数,没有名字
# 返回结果:a
# 返回结果:
(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))

# 生成了一个生成器表达式
# 返回结果:.. 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 defaultdict

d2 = defaultdict(list)
d2['t'].extend(range(5)) # d2['t'] KeyError,会创建 d2['t'] = list()
print(d2)

# d2往t这个key中extend(扩展)内容时,如果没有t这个key,就会调用list进行创建
# 返回结果:defaultdict(, {'t': [0, 1, 2, 3, 4]})
from collections import defaultdict

d2 = defaultdict(list)
d2['m'].add(100)
print(d2)

# 报错说明,list对象没有add的属性
# 报错内容:AttributeError: 'list' object has no attribute 'add'
from collections import defaultdict

d2 = defaultdict(set)
d2['m'].add(100)
print(d2)

# 把list换成set(集合)就可以了。
# 返回结果:defaultdict(, {'m': {100}})
from collections import defaultdict

d2 = defaultdict(list)
d2['m'].append(100)
print(d2)

# 返回结果:defaultdict(, {'m': [100]})
from collections import defaultdict

d2 = defaultdict(lambda : list())
d2['m'].append(100) # d2['m'] = (lambda :list())() => list() => []
print(d2)

# 返回结果:defaultdict( at 0x107e90f40>, {'m': [100]})
from collections import defaultdict

d2 = defaultdict(lambda : {100})

print(d2['m'])
print(d2)

# 返回结果:{100}
# 返回结果:defaultdict( at 0x107ac23e0>, {'m': {100}})

字典的值比较

x = ['a', 1, 'b', 20, 'c', 32]
print(sorted(x, key=str)) # 比较

# 返回结果:[1, 20, 32, 'a', 'b', 'c']

你可能感兴趣的:(Python,python)