变量作用范围及函数的嵌套和递归
分为全局变量和局部变量
- 函数即变量:可将定义函数的过程看做是变量赋值的过程
- 函数在定义后只解释不执行,只有调用时才执行,与变量的性质相同。
1. 格式区分
- 全局变量:赋值语句无缩进定义的变量
- 局部变量:赋值语句有缩进(即在函数中)的变量
2. 局部变量 转化为 全局变量
使用 global 语句,可将局部变量转化为全局变量,当函数被调用时转化语句生效,如:
name = 'cjl'
def rename():
print('1:',name)
global name
name = 'tom'
print('2:',name)
print('3:',name)
rename()
print('4:',name)
# 3: cjl
# 1: cjl
# 2: tom
# 4: tom
3. 作用范围
- 全局变量:作用于所有位置
- 局部变量:仅作用于函数中
4. 变量被引用生效次序(当二者变量名相同时)
- 在函数外引用:仅全局变量生效
- 在函数中引用:优先引用局部变量
【注意:】在函数中,如果引用了全局变量后,又对相同名字的变量重新赋值,会报错,如:
name = 'cjl'
def rename():
print(name)
name = 'tom'
print(name)
rename()
print(name)
# UnboundLocalError: local variable 'name' referenced before assignment
5. 嵌套:注意嵌套中代码的执行顺序,函数定义后,在调用前是不执行的。
- 调用全局变量 使用关键字 global
- 调用外面上一层的变量,使用关键字 nonlocal
如:
NAME = '海风'
def huangwei():
name = "黄伟"
print(name)
def liuyang():
name = "刘洋"
print(name)
def nulige():
name = '沪指花'
print(name)
print(name)
nulige()
liuyang()
print(name)
huangwei()
#黄伟
#刘洋
#刘洋
#沪指花
#黄伟
如:
name = "刚娘"
def weihou():
name = "陈卓"
def weiweihou():
nonlocal name # nonlocal,指定上一级变量,如果没有就继续往上直到找到为止
name = "冷静"
weiweihou()
print(name)
print(name)
weihou()
print(name)
# 刚娘
# 冷静
# 刚娘
6. 递归与尾递归
普通递归
- 函数在递归应明确结束条件
- 函数在递归应随着层级递进,剩余层级规模应越来越少
- 函数递归过程中需要不断保存中间的返回值,所以递归执行的效率不高,递归次数过多可能会导致内存溢出,
如:
def calc(n):
print(n)
if n/2 < 1:
return n
return calc(n/2)
print(calc(10))
#10
#5.0
#2.5
#1.25
#1.25
尾递归
即将递归函数的最后一步调用其他函数,则递归函数已经执行最后一步,进入下一层递归之后上一层函数可以结束