学习笔记-Python基础5-函数作用域
变量的作用域:
变量有作用范围限制,其中按作用域分类:全局global(函数外部定义)、局部local(函数内部定义)
LEGB原则:L指Local局部作用域、E指Enclosing function local外部嵌套函数作用域、G指Global module函数定义所在的模块作用域、B指Buildin,Python内置模块的作用域
提升局部变量为全局变量:使用global关键字(如果是在函数内修改函数外全局变量也需要在函数内使用global先声明使用的外部全局变量),举例如下:
globals、locals函数分别显示出所有全局变量和局部变量,举例如下:
eval(string_code, globals=None, locals=None)函数:把一个字符串当成表达式来执行,返回表达式执行后的结果,举例如下:
exec(string_code, globals=None, locals=None)函数:把一个字符串当成表达式来执行,没有返回值,举例如下:
递归:直接或者间接调用自身的函数。如解决经典的汉诺塔算法,优点简洁容易理解,缺点消耗资源大,其中Python语言对递归深度做了限制,超过限制会报错,注意写递归函数,一定要有结束条件,举例如下:
1、斐波那契数列:一列数字,第一个数字是1,第二个数字也是1,之后出现的数字是它前两个数字之和,数学公式为:f(1) = 1,f(2) = 1,f(n) = f(n-1)+f(n-2),实际出现的数字是:1,1,2,3,5,...,举例如下:
2、汉诺塔
def move(n, a, b, c): ''' 汉诺塔玩法:在三根柱子之间一次只能移动一个圆盘,且大圆盘不能放到小圆盘上 n:表示有几个盘子 a、b、c:分别表示三根大柱子 假定现在将所有圆盘从a移到c 如果a只有一个圆盘,可以直接移动到c; 如果a有N个圆盘,可以看成a有1个圆盘(底盘) + (N-1)个圆盘,首先需要把 (N-1) 个圆盘移动到 b,然后,将 a的最后一个圆盘移动到c,再将b的(N-1)个圆盘移动到c。 ''' if n == 1: print(a,"->",c) else: move(n-1,a,c,b)# n=2,执行n-1后,move(n-1,a,c,b)->move(1,a,c,b),跳到if处,执行print:A-->B
move(1,a,b,c)# 这里的a和c是指定义的函数的参数a和c,打印结果是:A-->c
move(n-1,b,a,c)# n=1 ,执行n-1后,跳到if处,执行print,此时,a=b,c=c,结果是:B-->C
move(2,'A','B','C')