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)]

 

posted @ 2017-06-11 16:30  seaidler  阅读(121)  评论(0)    收藏  举报