目标:
变量作用域
多函数程序执行流程
函数的返回值
函数的参数
拆包和交换两个变量的值
引用
可变和不可变类型
一、变量作用域
指的是变量生效的范围,主要分为两类:局部变量或全局变量。
局部变量:是定义在函数体内部的变量,即只在函数体内部生效。
def testA():
a = 100
print(a)
testA() # 100
# print(a) # 报错:NameError: name 'a' is not defined
# 变量a是定义在testA函数内部的变量,在函数外部访问则立即报错。
局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。
全局变量:指的是在函数体内、外都能生效的变量。
思考:如果有一个数据,在函数A和函数B中都要使用,该怎么办:
答:将这个数据存储在一个全局变量里面。
# 定义全局变量
a = 100
def testA():
print(a) # 访问全局变量a,并打印变量a存储的数据
def testB():
print(a) # 访问全局变量a,并打印变量a存储的数据
testA() # 100
testB() # 100
思考:testB函数需求修改变量a的值为200,如何修改程序?
a = 100
def testA():
print(a)
def testB():
a = 200
print(a)
testA() # 100
testB() # 200
print(f'全局变量a = {a}') # 全局变量a = 100
思考:在testB函数内部的a = 200中的变量a是在修改全局变量a吗?
答:不是。观察上述代码发现,12行得到a的数据是100,仍然是定义全局变量a时候的值,而没有返回testB函数内部的200。综上:testB函数内部的 a = 200 是定义了一个局部变量。
思考:如何在函数体内部修改全局变量?
a = 100
print(a) # 100
def testA():
print(a)
def testB():
# global 关键字声明a是全局变量
global a
a = 200
print(a)
testA() # 100
testB() # 200
print(a) # 200
'''
总结:
1、如果在函数里面直接把变量a=200赋值,此时的a不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量而已;
2、函数体内部修改全局变量:先global声明a为全局变量,然后再变量重新赋值。
'''
二、多函数程序执行流程
一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,如下所示:
共用全局变量
glo_num = 0
def test1():
global glo_num
# 修改全局变量
glo_num = 100
def test2():
# 调用test1函数中修改后的全局变量
print(glo_num)
print(glo_num) # 0
test2() # 0 # 因为修改的函数没执行
# 2. 调用test1函数,执行函数内部代码:声明和修改全局变量
test1()
# 3. 调用test2函数,执行函数内部代码:打印
test2() # 100
print(glo_num) # 100
返回值作为参数传递
def test1():
return 50
def test2(num):
print(num)
# 1. 保存函数test1的返回值
result = test1()
# 2. 将函数返回值所在变量作为参数传递到test2函数
test2(result) # 50
三、函数的返回值
思考:如果一个函数如果有两个return(如下所示),程序如何执行?
def return_num():
return 1
return 2
result = return_num()
print(result) # 1
答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执行。
思考:如果一个函数要有多个返回值,该如何书写代码?
def return_num():
return 1, 2
result = return_num()
print(result) # (1, 2)
注意:
1、return a, b 写法,返回多个数据的时候,默认是元组类型。
2、return后面可以连接列表、元组或字典,以返回多个值。
def return_num():
return (10, 20)
result = return_num()
print(result) # (10, 20)
def return_num():
return [100, 200]
result = return_num()
print(result) # [100, 200]
def return_num():
return {'name': 'Python', 'age': 30}
result = return_num()
print(result) # {'name': 'Python', 'age': 30}