python进阶之高阶函数

1.高阶函数

1.1 定义
  变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
示例1:
def add(x,y):
    return x + y
def sub(x,y):
    return x - y
    
def orign(x, y, fun):
    return fun(x, y)
# 函数origin接受三个参数:x,y,function,这里尤其注意传入的function函数为函数名,非函数名+(),如果这样用的话意义是函数的调用。
示例2:
1.从一个大列表找出最大长度的子序列:bigList = [["hello", "world"], ["python", "Java", "C++"], ["Dmall"]],注:sorted典型的高阶函数

1.2 匿名函数

匿名函数不需要显示地定义函数名,使用【lambda 参数 : 表达式】的方式,即:
lambda [arg1 [,arg2, ... argN]] : expression
特点:
  • 不用取名称,匿名函数节省了用def声明函数的步骤。
  • 但lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,优点是调用小函数时不占用栈内存从而增加运行效率。
示例:
sumByLam = lambda arg1, arg2: arg1 + arg2
print(sumByLam (1.2, 3))

应用实例

# 商品排序:一行代码取出价格最贵的商品/按照商品价格排序:字典排序 wareInfos = {'伊利牛奶': [1, 12, 102456, 2.28], '三元牛奶': [1, 12, 103567, 2.50], '蒙牛牛奶': [1, 12, 109876, 2.12]}

print(dict(sorted(wareInfos.items(), key=lambda ware: ware[1][-1])))

注:字典无序,但可转换成列表形式排序

1.3 map函数

定义:函数接收两个参数,一个是函数,一个是序列(可迭代对象),将 一个函数映射序列的每一个元素上,生成新序列,包含所有函数返回值(其返回值为一个迭代器对象)。
  • 语法:map(function, iterable, ...)
  • 参数:function -- 函数,iterable -- 一个或多个序列
  • 返回值:Python 2.x 返回列表。Python 3.x 返回迭代器。
注:map函数返回的迭代器只能迭代一次,迭代之后会自动清空
例:把用户输入的英文名规范化,['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart'],可考虑多种实现方法。
#方法一:常规循环
names = ['adam', 'LISA', 'barT']
new_name = []
for name in names:
    new_name.append(name.capitalize())
print(new_name)
# 方法二:使用列表推导式
new_name2 = [name.capitalize() for name in names]
print(new_name2)
# 方法三:使用map函数
new_name3 = list(map(lambda name: name.capitalize(), names))
for循环、列表推导式与map函数的执行效率
  一般来说如果不是特别复杂,for循环、列表推导式与map函数的执行效率是差不多的;数据量大的情况下,列表推导式与map要优于常规for循环
def timer(func, *args, **kargs):
    start_time = time.time()
    res = func(*args, **kargs)
    total_time = (time.time() - start_time)*1000
    return "函数{}执行时间为{}, 执行结果为{}".format(func.__name__, total_time, res)

def forloop(times):
    res = []
    for x in range(times):
        res.append(x*x)
    return res

def listComp(times):
    return [i*i for i in range(times)]

def mapCall(times):
    return map(lambda x: x*x, range(times))

1.4 reduce函数

定义:function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。reduce函数会对参数序列中元素进行累积。
  • 语法:reduce(function, iterable[, initializer])
  • 参数:function -- 函数,有两个参数。iterable -- 可迭代对象。initializer -- 可选,初始参数
与map区别:map是并行操作, reduce函数是通过传入函数把多个参数合并的操作
例:100以内的累加、累乘
print(reduce(lambda x, y: x+y, range(1, 100), 10)) # 等同于sum(range(1, 100)
print(reduce(lambda x, y: x*y, range(1, 100)))

1.5 filter函数

filter():“筛选”函数,接收一个布尔值返回值的函数和一个序列,把传入的函数依次作用于每个元素,根据返回值是True还是False决定保留还是丢弃该元素。
  • 语法:filter(function, iterable)
  • 参数:function---- 判断函数,iterable -- 可迭代对象。
例:取出100以内的奇数
#方法一,利用filter:
print(list(filter(lambda x: x % 2, range(100))))
#方法二,列表推导式
print([i for i in range(100) if i % 2])
实例应用
stores = [[1, '北京XX', 6, '古城店', '116.186187', '39.91105', '3d91fed35501edf0c7bc8c16bee34ac8@MS02LTE', '90207c4a9bd6a66fe046aa19f17e33df@MTk3LTE3MzAw', '1'],
          [1, '北京XX', 10, '新风店', '116.376568', '39.962721', '1078230f4621d495f1fe62de206480f2@MS0xMC0x', 'f6c82428f4a41854d0be0fc1d5d362ad@NzAyLTU3Njky', '2'],
          [1, '北京XX', 14, '云岗店', '116.163931', '39.810204', '848cc6f9daa7bbc555c00671c93a8f6c@MS0xNC0x', '71e41edb20992dc490f3b1928d1b2fb8@OTMyLTY3NjYy', '2'],]
# 获取业态为O2O的门店
#方法一:使用filter
print(list(filter(lambda store: store[-1] == "1", stores)))
# 方法二:使用列表推导式
print([store for store in stores if store[-1] == "1"])

小结:map、filter 和 reduce 这三种技术可以提供描述迭代原因的函数替代方案,以便避免过多的 for 循环。

posted @ 2021-04-12 22:01  不吃鱼的猫大  阅读(158)  评论(0编辑  收藏  举报