内置高阶函数介绍:map/reduce/filter/sorted

map   : 将一个函数作用于一个Iterable上,返回一个Iterator
reduce: 将一个函数作用于一个序列上的每个元素,reduce将把结果继续和序列的下一个元素做累积计算
filter: 将一个函数作用于一个序列上的每个元素,filter根据返回值是Ture/False决定保存还是抛弃此元素
sorted: 将一个函数作用于一个序列上。可对数值进行排序,对于非数值,可自定义函数进行排序.

1. map
内部函数定义为:map(func, iter1), 即它有两个参数,第一个为函数,第二个为一个iter.

def func(x):
    return x+x


L1 = [1, 2, 3, 4, 5, 6]
r = map(func, L1)
print(r)
print(list(r))    
>>
<map object at 0x0000018305A566D8>
[2, 4, 6, 8, 10, 12]


由上可以看出, map的第一个参数为func, 返回的结果r为一个Iterator, 要显示的话,必须通过list()函数将Iterator计算并返回一个list
上例是一个很简单的应用,当然直接写一个函数也可以实现这样的功能,不过这样更直观,也更符合我们的理解逻辑.

2. reduce
内部函数定义为:map(function, requence), 即它有两个参数,第一个为函数,第二个为一个序列.

from functools import reduce
def func(x, y):
    return x + y

    
L1 = [1, 2, 3, 4, 5, 6]
r = reduce(func, L1)
print(r)
>>
21

这个例子相当就是将序列中的所有数值进行了一个累加,用sum也可以实例,但只是举个例子而已。
我们可以将变个形,如将数字字符串'12345'变成数值。

def str2int(s):
    return int(s)

    
def func(x, y):
    return x*10 + y
    
    
r = list(map(str2int, '12345'))
print(r)
rr = reduce(func, r)
print(rr)     
>>
[1, 2, 3, 4, 5]
12345

这就是一个很好的应用

3. filter
内部函数定义为:filter(function, Iterable),即两个参数,第一个为函数,第二个为一个可迭代的对象.
eg: 列出C盘根目录下所有的文件名(文件夹不显示)

import os

path = 'c:\\'

def isfile(filename):
    filepath = path + filename
    if os.path.isfile(filepath) == True:
        return True
    else:
        return False


filelist = list(filter(isfile, os.listdir(path)))
print(filelist)
>>
['aow_drv.log', 'bootmgr', 'BOOTNXT', 'BOOTSECT.BAK', 'chromedriver.exe', 'hiberfil.sys', 'install.log', 'LibAntiPrtSc_ERROR.log', 'LibAntiPrtSc_INFORMATION.log', 'OnKeyDetector.log', 'pagefile.sys', 'swapfile.sys']

说明:isfile用于判断当前文件是否为一个文件,是就返回True, 否就返回False,  os.listdir(path)返回指定目录下的所有文件和文件夹

4. sorted
内部函数定义为:sorted(iterable, key, reverse)
有三个参数, iterable为可迭代对象, key是排序的函数, reverse为是否要反向排序结果,为布尔值
先举例

L1 = [32, 4, 234, 7, 43, 7453]
L1 = [32, 4, 234, 7, 43, 7453]
print(sorted(L1))
print(sorted(L1, reverse = False))
print(sorted(L1, reverse = True))
>>
[4, 7, 32, 43, 234, 7453]
[4, 7, 32, 43, 234, 7453]
[7453, 234, 43, 32, 7, 4]

由此可看,reverse默认为False, reverse为是否要反向排序结果,为布尔值如果是字符串怎么排序?default是按照ASCII进行的排序的.
eg:将C盘根目录下所有的文件名进行排序

import os

path = 'c:\\'

def isfile(filename):
    filepath = path + filename
    if os.path.isfile(filepath) == True:
        return True
    else:
        return False


filelist = list(filter(isfile, os.listdir(path)))
print(filelist)
req = sorted(filelist)
print(req)
>>
['aow_drv.log', 'bootmgr', 'BOOTNXT', 'BOOTSECT.BAK', 'chromedriver.exe', 'hiberfil.sys', 'install.log', 'LibAntiPrtSc_ERROR.log', 'LibAntiPrtSc_INFORMATION.log', 'OnKeyDetector.log', 'pagefile.sys', 'swapfile.sys']
['BOOTNXT', 'BOOTSECT.BAK', 'LibAntiPrtSc_ERROR.log', 'LibAntiPrtSc_INFORMATION.log', 'OnKeyDetector.log', 'aow_drv.log', 'bootmgr', 'chromedriver.exe', 'hiberfil.sys', 'install.log', 'pagefile.sys', 'swapfile.sys']

第一个[]为找到C盘根目录下的所有文件
第二个[]为对其进行ACSII排序后的结果.

猜你喜欢

转载自blog.csdn.net/lxy210781/article/details/81147785