Python递归和推导


纸上得来终觉浅,绝知此事要躬行。

Python递归和推导


递归的概念很简单,如果函数包含了对其自身的调用,该函数就是递归的。拗口一点的定义是,如果一个新的调用能在相同过程中较早的调用结束之前开始,那么个该过程就是递归。

1. 条件运算符

  • 三目运算符
# 表达格式
<表达式1> ? <表达式2> : <表达式3>
# 实例说明
In [1]: a = 1

In [2]: b = 2

In [3]: max = (a > b) ? a : b
  • if 和 else
# 表达格式
value_when_true if condition else value_when_false
# 实例说明
In [4]: 'True' if True else 'False'
Out[4]: 'True'

In [5]: 'True' if False else 'False'
Out[5]: 'False'
  • 老式写法:不推荐使用
# 表达格式
[value_when_false, value_when_true](bool(condition))
# 实例说明
In [6]: ['False', 'True'][True]
Out[6]: 'True'

In [7]: ['False', 'True'][False]
Out[7]: 'False'
  • and 和 or
# 表达格式
condition and value_when_true or value_when_false
# 同为真返回最后一个真值,有假返回假值
In [11]: 'a' and 'b'
Out[11]: 'b'

In [12]: 'a' and False
Out[12]: False

In [13]: False and 'b'
Out[13]: False

In [14]: 'a' and False and 'b'
Out[14]: False

In [15]: 'a' and True and 'b'
Out[15]: 'b'
# 返回第一个真值
In [16]: 'a' or 'b'
Out[16]: 'a'

In [17]: 'a' or False
Out[17]: 'a'

In [18]: False or 'b'
Out[18]: 'b'

In [19]: 'a' or False or 'b'
Out[19]: 'a'

In [20]: 'a' or True or 'b'
Out[20]: 'a'

2. 递归运算

  • 递归的定义
    • 在每一次调用自己时,在某种意义上应该更接近于解
    • 必定存在可使递归调用终止的条件, 否则导致出现无限递归
In [1]: def fac(n):
   ...:     if n == 1:
   ...:         return 1
   ...:     else:
   ...:         return n * fac(n-1)
   ...:

In [2]: def fac(n):
   ...:     return 1 if n == 1 else n * fac(n-1)
   ...:
  • 递归的次数
    • 在计算机中,函数调用时通过的这种数据结构实现的,每当进入一个函数调用,就会加一层栈帧,每当函数返回,这个就会减一层栈帧。由于栈的大小不是无限的,所以递归调用是有限制的。
    • Python2中递归的次数为1000,而在Python3中递归的次数为3000次,这个数值可以通过修改getrecursionlimit的数值来自由调控。
In [3]: import sys

In [4]: sys.getrecursionlimit()
Out[4]: 3000

In [5]: sys.getrecursionlimit(1000)

3. 解析和推导

解析式也成推导式,包含列表解析、集合解析和字典解析。

  • 列表解析
In [1]: [i * i for i in [1, 2, 3, 4]]
Out[1]: [1, 4, 9, 16]

In [2]: [i * i for i in [1, 2, 3, 4] if i % 2]
Out[2]: [1, 9]

In [3]: [i * i for i in range(10) if i % 2 and i % 3]
Out[3]: [1, 25, 49]
  • 集合解析
In [4]: {i * i for i in [1, 2, 3, 4, 1]}
Out[4]: {1, 4, 9, 16}
  • 字典解析
In [5]: {k: v * v for k, v in [('a', 1), ('b', 2)]}
Out[5]: {'a': 1, 'b': 4}

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录