python基础六:函数的几种类型与局部变量和全局变量、申明修改全局变量global与修改嵌套函数变量的nonlocal
阅读时注意看代码注释
python定义一个函数格式:函数有无参数无返回值类型、无参数有返回值类型(返回特定数据时使用)、有参数无返
回值类型、有参数有返回值类型(所有返回值要用关键字return返回)。
def 函数变量名(形式参数):
执行语句(如果有返回值用return)
实例:
-
# 有参数返回型
-
def dance(num):
-
for i in range(num):
-
return '跳舞{}次。'.format(i)
-
-
# 无参返回型
-
def dance1():
-
num = 3
-
for i in range(num):
-
return '跳舞{}次。'.format(i)
-
-
# 无参无返回型
-
def dance2():
-
num = 3
-
for i in range(num):
-
print('跳舞{}次。'.format(i))
-
-
# 有参无返回型
-
def dance3(num):
-
for i in range(num):
-
print('跳舞{}次。'.format(i))
-
-
# if __name__ == '__main__':为主线程执行入口(可以没有,没有就是无缩进的代码是执行入口,然后一行一行执行)
-
if __name__ == '__main__':
-
a = dance(3)
-
print(a)
-
print('*'*20)
-
b = dance1()
-
print(b)
-
print('*' * 20)
-
dance2()
-
print('*' * 20)
-
dance3(3)
-
-
-
结果:
-
-
跳舞0次。
-
********************
-
跳舞0次。
-
********************
-
跳舞0次。
-
跳舞1次。
-
跳舞2次。
-
********************
-
跳舞0次。
-
跳舞1次。
-
跳舞2次。
注意:可以看到第一和第二个有返回类型的时候,return 在第一次循环返回结果后,会跳出循环,所一达不到循环的结果,写代码时要注意。
Python中引用一个变量的时候,是按照找本地作用域(Local)、嵌套作用域(Enclosing function locals)、全局作用域(Global)、内置作用域(builtins模块)的顺序来寻找变量的,即所谓的LEGB规则。
但是当在一个函数内部给一个局部变量(本地作用域的变量名)赋值的时候,并不是按照上面所说LEGB规则来首先找到变量,之后
为该变量赋值。而是遵循这样一条规则:在函数中给一个变量名赋值(不是在一个表达式中对其进行引用),Python中是创建或改变
本地作用域的变量名,而对其他作用域没有影响(如果它已经在那个函数中被声明为全局变量,则所有的作用域都可用)。
几个实例来说明:
简单例子:
赋值:可以看到第一个输出的的是dance函数的print结果是函数中变量num的值2,而全局下,print输出的结果是全局变量num的值(并没有受到dance函数局部变量的影响)。
-
num = 1
-
def dance():
-
num = 2
-
print(num)
-
if __name__ == '__main__':
-
dance()
-
print(num)
-
-
-
结果:
-
2
-
1
引用:将上面代码的num=2注释掉,结果中dance函数中的print输出的num在本地作用域没有找到,到全局作用域找到num的值为1并输出,全局中的print输出全局变量num的值1.
-
# 将num = 2注释掉
-
num = 1
-
def dance():
-
# num = 2
-
print(num)
-
if __name__ == '__main__':
-
dance()
-
print(num)
-
-
结果:
-
1
-
1
结论:赋值只改变和创建本地作用域的变量值,不改变其他作用域,而引用可以一层一层的寻找。
有函数嵌套也一样,给个代码自己体会:
-
num = 1
-
def dance():
-
num = 2
-
# 嵌套函数
-
def sing():
-
num = 3
-
print(num)
-
sing()
-
print(num)
-
-
if __name__ == '__main__':
-
dance()
-
print(num)
关键字:global
用法:在函数中申明要修改全局变量。
实例:dance函数内的num申明修改了全局变量,所以全局变量的num变成了2,全局print输出2
-
num = 1
-
def dance():
-
# 申明修改全局变量num
-
global num
-
num = 2
-
print(num)
-
if __name__ == '__main__':
-
dance()
-
print(num)
-
-
结果
-
2
-
2
关键字:nonlocal (Python3.0中新增的关键字,python2.x不支持)
用法:使用nonlocal
关键字可以在一个嵌套的函数中修改嵌套作用域中的变量。
实例:
-
def dance():
-
# 外部函数要修改的变量num必须存在
-
num = 2
-
# 嵌套函数
-
def sing():
-
# 申明修改外部函数变量num(外部函数要修改的变量num必须存在)
-
nonlocal num
-
num = 3
-
print(num)
-
# 在外部函数调用内部函数
-
sing()
-
print(num)
-
-
if __name__ == '__main__':
-
dance()
-
-
结果:
-
3
-
3
注意:使用global关键字修饰的变量之前可以并不存在,而使用nonlocal关键字修饰的变量在嵌套作用域中必须已经存在。
文章来源: blog.csdn.net,作者:橙子园,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Chenftli/article/details/79996708
- 点赞
- 收藏
- 关注作者
评论(0)