递归(Recursion)
我们知道一个函数可以调用其他函数。函数甚至可能会调用自身。这些类型的构造称为递归函数。
【calc_factorial()是一个递归函数,它调用了自己。】
递归历程:
【当数字减少到1时,递归结束。这称为基本条件。】
每个递归函数必须具有停止递归的基本条件,否则该函数将无限调用自身。
Python解释器限制了递归的深度,以帮助避免无限递归,从而导致堆栈溢出。默认情况下,最大递归深度为 1000。如果超出限制,则结果为RecursionError。
匿名函数(Lambda)
匿名函数是没有定义名称的函数。匿名函数也称为lambda函数
Lambda函数可以具有任意数量的参数,但只能有一个表达式。表达式被求值并返回。Lambda函数可在需要函数对象的任何地方使用。
示例:
【在上面的程序中,lambda x: x * 2是lambda函数。这里x是参数,x * 2是求值和返回的表达式。】
当我们临时需要匿名函数时,我们使用lambda函数。
lambda与filter()一起使用
在Python函数中filter()接受一个函数和一个列表作为参数。
使用列表中的所有项调用该函数,并返回一个新列表,其中包含函数计算结果为True的项。
【从列表中获取偶数的示例】
lambda与map()一起使用
在Python中的map()函数接受一个函数和一个列表。
使用列表中的所有项调用该函数,并返回一个新列表,其中包含该函数为每个项返回的项。
【把所有项都翻倍】
变量
全局变量
在Python中,在函数外部或全局范围内声明的变量称为全局变量。这意味着可以在函数内部或外部访问全局变量。
【x为一个全局变量】
如果要在函数内更改x的值,会报错,因为Python将函数内x视为一个局部变量,而x没有在foo()中定义。为了实现这个功能,我们需要在外部使用全局关键字global来修饰x,这样在函数内修改x就可以直接影响到外部的x而不报错了
局部变量
在函数体内或局部范围内声明的变量称为局部变量。
【输出显示一个错误,因为我们试图在全局范围内访问一个局部变量y,而局部变量只在foo()或局部范围内工作。】
全局和局部变量
我们将展示如何在同一代码中使用全局变量和局部变量。
【我们将x声明为全局变量,将y声明为foo()中的局部变量。然后,我们使用乘法运算符*来修改全局变量x,并同时输出x和y。】
有相同名称的全局、局部变量
【注意作用域即可,优先局部变量】
非局部变量
非局部变量用于未定义局部作用域的嵌套函数。这意味着该变量既不能在局部范围内,也不能在全局范围内。
使用nonlocal
关键字创建非局部变量
【当使用nonlocal声明变量 x 时,就会往上最近一层局部作用域寻找局部变量 x 】
往上最近一层局部作用域寻找局部变量 x 】