一、函数的返回值
函数中return语句会在函数结束时将数据返回给程序,同时让程序回到函数被调用的位置继续执行。
例如:
def filter_sensitive_words(words):
if"草" in words:
new_words = words.replace("草","*")
return new_words
result = filter_sensitive_words("粮草先行")
print(result)
上述代码中的filter_sensitive_words函数会接收从外界输入的字符串,将该字符串中的”草“转换为”*“,并使用return语句返回替换后的字符串。
函数可以没有return,此时函数并不返回数值,returm语句也可以返回多个值,那么这些值将会被保存到元组之中。
例如,使用return语句返回游戏角色目前所处位置的x坐标和y坐标。
def move (x,y,step):
nx = x + step
ny = y - step
return nx,ny
result = move(200,300,50)
print(result)
运行结果:
二、变量作用域
2.1 全局变量与局部变量
1.局部变量
局部变量是指在函数内部定义的变量,它只能在函数内部被使用,函数执行结束后局部变量会被释放,此时无法进行访问。不同函数内部也可以包含同名的局部变量,这些局部变量的关系相互独立互不影响。例如以下代码:
def test_one():
number=10
print(number)
def test_two():
number=20
print(number)
test_one()
test_two()
print(number)
test_one()函数中定义了一个局部变量number,test_two()函数中也定义了一个局部变量number,分别在每个函数内部访问number。程序在执行test_one()函数时访问了其局部变量number,并且答应了number的值。test_two()函数同理,但是因为使用了局部变量,在结果成功访问了number之后接下来程序在test_two函数歪直接使用print()函数访问了局部变量number导致出现异常,英雌说明在函数外部无法访问局部变量。
2.全局变量
全局变量可以在整个程序的范围内起作用,它不会受到函数范围的影响
number=10
def test_one():
print(number)
test_one()
print(number)
运行结果:
程序在执行test_one()函数时成功访问了全局变量,并且打印了number的值:程序在执行完test_one函数后再次成功的访问了全局变量,因此全局变量是可以在程序中任意位置被访问。
LEGB原则:
L是local,指局部变量,作用于函数内部。
E是Enclosing function locals可能是嵌套函数内,比如python嵌套函数。
G是Global,是全局变量,定义在函数体外,在整个文件中都可以访问。
B是Buildin,Python内置模块的名字空间函数名称等,比如dict、len()等。
Python的命名空间实际是一个字典,字典内保存了变量名称与对象之间的映射关系,因此,查找变量名就是在命名空间字典中查找键-值对。
Python有多个命名空间,因此,需要有规则来规定,按照怎样的顺序来查找命名空间,LEGB就是用来规定命名空间查找顺序的规则。LEGB规定了查找的顺序为:local>enclosing function locals>global>builtin
3.global关键字
global关键字u可以将局部变量声明为全局变量。当局部变量在函数外部时函数内部无法修改。因此使用global关键字将局部变量修改为全局变量。
number=10
def test_one():
global number
number +=1
print(number)
test_one()
print(number)
运行结果:
4.nonlocal关键字
使用nonlocal关键字可以在局部作用域中修改嵌套作用域中的声明变量
def test():
number=10
def test_in():
nonlocal number
number =20
test_in()
print(number)
test()
示例代码:
以上定义的test()函数中嵌套了函数test_in(),test()函数中声明了一个变量number,在test_in()函数中使用nonlocal关键字修饰了变量number,并修改了number的值,调用test_in()函数输出后变量bumber的值。
总结:
(1)简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放,若有全局同名变量,其值保持不变。
(2)简单数据类型变脸在用global保留字声明后,作为全局变量使用,函数退出后该变量保留且值被函数改变,
(2)对于组合数据类型的全局变量,如果在函数内部没有被真实创建的同名变量,则函数内部可以直接使用并修改全局变量的值。
(4)如果函数内部真实创建了组合数据类型变量,无论是否有同名全局变量,函数仅仅对全局变量进行操作,函数退出后局部变量被释放,全局变量值不变