首页 > 技术文章 > python---内建函数

zoer 2020-06-27 15:38 原文

内建函数

sorted()

sorted(iterable,*,key=None,reverse=False)
返回一个 新已排序的列表
key 指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower)。 默认值为 None (直接比较元素)
reverse 为一个布尔值。 如果设为 True,则每个列表元素将按反向顺序比较进行排序。

基本排序
>>>sorted({0: 0, 3: 1, 5: 2, 9: 3, 2: 4})
[0, 2, 3, 5, 9]

如果iterable 是字典,则默认以key进行排序

关键函数

key 形参的值应该是一个函数,它接受一个参数并并返回一个用于排序的键。这种技巧速度很快,因为对于每个输入记录只会调用一次 key 函数。

>>>students_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
>>>sorted(students_tuples,key=lambda x:x[2],reverse=True)   #key为一个lambda函数,迭代接收iterable中的元素作为实参传给形参x,lambda函数返回x[2]值用于排序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] 

对于类对象,也可以使用对象的属性作为key的返回值

operator函数模块
>>>from operator import itemgetter,attrgetter
>>>sorted(students_tuples,key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

key = itemgetter(2) 等同于 key = lambda x:x[2] ,更简单、快捷
Operator 模块功能允许多级排序。例如,先根据索引位1,再根据索引位2
>>>sorted(students_tuples,key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] #先做A、B排序,再在B的基础上做int排序

filter()

filter(function, iterable),返回一个新的迭代器
函数 function 用 iterable 中的元素遍历,function 返回真的那些元素,构建一个新的迭代器

>>>list(filter(lambda x : x % 3 ==0,range(10)))  #lambda函数用range(10)中的元素作为参数遍历,取余为零函数返回值为True,则filter返回这些元素的迭代器
[0, 3, 6, 9]  

如果 function 是 None ,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。
>>>list(filter(None,range(5)))
[1, 2, 3, 4]

map()

map(function, iterable, ...)
返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器

>>>dict(map(lambda x:(str(x+1),x+1),range(5))) #lambda函数对iterable重新构造,并返回一个迭代器  
{'1': 1, '2': 2, '3': 3, '4': 4, '5': 5}

如果传入了额外的 iterable 参数,function 必须接受相同个数的实参并被应用于从所有可迭代对象中并行获取的项

>>>list(map(lambda x,y:(x+1,y+1),range(5),range(5)))
[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]

当有多个可迭代对象时,最短的可迭代对象耗尽则整个迭代就将结束

>>>list(map(lambda x,y:(x+1,y+1),range(5),range(10)))
[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]

zip()

zip(*iterables)
创建一个聚合了来自每个可迭代对象中的元素的迭代器

>>>list(zip(range(10),range(10),range(10)))
[(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8), (9, 9, 9)]

zip与map结合使用生成一个字典

>>>dict(zip(map(lambda x : str(x+1),range(10)),range(10)))
>>>{str(x+1):y for x,y in zip(range(10),range(10))}
{'1': 0, '2': 1, '3': 2, '4': 3, '5': 4, '6': 5, '7': 6, '8': 7, '9': 8, '10': 9}

iter(),next(),reversed(),enumerate()

内建函数 函数签名 说明
iter iter(iterable) 把一个可迭代对象包装成一个迭代器
next next(iterable,[,default]) 取迭代器下一个元素;如果已经取完抛出stopIteration异常;如果给定缺省值,取完后返回缺省值
reversed reversed(seq) 返回一个翻转元素的迭代器
enumerate enumerate(seq,start=0) 迭代一个可迭代对象,返回一个迭代器;每个元素都是数字和元素组成的二元组,数字已start给定的值开始累加,默认是0

chr(),ord()

chr()返回字节码对应的字符,实参可以为不同进制

>>>print(chr(0b01000001),chr(0o101),chr(65),chr(0x41))
A A A A

ord()返回字符对应的字节码,返回值为十进制

>>>print(ord('A'))
65  #在计算机中用十进制表示的字节码,界面展现为65,实际在计算机中保存为0b01000001

推荐阅读