python3高阶函数,学习一波;引用自:https://www.cnblogs.com/littlefivebolg/articles/9094942.html
python高阶函数学习
1、map()函数
demo_list = [1, 2, 3, 4, 5]
def deal_func(x):
return x ** 2
# map函数模拟:map_test()函数作用等同于map()
def map_test(func, iter_obj):
num_1 = []
for i in iter_obj:
ret = func(i)
num_1.append(ret)
return num_1.__iter__() # 用__iter__()方法,将列表转为迭代器对象
# map_test函数
print(list(map_test(deal_func, demo_list)))
# map函数
print(list(map(deal_func, demo_list)))
# map函数的参数1也可以是匿名函数、参数2也可以是字符串
print(list(map_test(lambda x: x.upper(), "stronger")))
print(list(map(lambda x: x.upper(), "stronger")))
# 输出结果:
"""
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
['S', 'T', 'R', 'O', 'N', 'G', 'E', 'R']
['S', 'T', 'R', 'O', 'N', 'G', 'E', 'R']
"""
2、filter()函数
filter函数也是接收一个函数和一个序列的高阶函数,其主要功能是过滤。其返回值也是迭代器对象
names = ["Alex", "amanda", "tom", "Gina"]
# filter函数机制
def filter_test(func, iter_obj):
names_1 = []
for i in iter_obj:
if func(i): # 传入的func函数其结果必须为bool值,才有意义
names_1.append(i)
return names_1
# filter_test函数
print(filter_test(lambda x: x.islower(), names))
# filter函数
print(list(filter(lambda x: x.islower(), names)))
# 输出结果:输出全部为小写字母的人名
"""
['amanda', 'tom']
['amanda', 'tom']
"""
3、reduce()函数
reduce函数也是一个参数为函数,一个为可迭代对象的高阶函数,其返回值为一个值而不是迭代器对象,故其常用与叠加、叠乘等
# reduce函数不是内置函数,而是在模块functools中的函数,故需要导入
from functools import reduce
nums = [1, 2, 3, 4, 5]
# reduce函数的机制
def reduce_test(func, array, ini=None): # ini作为基数,在ini的基础上,再累加或累乘数组nums的内容
if ini == None:
ret = array.pop(0)
else:
ret = ini
for i in array:
ret = func(ret, i)
return ret
# reduce_test函数,叠加
print(reduce_test(lambda x, y: x + y, nums, 100))
# reduce函数,叠乘
print(reduce(lambda x, y: x * y, nums, 100))
# 输出结果:
"""
115
12000
"""
4、sort()和sorted()函数
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
用法:
sorted(iterable, key=None, reverse=False)
iterable – 可迭代对象。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
4.1、list类型的排序操作
代码示例:
# -*- coding=utf-8 -*-
def sort_list():
"""
关于list类型的排序操作
"""
# 数值类型
test_list = [1, 2, 19, 30]
print(sorted(test_list))
print(sorted(test_list, reverse=True))
# 字符串类型,排序规则:ASCII顺序排序
test_list = ["a", "boy", "named", "marvin"]
print(sorted(test_list)) # 默认升序
print(sorted(test_list, reverse=True)) # 降序
# # tuple类型
test_list = [("Up", 6), ("Down", 3), ("Left", 1), ("Right", 2)]
# 默认使用tuple的index=0处值比较,即"Up","Down"等比较
print(sorted(test_list))
# 指定按元组的下下标index=1的值进行排序
print(sorted(test_list, key=lambda item: item[1]))
# 输出:
"""
[('Down', 3), ('Left', 1), ('Right', 2), ('Up', 6)]
[('Left', 1), ('Right', 2), ('Down', 3), ('Up', 6)]
"""
# tuple的index=1处值比较,itemgetter获取元素1号位置
from operator import itemgetter
print(sorted(test_list, key=itemgetter(1)))
# 输出:
"""
[('Left', 1), ('Right', 2), ('Down', 3), ('Up', 6)]
"""
if __name__ == '__main__':
sort_list()
4.2、dict类型的排序
def sort_map():
"""
map类型的排序操作
"""
# # 数值类型:返回一个列表
test_map = {3: "a", 2: "boy", 4: "named", 1: "marvin"}
print(sorted(test_map)) # 根据字典的key排序
print(sorted(test_map.values())) # 根据字典的value进行排序(依据:ASCII码表顺序)
# # output:
# """
# [1, 2, 3, 4]
# ['a', 'boy', 'marvin', 'named']
# """
# 根据value排序
print(sorted(test_map.items(), key=lambda item: item[1]))
# output:
# [(3, 'a'), (2, 'boy'), (1, 'marvin'), (4, 'named')]
# 根据key排序
print(sorted(test_map.items(), key=lambda item: item[0], reverse=True))
# output:
# [(4, 'named'), (3, 'a'), (2, 'boy'), (1, 'marvin')]
# tuple类型
test_map = {1: ("Up", 0), 2: ("Down", 1), 3: ("Left", 2), 4: ("Right", 3)}
print(sorted(test_map.items(), key=lambda item: item[1][0]))
# output:
# [(2, ('Down', 1)), (3, ('Left', 2)), (4, ('Right', 3)), (1, ('Up', 0))]
if __name__ == '__main__':
sort_map()
4.3、object组成的list排序
# -*- coding=utf-8 -*-
class User(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return repr((self.name, self.age))
def sort_list_obj():
"""
object组成的list排序
"""
# 根据User的属性的值排序(字符串的话按ASCII排序)
# attrgetter获取元素的属性值
test_list = [User("James", 30), User("Marvin", 28), User("Parke", 40), User("Li", 40)]
# print(sorted(test_list, key=lambda user: user.name))
from operator import attrgetter
# print(sorted(test_list, key=attrgetter("age")))
# # 先根据age排序,如果age相等,再根据name排序
print(sorted(test_list, key=attrgetter("age", "name")))
if __name__ == "__main__":
sort_list_obj()