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

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

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

 

posted @ 2019-08-26 17:28  maoruqiang  阅读(604)  评论(0编辑  收藏  举报