Python 实现递归

Python012

Python 实现递归,第1张

一、使用递归的背景

先来看一个☝️接口结构:

这个孩子,他是一个列表,下面有6个元素

展开children下第一个元素[0]看看:

发现[0]除了包含一些字段信息,还包含了 children 这个字段(喜当爹),同时这个children下包含了2个元素:

展开他的第一个元素,不出所料,也含有children字段(人均有娃)

可以理解为children是个对象,他包含了一些属性,特别的是其中有一个属性与父级children是一模一样的,他包含父级children所有的属性。

比如每个children都包含了一个name字段,我们要拿到所有children里name字段的值,这时候就要用到递归啦~

二、find_children.py

拆分理解:

1.首先import requests库,用它请求并获取接口返回的数据

2.若children以上还有很多层级,可以缩小数据范围,定位到children的上一层级

3.来看看定义的函数

我们的函数调用:find_children(node_f, 'children')

其中,node_f:json字段

    children:递归对象

 以下这段是实现递归的核心:

   if items['children']:

 items['children']不为None,表示该元素下的children字段还有子类数据值,此时满足if条件,可理解为 if 1。

 items['children']为None,表示该元素下children值为None,没有后续可递归值,此时不满足if条件,可理解为 if 0,不会再执行if下的语句(不会再递归)。

至此,每一层级中children的name以及下一层级children的name就都取出来了

希望到这里能帮助大家理解递归的思路,以后根据这个模板直接套用就行

(晚安啦~)

源码参考: https://www.coder4.com/archives/5767

本节对一些 Python 易混淆的操作进行对比。

1.1 有放回随机采样和无放回随机采样

1.2 lambda 函数的参数

1.3 copy 和 deepcopy

复制和变量别名结合在一起时,容易混淆:

对别名的修改会影响原变量,(浅)复制中的元素是原列表中元素的别名,而深层复制是递归地进行复制,对深层复制的修改不影响原变量。

1.4 == 和 is

1.5 判断类型

1.6 字符串搜索

1.7 List 后向索引

这个只是习惯问题,前向索引时下标从0开始,如果反向索引也想从0开始可以使用~。

2.1 读写 CSV 文件

注意,当 CSV 文件过大时会报错:_csv.Error: field larger than field limit (131072),通过修改上限解决

csv 还可以读以 分割的数据

2.2 迭代器工具

itertools 重新定义了很多迭代器工具,例如子序列工具:

序列排序:

多个序列合并:

2.3 计数器

计数器可以统计一个可迭代对象中每个元素出现的次数。

2.4 带默认值的 Dict

当访问不存在的 Key 时,defaultdict 会将其设置为某个默认值。

2.5 有序 Dict

3.1 输出错误和警告信息

向标准错误输出信息

输出警告信息

控制警告消息的输出

3.2 代码中测试

有时为了调试,我们想在代码中加一些代码,通常是一些 print 语句,可以写为:

一旦调试结束,通过在命令行执行 -O 选项,会忽略这部分代码:

3.3 代码风格检查

使用 pylint 可以进行不少的代码风格和语法检查,能在运行之前发现一些错误

3.4 代码耗时

耗时测试

测试某代码块耗时

代码耗时优化的一些原则

4.1 argmin 和 argmax

argmax同理。

4.2 转置二维列表

4.3 一维列表展开为二维列表

  递归算法常用来解决结构相似的问题。

  所谓结构相似,是指构成原问题的子问题与原问题在结构上相似,可以用类似的方法解决。具体地,整个问题的解决,可以分为两部分:第一部分是一些特殊情况,有直接的解法;第二部分与原问题相似,但比原问题的规模小,并且依赖第一部分的结果。

  本质上,递归是把一个不能或不好解决的大问题转化成一个或几个小问题,再把这些小问题进一步分解成更小的问题,直至每个小问题都可以直接解决。

  实际上,递归会将前面所有调用的函数暂时挂起,直到递归终止条件给出明确的结果后,才会将所有挂起的内容进行反向计算。其实,递归也可以看作是一种反向计算的过程,前面调用递归的过程只是将表达式罗列出来,待终止条件出现后,才依次从后向前倒序计算前面挂起的内容,最后将所有的结果一起返回。