个人学习总结笔记如有不足和错误欢迎指教谢谢
函数递归:在函数内部调用自己或嵌套多个函数循环调用,层层嵌套循环中断进行
一、全局变量
一般在代码最开始的地方声明,所有函数和子程序都可以调用他们,影响全局的变量
A = 'abc' Bba = 'xxx' Ga = 123 print(A,Bba,Ga)
A = 'abc' Bba = 'xxx' Ga = 123
这几个都是全局变量,下面有多少子程序或函数或者关键词 都可以对他们进行调用,一般用大写表示
二、局部变量
在子程序或函数内部的变量,当函数中的声明了与全局变量相同变量名的变量时,优先使用函数中声明的这个变量,影响局部的变量,作用范围仅在子程序或本身的函数中
a = 'abcd'
def GaiBian_a():
a ='ggg'
b = '123'
print('GaiBian_a',a)
print(b)
GaiBian_a() #GaiBian_a ggg
# 123
这里的 a = ‘ggg’ 这个函数a 它的名字 与 全局变量 a = ‘abcd’ 的变量名称时相同的,但是由于在函数 GaiBian_a() 中声明了 这个变量 所有会优先使用 函数中声明的变量 ,在函数GaiBian_a() 内部声明的变量 a和 b 他们都是局部变量 他们只能影响GaiBian_a() 这个函数的内部 而不能被函数外部的程序调用,并且在这个GaiBian_a() 函数被调用前,这两个局部变量他们的值都没有在内存中被创建 而 GaiBian_a() 这个函数运行完成之后 这些局部变量的值 也会从内存中消失
三、函数中 全局变量和局部变量的关系
关键字:global、nonlocal
1、函数中无声明和全局变量同名的局部变量 且没有global 则使默认使用上一级函数中的同名变量 没有上一级函数时则使用全局变量(函数中嵌套的另一个函数而不是调用的另一个函数)
a = 'abcd'
def GaiBian_a():
print('GaiBian_a',a)
GaiBian_a() #GaiBian_a abcd
2、 函数中有声明和全局变量同名的局部变量 且没有global 则使用内部的局部变量
a = 'abcd'
def GaiBian_a():
a = 'cvb'
print('GaiBian_a',a)
GaiBian_a() #GaiBian_a cvb
3、有声明和全局变量同名的局部变量 且有global 则使用内部声明的变量值 并且改变全局变量
a = 'abcd'
def GaiBian_a():
global a
a = 'cvb'
print('GaiBian_a',a)
def GaiBian_a1():
print('GaiBian_a1',a)
GaiBian_a() #GaiBian_a cvb
GaiBian_a1() #GaiBian_a1 cvb
也就是说 从程序调用了 GaiBian_a这个函数开始 全局变量a 就会被重新赋值
4、无声明和全局变量同名的局部变量 且有global 则使用全局变量 并且不会改变全局变量的值
def GaiBian_a():
a = 'cvb'
print('GaiBian_a', a)
def GaiBian_a1():#GaiBian_a cvb
global a
print('GaiBian_a1', a) #GaiBian_a1 abcd
GaiBian_a1()
print(a) #abcd
GaiBian_a()
print(a) #abcd
这里可以看到 GaiBian_a1这个函数牧人应该引用GaiBian_a函数里面声明的局部变量值,但是因为增加了 global关键字 使得函数GaiBian_a1使用了全局变量 并且没有改变全局变量的值
5、nonlocal 指的是使用上一级的变量值 一般用在函数内部的函数 需要改变一个和上一级函数内变量名相同的变量赋值时使用 ,如果不用这个命令内部函数的内部同名变量值只能在这个内部函数内 以及 下一级没有声明这个变量的 函数内生效
a = 'abcd'
def GaiBian_a():
a = 'cvb'
def GaiBian_a1():#
a = 123
def GaiBian_a2():
nonlocal a
a = 888
print('GaiBian_a2', a) #GaiBian_a2 888
GaiBian_a2()
print('GaiBian_a1', a) #GaiBian_a1 888
GaiBian_a1()
print('GaiBian_a', a) #GaiBian_a cvb
print(a) #abcd
GaiBian_a()
这里函数GaiBian_a2()里面又给a进行了赋值,但是前面GaiBian_a1()已经给a赋值了如果不在
GaiBian_a2()里面加入nonlocal 函数GaiBian_a2()给a赋值只能影响它自己内部,但因因为又了这
个命令nonlocal 函数GaiBian_a1()的a的赋值也被更改了 ,但是函数GaiBian_a()里面的a的赋值并
没有被更改 这说明nonlocal 只能影响到上一级函数内的同名变量值
6、如果全局变量时 可变类型的 如列表或字典,那么在函数中时可以对全局变量进行修改
b = ['a', 'b', 'c']
c = {'aa': 1, 'ab': 2, 'ac': 3}
def CeShi_a1():
b.append('xxx')
print('CeShi_a1', b) #CeShi_a1 ['a', 'b', 'c', 'xxx']
def CeShi_a2():
b = {'ad': 4}
c.update(b)
print('CeShi_a2', c) #CeShi_a2 {'aa': 1, 'ab': 2, 'ac': 3, 'ad': 4}
CeShi_a1()
CeShi_a2()
print(b) #['a', 'b', 'c', 'xxx']
print(c) #{'aa': 1, 'ab': 2, 'ac': 3, 'ad': 4}
四、函数递归
在函数内部调用自己或嵌套多个函数循环调用,层层嵌套循环中断进行
一定要有明确的结束条件 否则这个自己调用自己的函数就变成无限循环函数了,用return这个关键字就很不错
每深入一层递归 元素库的规模都应该比 上一次缩小
递归的效率不高 因为暂存的数据量 会根着层数的增加 而变大 很容易造成内存溢出
def DiGui(n):
print(n)
n = n + 1
if n == 10:
return n
else:
DiGui(n)
print('return', n)
DiGui(0)



