python匿名函数就是没有名字的函数_python内置函数与匿名函数

一.匿名函数

匿名即没有名字。

#普通函数

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

二. 内置函数与匿名函数的使用

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 importreduce#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) #

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'

实际上 想要转换进制,还可以使用下列方式:

python匿名函数就是没有名字的函数_python内置函数与匿名函数_第1张图片

或者使用内置函数:

python匿名函数就是没有名字的函数_python内置函数与匿名函数_第2张图片

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)#''

你可能感兴趣的:(python匿名函数就是没有名字的函数_python内置函数与匿名函数)