MENU

从OJ题目学习python技巧系列(1):reduce

December 5, 2018 • 编程开发

写在前面

1. 为什么会有这个系列

在日常工作写代码的时候,现目前笼统的划分为两个大的层面,一个是高层面的设计,比如技术选型、架构设计、设计模式、OOP等等,

另一个是底层针对设计的具体实现,比如一个具体的数据结构的实现、或简单或复杂的算法、甚至是一个函数、循环的实现。很多时候其实就是很小的点。

在我看来,高层的设计和底层的实现是相辅相成的,高层的设计保证了一个项目能走多远,而底层的实现保证了项目走的多高效和稳健,再庞大的项目也是由底层每一行代码、每一个函数(方法)来实现的。其是在其他的工业设计中也是同样的道理,人类社会也是一样的法则。扯远了。

所以为了锻炼我自己在实现这些很小的点时,能够处理的灵活、优雅,我最近开始争取每天都做一道OJ的题目,并且学习他人的解决办法,看看面对一个小问题别人是怎么实现的,别人实现的方式比我好在哪里。

其实在OJ上做练习是在大一时打ACM比赛留下的习惯,可能有的人对OJ抱怀疑或者不屑一顾的态度,但是从我个人的角度来说还是比较认可的,只不过可能完整练习
一个题目的耗时比较久。

虽然如此,仍然是把每天一道题的要求给自己安排上了,如果坚持一段时间,我想还是能有收获的。

2. 这个系列是干什么的

那么在做OJ的题目时,即使全部AC(ACM黑话,意思是测试点全部通过)了,但每个人的解法仍然不同,所以就可以从别人的解法中学的很多的东西,不同的知识点、不同的思维方式。

这个系列就是我在做题过程中学习他人解法和知识点的一个记录。

另外现目前我主要实在codewars上进行练习,主要使用的语言是python2(有的ACMer估计要鄙视我),因为这个OJ平台支持的编程语言比较多,同时在一个题目完成之后,你可以看到所有人针对这个题目的解法,同时每个人还可以对他人的解法进行打分,这样每次都可以和自己的解法对比学到很多。

下图就是一个题目完成后的界面,可以看到他人的解法:

codewars-answers.png

这个平台也会给出所有的测试样例,以及没用通过具体哪个样例的提示,打过ACM的同学就知道这个有多贴心了。 不过这个平台唯一感觉美中不足的是测试样例的覆盖面并不是很广,check也并不如ACM那么严格。后面可以能会并不只是在codewars上进行练习,等水平提升一点后会去尝试到leetcode等平台上练习。

每天更新的题目我也会同步到这里:Algorithmic-practice

reduce()

描述

reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:

用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

语法

reduce(function, iterable[, initializer])

参数

  • function -- 函数,有两个参数
  • iterable -- 可迭代对象
  • initializer -- 可选,初始参数

返回值:
返回函数计算结果。

实例

>>>def add(x, y) :            # 两数相加
...     return x + y
... 
>>> reduce(add, [1,2,3,4,5])   # 计算列表和:1+2+3+4+5
15
>>> reduce(lambda x, y: x+y, [1,2,3,4,5])  # 使用 lambda 匿名函数
15

实际题目/场景

codewars题目:persistent-bugger

这个题目中有一个典型对的场景,计算一个列表list中的所有数字的乘积,那么就可以直接使用reduce:

reduce(lambda x,y : x*y, [1, 2, 3])

另外也可以不用lambda,

s = '999'
from operator import mul
reduce(mul,[int(i) for i in str(s)],1)
Out[29]: 729
Tags: python
Archives QR Code
QR Code for this page
Tipping QR Code