阅读时注意看代码注释
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关键字修饰的变量在嵌套作用域中必须已经存在。