最近看知乎某答主提到“自顶向下,逐步求精”的思想,很受启发,在这里写下自己的理解和感悟吧。
什么是“自顶向下,逐步求精”?
自顶向下
把问题分解成一套子问题,然后把子问题分解成更小的问题。这一过程将一直持续到每个子问题足够基础,不再需要进一步分解为止。
逐步求精
将现实问题经过几次抽象(细化)处理,最后到求解域中只是一些简单的算法描述和算法实现问题。即将系统功能按层次进行分解,每一层不断将功能细化,到最后一层都是功能单一、简单易实现的模块。求解过程可以划分为若干个阶段,在不同阶段采用不同的工具来描述问题。在每个阶段有不同的规则和标准,产生出不同阶段的文档资料。
举例说明“自顶向下,逐步求精”的应用
比如现在我们要编写一个爬虫脚本去爬取某个网页进行数据的收集和获取。主要有以下步骤:
- 获得网页
- 解析网页
- 获取想要的数据
- 输出想要的结果
具体到脚本上面,我们可以把这个脚本分为四部分,分四个模块去定义四个函数:
def get_page(): # 获得网页
pass
def parse_html(): # 解析网页
pass
def get_info(): # 得到需要的信息
pass
def write_res(): # 输出结果
pass
def main(): # 定义主函数
get_page()
parse_html()
get_info()
write_res()
if __name__ == '__main__':
main()
也就是说,将问题分解成不同的模块,分别要代表所要解决这个问题需要的步骤,当这些模块和很熟都定义好了之后,接下来我们再把精力放到一个一个的模块上面,同时和这个模块无关的部分,我们先不去考虑。
比如,我们要写get_page()这个函数的部分,我们就思考如何达到或者网页的效果,这时候我们采用requests库来解决获取网页的问题。
import requests
def get_page(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return '爬取失败'
解决完获取网页的问题后,我们再去集中精力解决下一个获取网页的问题,就这样,每次都把精力专注于一件事情上面。我们同一个时间,只去思考同一个思维层次上面的问题,解决完这一层问题之后,再去思考下一层的问题该如何解决,这样就在一定程度上解决了由于我们跨层次思考所带来的各种各样的bug。 我觉得这是对编程新手来说很有用的一个思维方式,希望能对自己以及大家有所启发。