一.匿名函数
匿名即没有名字。
#普通函数
def func(x,y,z=1):
return x+y+z
#匿名函数及没有名字,只有参数列表与return的值表达式,用:分隔
lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,除非让其有名字
func=lambda x,y,z=1:x+y+z
func(1,2,3)
#让其有名字就没有意义
匿名函数与有名函数的对比
#有名函数与匿名函数的对比
有名函数:循环使用,保存了名字,通过名字就可以重复引用函数功能
匿名函数:一次性使用,随时随时定义
应用:max,min,sorted,map,reduce,filter
二. 内置函数与匿名函数的使用
python中有很多的内置函数,比如常用的max、range、type、getattr、setattr、open等。更多内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii
2.1 max、min
max与min的用法一样,用于获取一个可迭代对象中的最大值与最小值,可以key指定匿名函数自定义返回值用于max、min比较的依据。
# max,min使用方法一致
iterable = [1, 5, 3, 2, 7]
res = max(iterable, key=lambda x: x) # 参数:可迭代对象遍历的元素;返回值:做比较的值
print(res) # 7
# 薪资最高
iterable = {
'Bob': 12000,
'Tom': 37000,
'Jerry': 76000,
'Zero': 120,
}
res = max(iterable, key=lambda x: iterable[x]) # x: 字典的k 返回值:做比较的值
print(res) # Jerry
2.2 sorted
res = sorted([1, 3, 4, 2, 5], key=lambda x: x, reverse=True)
print(res) # [5, 4, 3, 2, 1]
iterable = {
'Bob': [100, 12000],
'Tom': [200, 37000],
'Jerry': [50, 76000],
'Zero': [150, 120],
}
res = sorted(iterable, key=lambda x: iterable[x][0]) # 按value列表的第一个元素大小排序
print(res) # ['Jerry', 'Bob', 'Zero', 'Tom']
2.3 map映射
map会将lambda函数作用于给予的可迭代对象中的每个元素上,之后返回一个迭代器对象。
res = map(lambda x: x + 2, [12, 36, 27, 21, 10])
print(list(res)) # [14, 38, 29, 23, 12]
dic = {
'a': 1,
'b': 2,
'c': 3
}
l = [1, 2, 3]
# 将dic的value与列表l的值相加,两个可迭代对象的值数量可以不相等,不相等时以数量少的为主
res = list(map(lambda x, y: dic[x] + y, dic, l))
print(res) # [2, 4, 6]
2.4 filter过滤
将可迭代对象中让lambda返回值为真的值过滤出来,返回一个迭代器对象。
# 将列表中的偶数过滤出来
res = filter(lambda x: x % 2 == 0, [1, 2, 3, 4, 5])
print(list(res)) # [2, 4]
2.5 reduce 合并
将可迭代对象中的元素通过lambda函数合并为一个值,并返回该值。在python3中,reduce使用需要先导入模块。
from functools import reduce
# reduce: 合并 第三个参数默认是None,如果写了的话也会当做队列(列表、元组、集合)的元素参与运算
res = reduce(lambda f, n: f + n, [1, 2, 3, 4, 5])
print(res) # 15
res = reduce(lambda f, n: f + n, [1, 2, 3, 4, 5], 77)
print(res) # 92
2.6 abs、pow、sum、divmod
运算相关。
# 运算
print(abs(-1)) # 绝对值 1
print(pow(2, 3, 3)) # 2 ** 3 % 3 2
print(sum([1, 2, 3])) # 求和 6
print(divmod(100, 30)) # 100与30形成商与余数 (3, 10)
2.7 all、any
print(all([1, 2, 'abc'])) # 元素全真为真 True
print(any([1, "", None])) # 元素有真则真 True
2.8 zip
zip可以用于将两个可迭代对象整合为一个字典,第一个参数为key,第二个参数为value,字典键值对个数以长度短的可迭代对象为主,返回的是一个迭代器对象。
l1 = ['a', 'b']
l2 = '12345'
res = zip(l1, l2)
print(res) # <zip object at 0x0233F8C8>
print(dict(res)) # {'a': '1', 'b': '2'}
2.9 format 格式化
格式化中有可以转换进制的模式。
#整形数值可以提供的参数有 'b' 'c' 'd' 'o' 'x' 'X' 'n' None
>>> format(3,'b') #转换成二进制
'11'
>>> format(97,'c') #转换unicode成字符
'a'
>>> format(11,'d') #转换成10进制
'11'
>>> format(11,'o') #转换成8进制
'13'
>>> format(11,'x') #转换成16进制 小写字母表示
'b'
>>> format(11,'X') #转换成16进制 大写字母表示
'B'
>>> format(11,'n') #和d一样
'11'
>>> format(11) #默认和d一样
'11'
实际上 想要转换进制,还可以使用下列方式:
或者使用内置函数:
2.10 eval、exec
实际上元类type生产类时,创建类的名称空间需要exec的参与,eval用于执行表达式,并返回表达式执行的结果,二exec用来执行语句,不会返回任何值。
# eval可以理解将最外层''去除,形成可执行的对象
s = 'print(123)'
eval(s)
s = '{"a": 1}'
res = eval(s)
print(res['a'])
exec依据字符串给指定的字典加值,只会将字符串中key=value形式加入字典,而且格式比较苛刻,比如a前面加个空格就会报错了。
s = '''
a=1
b=2
4
'''
dic = {}
exec(s, {}, dic)
print(dic) # {'a': 1, 'b': 2}
其他示例:
#1、语法
# eval(str,[,globasl[,locals]])
# exec(str,[,globasl[,locals]])
#eval与exec区别
#示例一:
s='1+2+3'
print(eval(s)) #eval用来执行表达式,并返回表达式执行的结果
print(exec(s)) #exec用来执行语句,不会返回任何值
'''
None
'''
#示例二:
print(eval('1+2+x',{'x':3},{'x':30})) #返回33
print(exec('1+2+x',{'x':3},{'x':30})) #返回None
# print(eval('for i in range(10):print(i)')) #语法错误,eval不能执行表达式
print(exec('for i in range(10):print(i)'))
2.11 compile
# compile(str,filename,kind)
# filename:用于追踪str来自于哪个文件,如果不想追踪就可以不定义
# kind可以是:single代表一条语句,exec代表一组语句,eval代表一个表达式
s ='for i in range(3):print(i, end=" ")'
code = compile(s, '', 'exec')
exec(code) # 0 1 2
s = '1+2+3'
code=compile(s, '', 'eval')
eval(code) # ''