python基础贴士(二)

函数的递归调用

1.收敛条件 - 让递归在有限次数内完成或者进行回溯
python默认的最大递归深度是998,如果递归无法在限定次数内收敛,就有可能导致RecursionError。
2.递归公式
举个栗子:有十级台阶,一次走1到3步,有多少种走法?

def walk(n):
    # 收敛条件
    if n < 0:
        return 0
    elif n == 0:
        return 1
    # 递归公式
    return walk(n - 1) + walk(n - 2) + walk(n - 3)

LEGB规则

Python搜索一个变量的方式是从局部作用域到嵌套作用域再到全局作用域再到内建模块
Local - Enclosed - Global - Built-in
如果想改变搜索范围,可以使用global和nonlocal关键字

a = 100
def foo():
    #  local variable
    #  函数内的局部变量 离开foo函数变量a是无法访问的
    a = 200
    b = 'hello'


    def bar():
        global a
        nonlocal b
        b = 'good'
        print(a)
        print(b)
    bar()
    print(b)


if __name__ == '__main__':
    foo()

上面代码输出结果为:
100
good
good
在这里,如果函数bar()里没有global a, nonlocal b这两行代码,将输出:
200
good
hello
其中a的值(200)来自上一级的a = 200(Enclosed),b的值(hello)是来自foo()的local variable。
加上global a, nonlocal b,a的值取到了全局变量a = 100,b的值(第二个good)则来自嵌套作用(Enclosed)域的b = ‘good’

用列表的生成表达式语法创建列表

时间和空间是不可调和的矛盾。
用生成表达式语法创建列表之后,元素就已经准备就绪,所以需要耗费较多的内存空间。用列表生成器的时候,这里得到的不是一个列表,而是一个生成器对象,
通过生成器可以获取到数据,它不占用额外的空间存储数据,但是每次需要数据的时候就要通过生成器获取数据,需要花费时间。
在很多时候,程序员都将面临时间与空间的矛盾,这需要我们根据实际情况进行取舍。
python基于列表可以实现CRUD操作:Create Read Update Delete。
利用列表生成式解决杨辉三角:

def yanghui_triangle(n):
    list1 = [1]
    for _ in range(n):
        yield list1
        list1.append(0)
        list1 = [list1[i - 1] + list1[i] for i in range(len(list1))]

你可能感兴趣的:(程序小白)