如何写出优雅的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函数解析。
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函数解析。
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())以上的所有函数都是自己写的,希望大家能够认真体味。