文章目录
186_修改全局变量
思考:testB函数需求修改变量a的值为200,如何修改程序?
a =100
print(a)
def testB():
a =200
print(a)
testA() #100
testB() #200
***print(f'全局变量a ={a}') #全局变量a =100
思考:在testB函数内部的a=200中的变量a是在修改全局变量吗?
答:不是。观察上述代码发现,***处得到的数据是100,仍然是定义全局变量a时候的值,而没有返回testB函数内部的200.综上:testB函数内部的a=200是定义了一个局部变量。
#声明全局变量:函数体内外都能访问
a = 100
print(a)
def testA():
print(a)
def testB():#B函数想要a的取值是200
a = 200 #如果直接修改a=200,此时的a是全局a还是局部a?------得到结论:这个a是局部变量
#因为在全局位置(B函数调用后)打印a得到的不是200而是100
print(a)
testA()
testB()
print(a)
运行结果:
思考:如何在函数体内部修改全局变量?
a =100
def testA():
print(a)
def testB():
#global 关键字声明a是全局变量
global a
a =200
print(a)
利用global关键字声明修改全局变量,情况如下所示:
#声明全局变量:函数体内外都能访问
a = 100
print(a)
def testA():
print(a)
def testB():#B函数想要a的取值是200
# a = 200 #如果直接修改a=200,此时的a是全局a还是局部a?------得到结论:这个a是局部变量
#因为在全局位置(B函数调用后)打印a得到的不是200而是100
#print(a)
#想要修改全局变量a:值是200
global a #声明a为全局变量
a =200
print(a)
testA()
testB()
print(a)
"""
总结:
1.如果在函数里面直接把变量a=200赋值,此时的a不是全局变量的修改,而是相当于在函数内部声明了一个新的局部变量
2.函数体内部修改全局变量:先global声明a为全局变量,然后在将变量重新赋值即可
"""
运行结果:
187_多函数执行流程
二、多函数程序执行流程
一般在实际开发过程中,一个程序往往由多个函数(后面知识中会讲解类)组成,并且多个函数共享某些数据,如下所示:
#1.定义全局变量
glo_num = 0
def test1():
global glo_num
#修改全局变量
glo_num = 100
def test2():
#调用test1函数中修改后的全局变量
print(glo_num)
#2.调用test1函数,执行函数内部代码:声明和修改全局变量
test1()
#3.调用test2函数,执行函数内部代码:打印
test2() #100
#1.声明全局变量;2.定义两个函数;3.函数一修改全局变量;函数二访问全局变量
glo_num = 0
def test1():
global glo_num
glo_num = 100
def test2():
print(glo_num)
print(glo_num) #0,因为修改的函数还没开始执行
test2() #0,因为修改全局变量的函数1还没开始执行
test1()
test2() #100,因为先调用了函数1,修改了全局变量值为100
print(glo_num) #100,调用了函数1
运行结果:
188_返回值作为参数传递
- 返回值作为参数传递
def test1():
return 50
def test2(num):
print(num)
#1.保存函数test1的返回值
result = test1()
#2.将函数返回值所在变量作为参数传递到test2函数
test2(result) #50
#1.定义两个函数;2.函数一有返回值50;函数二把返回值50作为参数传入(定义函数二要有形参)
def test1():
return 50
def test2(num):
print(num)
#先得到函数一的返回值,再把这个返回值传入到函数二
result = test1()
#print(result)
test2(result)
运行结果:
189_函数的返回值
思考:如果一个函数有两个return(如下所示),程序将如何执行?
def return_num():
return 1
return 2
result = return_num()
print(result) #1
答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执行。
#需求:一个函数有两个返回值1和2
#一个函数如果有多个return不能都执行,只执行第一个return,无法做到一个函数有多个返回值
def return_num():
return 1
return 2
result = return_num()
print(result) #1
运行结果:
思考:如果一个函数要有多个返回值,该如何书写代码?
def return_num():
return 1,2
result = return_num()
print(result) # (1,2)
注意:
1.return a,b写法,返回多个数据的时候,默认是元组类型。
2.return后面可以连接列表、元组或字典、以返回多个值。
#需求:一个函数有两个返回值1和2
#一个函数如果有多个return不能都执行,只执行第一个return,无法做到一个函数有多个返回值
# def return_num():
# return 1
# return 2
# result = return_num()
# print(result) #1
#一个函数多个返回值的写法
def return_num():
return 1,2 #返回的是元组
result = return_num()
print(result)
运行结果:
return后面返回多种数据类型的情况如下所示:
#需求:一个函数有两个返回值1和2
#一个函数如果有多个return不能都执行,只执行第一个return,无法做到一个函数有多个返回值
# def return_num():
# return 1
# return 2
# result = return_num()
# print(result) #1
#一个函数多个返回值的写法
def return_num():
#return 1,2 #返回的是元组
#return后面可以直接书写 元组 列表 字典,返回多个值
#return (10,20) #返回(10,20)
#return [100,200] #返回[100,200]
return {'name':'Python','age':20}
result = return_num()
print(result)
运行结果:
190_函数参数之位置参数
函数的参数
- 位置参数:调用函数时根据函数定义的参数位置来传递参数。
def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('gaozhenyang',20,'男')
注意:传递和定义参数的顺序及个数必须一致。
#需求:函数有3个参数name,age,gender
def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('gaozhenyang',20,'男')
运行结果:
传递和定义参数的个数不一致会报错的情况如下所示:
#需求:函数有3个参数name,age,gender
def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
#user_info('gaozhenyang',20,'男')
user_info('gaozhenyang',20)#个数定义和传入不一致会报错
运行结果:
传递和定义参数的顺序不一致会报错的情况如下所示:
#需求:函数有3个参数name,age,gender
def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
#user_info('gaozhenyang',20,'男')
#user_info('gaozhenyang',20)#个数定义和传入不一致会报错
user_info(20,'gaozhenyang','男') #实参顺序也必须要和形参是一致的,否则导致数据是无意义的
运行结果:
191_关键字参数
- 关键字参数:函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('Rose',age=20,gender='女')
user_info('小明',gender='男',age=16)
注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('Rose',age=20,gender='女')
user_info('小明',gender='男',age=16) #关键字参数之间不分先后顺序
运行结果:
关键字参数写在位置参数前面报错的情况如下所示:
def user_info(name,age,gender):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('Rose',age=20,gender='女')
user_info('小明',gender='男',age=16) #关键字参数之间不分先后顺序
#位置参数必须写在关键字参数的前面
user_info(age=20,gender='男','TOM')
运行结果:
192 _缺省参数
缺省参数
- 缺省参数:也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传入该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
def user_info(name,age,gender='男'):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('TOM',20)
user_info('Rose',18,'女')
注意:函数调用时,如果为缺省参数传值,则修改默认参数值;否则使用这个默认值。
def user_info(name,age,gender='男'):
print(f'您的名字是{name},年龄是{age},性别是{gender}')
user_info('TOM',20) #没有为缺省参数传值,表示使用默认值
user_info('Rose',18,'女') #为缺省参数传值,使用这个值,即修改了默认值
运行结果:
193_不定长参数之位置参数
不定长参数
不定长参数:也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
- 包裹位置传递
def user_info(*args):
print(args)
#('TOM')
uesr_info('TOM')
#('TOM',18)
user_info('TOM',18)
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。
def user_info(*args):
print(args)
user_info('TOM') #('TOM')
user_info('TOM',18) #('TOM',18)
user_info('TOM',18,'男')
user_info()
运行结果:
194_不定长参数之关键字参数
- 包裹关键字传递
def user_info(**kwargs):
print(kwargs)
#{'name':'TOM','age':18,'id':110}
user_info(name-'TOM',id=110)
综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
#收集所有有关关键字参数,返回一个字典
def user_info(**kwargs):
print(kwargs)
user_info()
user_info(name='TOM')
user_info(name='TOM',id=110) #{'name':'TOM','age':18,'id':110}
运行结果:
195_元组拆包
拆包和交换变量值
- 拆包;元组
def return_num():
return 100,200
num1,num2 = return_num()
print(num1) #100
print(num2) #200
拆包元组数据的情况如下所示:
#1.拆包元组数据
def return_num():
return 100,200
result = return_num()
print(result)
num1,num2 = return_num()
print(num1) #100
print(num2) #200
运行结果:
196_字典拆包
- 拆包:字典
dict1 = {'name':'TOM','age':18}
a,b =dict1
#对字典进行拆包,取出来的是字典的key
print(a) #name
print(b) #age
print(dict1[a]) #TOM
print(dict1[b]) #18
拆包字典数据的情况如下所示:
#2.字典数据拆包:变量存储的数据是key值
#先准备字典,然后拆包
dict1 = {'name':'TOM','age':18}
#dict1中有两个键值对,拆包的时候用两个变量接收数据
a,b =dict1
#对字典进行拆包,取出来的是字典的key
print(a) #name
print(b) #age
#value()值
print(dict1[a]) #TOM
print(dict1[b]) #18
运行结果:
197_交换变量的值之方法一
交换变量值
需求:有变量a=10和b=20,交换两个变量的值。
- 方法一:借助第三变量存储数据。
#1.定义中间变量
c =0
#2.将a的数据存储到c
c = a
#3.将b的数据20赋值到a,此时a=20
a=b
#4.将之前c的数据赋值到b,此时b=10
b =c
print(a) #20
print(b) #10
借助第三变量存储数据实现两个变量交换数据的情况,如下所示:
a = 10
b = 20
#1.方法一
"""
1.1 定义中间的第三变量,为了临时存储a或b的数据
1.2 把a的数据存储到c,做保存
1.3 把b的数据赋值到a,a = 20
1.4 把c的数据赋值到b,b = 10
"""
c = 0
c = a
a = b
b = c
print(a)
print(b)
运行结果:
198_交换变量的值之方法二
- 方法二
a,b = 1, 2
a,b = b, a
print(a) #2
print(b) #1
交换变量的值之方法二,代码实现如下所示:
#方法二:交换变量的值之方法二
a,b = 1,2
print(a)
print(b)
a,b = b,a
print(a)
print(b)
运行结果: