#规则:
全局变量全部大写,局部变量全部小写
#关于局部变量和全局变量在函数中应用的关系:
定义全局变量:
name = 'alex' #全局变量
1、函数中先定义与全局变量名相同的变量后再引用:
name = 'alex' #全局变量
def test():
name = 'oliver' #先定义了局部变量(与全局变量名称相同)
print(name) #后使用该变量
test()
print(name)
# --> oliver alex
可看出先定义与全局变量名称相同的局部变量后,在引用时使用的是局部变量的值(Oliver),且原全局变量不受改变(依旧是alex)
2、函数中先使用全局变量后再引用:
name = 'alex' #全局变量
def test():
print(name) #本函数内找不到name,所以将采用全局变量name的值来使用
name = 'oliver' #修改name的值
print(name)
test()
print(name)
# --> 报错
可看出如果函数中引用某变量时,在本函数内找不到定义,则会使用全局变量。但使用全局变量后就无法更改该变量的值。
# global的使用:
在上述的讨论中,已经知道方法二:函数中先使用全局变量后再引用,可以使用全局变量的值,但是不能修改,若想修改则需要使用global 将函数中的该变量更改为全局变量。
name = 'alex' #全局变量
def test():
global age, name
age = 18
print(name, age)
name = 'oliver'
print(name)
test()
print(name, age)
# --> alex 18 oliver oliver 18
只要在函数中先用global定义变量,则该变量与在函数外定义的一样,具有全局性,可被修改(name),也可被外部直接引用(age)
#nonlocal的使用:
global定义的变量为全局变量,该变量会与最外层定义的指定变量等效,但如果想让该变量与其上层函数所定义的某变量等效,则要使用nonlocal。
name = 'haifeng' #全局变量
def huangwei():
name = 'chenzhuo' #第一级变量
def liuwei():
nonlocal name #此处name将与第一级变量name等效
name = 'lengjing' #将更改第一级变量的值
liuwei()
print(name)
huangwei()
print(name)
# --> lengjing haifeng 可看出第一级变量被改变,而全局变量值未被改变
#定义的函数内也可以定义函数(函数嵌套):
def huangwei():
print('huang')
def liuwei():
print('liu')
liuwei()
huangwei()
# --> huang liu
但内部定义的函数不能在外部调用:
def huangwei():
print('huang')
def liuwei():
print('liu')
liuwei()
liuwei()
# --> 报错:name 'liuwei' is not defined
#递归:
函数内部继续调用本函数
def calc(n):
print(n)
if int(n / 2) == 0:
return n
return calc(int(n / 2))
calc(5)
# --> 5 2 1
特性:
1、必须有一个明确的结束条件(否则内存溢出就会报错)
2、每次进入更深一层递归时,问题规模要逐渐减小