reduce,map,filter,lambda等python内置函数解析

如何写出优雅的python脚本程序。作为一款最接近机器学习,深度学习的脚本语言,python有着其独特的编程风格,高效的编程方式。请看下面的代码。

    1、输入一个列表,将列表中的所有非数字的字符去掉,并且将数字字符进行排序。

class Solution:
    def __init__(self):
        pass

    @staticmethod
    def get_data():
        str_data = str(input()).strip()
        return str_data

    @staticmethod
    def sort_dig_data(str_data):
        dig_data = [int(cur_data) for cur_data in str_data if cur_data.isdigit()]
        dig_data.sort(key=None, reverse=False)
        return dig_data
if __name__ == '__main__':
    print(Solution.sort_dig_data(Solution.get_data()))
 
 
vdfnbij45769568jhotyj
[4, 5, 5, 6, 6, 7, 8, 9]

    也许,这样就达到了排序的目的。首先去掉了非数字字符,并且将数字字符转化成数字,然后按照升序排列。但是,我们能否有更好的方式,写出更优雅的表达式?

    将sort_dig_data函数修改为:_sort_did_data,代码如下:

@staticmethod
def _sort_dig_data(str_data):
    dig_data = list(map(int, filter(lambda cur_data: cur_data.isdigit(), str_data)))
    dig_data.sort(key=None, reverse=False)
    return list(dig_data)
vdfnbij45769568jhotyj
[4, 5, 5, 6, 6, 7, 8, 9]

    1.1函数解析。

        filter函数。filter,顾名思义,就是过滤,啥为过滤,想必大家应该都很清楚。要达到过滤的效果至少组要两个方面的内容: 过滤规则,待过滤的内容(可以是字符串,列表,元组等数据组织形式),不能再比这还少了吧。我们举个例子:
还是过滤掉一个字符串中的非数字字符,代码如下:
def filter_no_dig(data):
    dig_data = filter(lambda cur_str_char: cur_str_char.isdigit(), data)
    return list(dig_data)

if __name__ == '__main__':
    print(filter_no_dig('fwijbnb9527bonb4945uy'))
结果:['9', '5', '2', '7', '4', '9', '4', '5']

        也许有像我这样的初学者会问:匿名函数 lambda 后面的cur_str_char参数的值是怎么被赋值的? 当然后面会讲到lambda。其实data是个字符串,是一个可以被迭代的对象,也就是可以被循环取值。所有每次顺序的从data里面拿到一个数,单后将这个数赋值给cur_str_char参数,然后根据判断条件isdigit()的真假来决定是否将不符合条件的值给去掉,上面的那个程序与下面的程序是等价的。

def _filter_no_dig(data):
    # dig_data = filter(lambda cur_str_char: cur_str_char.isdigit(), data)
    dig_data = [int(cur_data) for cur_data in data if cur_data.isdigit()]
    return list(dig_data)

           当然上面的那个filter函数的过滤规则我使用的是匿名函数lambda。其实filter_no_dig函数与下面的函数也是等价的

def filter_rule(chr_char):
    if chr_char.isdigit():
        return True
    else:
        return False


def filter_no_dig(data):
    dig_data = filter(filter_rule, data)
    return list(dig_data)

        map函数。map函数就是一个映射函数,映“射”大家都知道吧,不过这里是一一映“”。就是对待映射的对象(包括列表等)按照某个规则进行映“”。所以按照我们的理解,要完成这个任务,我们的map函数至少需要如下基本信息:映“”规则,待射对象。这里还是给出一个函数。

def map_data(data):
    return list(map(lambda cur_data: int(cur_data)**2, data))

if __name__ == '__main__':
    print(map_data('95274945'))
运行结果:[81, 25, 4, 49, 16, 81, 16, 25]

        这里的映“”规则我还是使用匿名函数,当然这个函数与下面的函数是等价的。

def map_relu(cur_data):
    if isinstance(cur_data, int):
        return cur_data**2
    elif cur_data.isdigit():
        return int(cur_data)**2
    else:
        assert 'data type error......'


def map_data(data):
    return list(map(map_relu, data))

if __name__ == '__main__':
    print(map_data('95274945'))

       大家有没有发现几个等价的函数全部都是把使用lambda定义的匿名函数使用传统的def函数定义方式进行显式的表示?希望大家能够认真的体味。 

        lambda函数。前面已经使用过lambda函数,这里我就不再写函数验证了。首先,lambda是一个表达式,而不是一个函数。至于lambda的定义网上有很多,这里我不再赘述,因为这篇博客,我打的是原创的标签,拷贝别淫的陈述似乎不大好。

        lambda函数接收多个参数,并且会使用这些参数值进行若干运算,并且返回运算结果。

        下面还是实现一个很经典的排序问题。对一个字典,按照value值对其进行排序。

        一、不使用lambda函数。

def sort_dict():
    data = dict()
    list_data = [(9, 'line'), (5, 'five'), (2, 'two'), (7, 'seven')]
    for cur_data in list_data:
        data.update({cur_data[0]: cur_data[1]})
    return sorted(list(zip(data.values(), data.keys())))

if __name__ == '__main__':
    print(sort_dict())

思路很简单,就是先将dict的值和key都拿出来组建成一个元组然后将元组作为列表的基本单元,构建一个列表。然后对列表进行排序,由于列表中的每个元素都是一个元组,即二元组,所以sorted排序的时候默认使用第一个值进行排序。所以会有上面的效果。

        二、使用lambda函数。

def sort_dict():
    data = dict()
    list_data = [(9, 'line'), (5, 'five'), (2, 'two'), (7, 'seven')]
    for cur_data in list_data:
        data.update({cur_data[0]: cur_data[1]})
    # return sorted(list(zip(data.values(), data.keys())))
    return sorted(data.items(), key=lambda lambda_data: lambda_data[1])

if __name__ == '__main__':
    print(sort_dict())

    2 reduce函数解析。

    reduce函数实现的功能很简单,实现的是列表的累积求和。还是给出一个函数:
from functools import reduce

def reduce_fu():
    data = [9, 5, 2, 7]
    return reduce(lambda cur_data, cur_data1: cur_data+cur_data1, data)

if __name__ == '__main__':
    print(reduce_fu())
23

        这个函数等价于:

from functools import reduce


def sum_relu(cur_data, cur_data1):
    assert isinstance(cur_data, int) and isinstance(cur_data1, int), 'data type error......'
    return sum([cur_data, cur_data1])

def reduce_fu():
    data = [9, 5, 2, 7]
    return reduce(sum_relu, data)

if __name__ == '__main__':
    print(reduce_fu())
        以上的所有函数都是自己写的,希望大家能够认真体味。

猜你喜欢

转载自blog.csdn.net/weixin_38358654/article/details/80149422