函数返回值以及交换变量相关语法

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为全局变量,然后在将变量重新赋值即可
"""

利用global关键字声明修改全局变量
运行结果:
运行结果

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)

return后面返回多种数据类型的情况
运行结果:
运行结果

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)

交换变量的值之方法二
运行结果:
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开,静待绽放!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值