局部变量和全局变量的含义
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序.
当全局变量于局部变量同名时:
在定义局部变量的子程序内,局部变量起作用,在其它地方全局变量起作用.
name = "XGZ"
def change_name():
print("wo de ming zi ",name)
change_name()#输出结果:wo de ming zi XGZ
def new_name():
name = "ZJL"
print("wo de ming zi " ,name)
new_name()#输出结果:wo de ming zi ZJL
print(name)#输出结果:XGZ,说明函数中的变量只作用于函数当中.
global关键字
如果在函数当中用这个关键字声明了局部变量,那么会覆盖全局变量的值
如果没有声明,会直接拿到全局变量的值.
在方法内部不用global关键字,虽然无法给全局变量赋值,但是我们可以通过全局变量的方法,对这个变量进行添加,删除等各种操作(全局变量也是对象,是对象就有方法)
全局变量名大写
局部变量名小写
def new_name():
global name
name = "ZJL"
print("wo de ming zi " ,name)
new_name()#输出结果:wo de ming zi ZJL
print(name)
nonlocal关键字
这个关键字是用于方法嵌套,指向上一级函数变量的功能.
name = "123"
def hai():
name = "456"
def hai1():
nonlocal name
name = "789"
hai1()
print(name)
print(name)
hai()
print(name)
递归
在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧.由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
def calc(n):
print(n)
calc()
calc(5)#这是一个死递归
我们在定义一个的递归函数时为了防止它是死递归,所以必须设置返回值和结束条件.
def calc(n):
print(n)
if n / 2 == 0:
return n
return calc(int(n / 2))
calc(10)