递归函数
递归函数:自己调用自己的函数,在函数体内部直接或间接的自己调用自己。
每个递归函数必须包含两个部分:
1、终止条件:表示递归什么时候结束。一般用于返回值,不再调用自己
2、递归步骤:把第n步的值和第n+1步相关联
递归函数由于会创建大量的函数对象,过量地消耗内存和运算能力。在处理大量数据时,谨慎使用
def factoral(n):
if n==1:return 1
return n*factoral(n-1)
for i in range(1,6):
print(i,"!=",factoral(i))
嵌套函数(内部函数)
嵌套函数:在函数内部定义的函数
def f1():
print("f1 running....")
def f2():
print("f2 running....")
f2()
f1()
#f2()就是定义在f1()函数内部的函数,f2()函数的定义和调用都在f1()函数内部
一般在以下情况下使用嵌套函数:
1、封装、隐藏数据:外部无法访问“嵌套函数”
2、贯彻DRY(Don’t Repeat Yourself)原则:嵌套函数,可以让我们在函数内部避免重复代码
3、闭包:后讲
def printName(isChinese,name,familyName)
def inner_print(a,b):
print("{0}{1}".format(a,b))
if isChinese:
inner_print(familyName,name)
else:
inner_print(name,familyName)
nonlocal关键字
nonlocal 用来声明外层局部变量
global 用来声明全局变量
a=100
def outer():
b=10
def inner():
nonlocal b#声明外部函数的局部变量
print("inner:",b)
b=20
global a#声明全局变量
a=1000
inner()
print("puter b:",b)
outer()
print("a:",a)
LEGB规则
Python在查找“名称”时,是按照LEGB规则查找的:Local–>Enclosed–>Global–>Built in
Local 指的是函数或者类的方法内部
Enclosed指的是嵌套函数(一个函数包含另一个函数,闭包)
Global指的是模块中的全局变量
Built in指的是Python为直接保留的特殊名称
如果某个name映射在局部(local)命名空间中没有找到,接下来就会在闭包作用域(enclosed)进行搜索,如果闭包作用域也没有找到,Python就会到全局(global)命名空间中进行查找,最后会在内建(build in)命名空间搜索(如果一个名称在所有命名空间中都没有找到,就会产生一个NameError)
文章均为本人观看视频学习所记录的知识点笔记(哔哩哔哩视频链接https://www.bilibili.com/video/BV1tU4y1t7rv)