15-2 内置函数(filter、map、enumerate、divmod、zip、id、all、any、bin、oct、hex、bytes)
Python3.6.1 Built-in Functions
https://docs.python.org/3/library/functions.html
all(iterable)
如果参数(可迭代对象)中所有元素为真(即不为空或0),返回True
any(iterable)
如果参数(可迭代对象)中有一个元素为真(即不为空或0),返回True
进制转换
bin(x)
将x从十进制转换为二进制
oct(x)
将x从十进制转换为八进制
hex(x)
将x从十进制转换为十六进制
bytes()
将字符串按某种编码规则转换成字节码。
>>> bytes('李姐',encoding='utf-8') b'\xe6\x9d\x8e\xe5\xa7\x90' # utf-8 编码中,一个汉字占3个字节 >>> bytes('李姐',encoding='gbk') b'\xc0\xee\xbd\xe3' # GBK编码中,一个汉字占2个字节 >>> s = bytes('李姐',encoding='utf-8') >>> str(s, encoding='utf-8') '李姐'
divmod(a, b)
同时返回商和余数。
n1, n2 = divmod(97, 10) print(n1, n2) # 输出:9 7 即:商为9,余数为7
enumerate(iterable)
对于一个可迭代的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
list1 = ["a", "b", "c", "d"] for index, item in enumerate(list1): print(index, item) # 输出: 0 a 1 b 2 c 3 d
filter(function, iterable)
遍历iterable中的 item并依次执行function(item),将执行结果为True的item做成一个filter object的迭代器返回。只过滤值,不改变值。
- 参数function为过滤函数
- 参数iterable是需要过滤的对象(可以是list、set、tuple等)
(1)当filter的函数参数为function时
names = ['Fred', 'Wilma', 'Barney'] # 过滤条件函数 def long_name(name): return len(name) > 5 # 过滤函数也可以用lambda方式写为: # long_name = lambda x: len(x)>5 # 调用,在python3中返回的是过滤器filter对象 fil_obj = filter(long_name, names) print(fil_obj) # 输出:<filter object at 0x000000000284EB38> print(list(fil_obj)) # 转换成列表,输出: ['Barney']
使用生成式,可以实现等价的功能:
obj = (name for name in names if len(name)>5) print(obj) # 输出:generator object <genexpr> at 0x00000000028FF048> print(list(obj)) # 转换成列表,输出:['Barney']
注意:function(item)处理的过程中,有些结果可能返回的是None,因为不为True,会被过滤掉,如下:
def f(m): if m > 22: return m li = [11, 22, 33, 44, 55] ret = filter(f, li) # f(li)的有些结果是None,如f(11)。因为不为True,会被过滤掉。 print(list(ret)) # 返回 [33, 44, 55]
(2)当filter的函数参数为None时
使用默认构造函数 ,会将序列中的所有为False的值过滤掉:
a = list(filter(None, [1, 0, 2, [], '', 'a'])) print(a) # 输出为:[1, 2, 'a']
过滤掉了 0, [] 和 '', 因为这几个元素在python都被认为是false值。
为None时,等价的生成式为:
a = (i for i in [1, 0, 2, [], '', 'a'] if i) print(list(a)) # 输出为:[1, 2, 'a']
补充:
在itertools模块中有一个filter的过滤函数, 它的工作原理与前面的过滤器完全相同,但只保留值为False的元素。
from itertools import filterfalse # filterfalse第一个参数为None: a = list(filterfalse(None, [1, 0, 2, [], '', 'a'])) print(a) #排除了 1, 2, 'a',只要不是False的都过滤掉,输出: [0, [], '']
id()
本函数是返回对象object的标识符,标识符类型为整数,在同一个时间里所有对象的标识符是唯一的,如果在不同生命周期的对象有可能有相同的标识符。比如创建对象A之后,再删除A,再创建对象B,对象A与对象B可能有相同的标识符。
在CPython里的实现算法是直接返回对象所在内存地址。
map(function, iterable)
遍历并可改变值。
对iterable中的item依次执行function(item),将执行结果组成一个map object迭代器返回。
def f(n): return n+1 li = [11, 22, 33, 44, 55] ret = map(f, li) print(ret) # 输出为 <map object at 0x02151190> print(list(ret)) # 输出为 [12, 23, 34, 45, 56]
zip()
对应合并
x = [1, 2, 3] y = [4, 5, 6] z = [7, 8, 9] xyz = zip(x, y, z) print(xyz) # 输出:<zip object at 0x005C14B8> print(list(xyz)) # 输出:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
浙公网安备 33010602011771号