深入了解Python中reduce函数的高级用法

先来看看一道面试题目:

写一个函数找出一个整数数组中,第二大的数
num_list = [1, 2, 4, 33, 6, 22, 9, 13]

答案:

答案很多种,这里列举使用lambda函数配合reduce函数综合使用:

from functools import reduce
num_list = [1, 2, 4, 33, 6, 22, 9, 13]
num = reduce(lambda ot, x: ot[1] < x and (ot[1], x) or ot[0] < x and (x, ot[1]) or ot, num_list, (0, 0))[0]
print("Second_large_num is :", num)
"""
结果:
Second_large_num is : 22
"""
解析:

  这里的形参ot是一个二元组,ot[1]表示列表中最大的数,ot[0]表示列表中次最大的数。
 
整个流程:

  1. 默认给ot初始值(0,0)
  2. x取列表num_list中的第一个值num_list[0]
  3. 如果x > ot[1], 就返回元组(ot[1], x), 并且结束迭代,然后进行下一次迭代;否则如果x>ot[0],则返回元组(x, ot[1]), 并且结束迭代, 然后进行下一次迭代;如果x < ot[0] 就是x比次最大数都小,就返回ot, 不做任何替换。
  4. 进行下一次迭代,x取num_list列表的下一个元素,然后依次开始执行第二步操作,知道列表元素全部执行完。

 

科普:

  可能有些人不知道默认给ot初始值(0,0)是什么意思,这里就科普一下reduce的用法
 
reduce用法:reduce(function, sequence, initial)

参数性质
function有俩个参数的函数,必须有俩个参数
sequencetuple, list, dictionary, string等可迭代物,必须参数
initial初始值,可选参数,注意点: 只能给function第一个参数设置初始值,不能给第二个参数设置初始值

reduce的工作流程是:
1. 有initial参数的情况: 先将initial初始值赋值给第一个参数,然后在从迭代对象中取第二个元素,俩个传递给函数进行加工,得到的结果赋值第一个参数,然后继续从迭代对象中取下一个元素给第二个参数,俩个参数传递给函数加工后的值赋值给第一个参数,以此循环下次,最后返回第一个参数的值。
2. 没有initial参数的情况: 开始从迭代对象中获取俩个元素,分别赋值给第一、第二个参数,然后传递给函数加工后结果赋值给第一个参数,再从迭代对象中继续获取下一个元素给第二个参数,继续跟第一个参数进行函数加工后结果赋值给第一个参数,依次循环下去,直到最后迭代对象next()返回None,返回第一个参数作为结果。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值