Python_函数提高
1. 变量作用域
- 局部变量:只在函数体内部生效。
作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。
def testA():
a=100
print(a) #函数体内部访问,能访问到a变量
testA()
print(a) #报错,a是局部变量,函数外部无法访问
- 全局变量:在函数体内、外都能生效的变量。
a=100
def testA():
print(a)
def testB():
print(a)
testA() #100
testB() #100
注意:修改全局变量的值
a=100
def testA():
print(a)
def testB():
a=200 #此时的a为局部变量
print(a)
testA() #100
testB() #200
print(a) #100
a=100
def testA():
print(a)
def testB():
global a #修改全局变量
a=200 #此时的a为全局变量
print(a)
testA() #100
testB() #200
print(a) #200
2.多函数程序执行流程
- 共用全局变量
a=10
def testA():
global a
a=100
print(a)
def testB():
print(a)
testB() #10 还没有调用testA
testA() #100 修改了全局变量
testB() #100 先调用了testA
print(a) #100 修改了全局变量
- 返回值作为参数传递
def testA():
return 20
def testB(num):
print(num)
result=testA() #得到testA的返回值
testB(result) #参数传入 50
3.函数的返回值
注意:如果一个函数有多个return不能都执行,只执行第一个return;无法做到一个函数多个返回值
def return_test():
return 1
return 2
result=return_test()
print(result) #1
调整后一个函数多个返回值的写法:
def return_test():
return 1,2 #返回的是一个元组
result=return_test()
print(result) #(1,2)
def return_test():
return {'name':'liming','age':10} #字典 {'name': 'liming', 'age': 10}
# return [100,200] #列表 [100,200]
# return (10,20) #元组(10,20)
result=return_test()
print(result)
注意:
(1)return a,b写法,返回多个数据时,默认是元组类型。
(2)return后面可以连接列表、元组或字典,以返回多个值
4. 函数参数
4.1 位置参数
位置参数:调用函数时根据函数定义的位置参数来传递参数。
注意:传递和定义参数的顺序及个数必须一致。
def stu_info(name,age,sex):
print(f'您的姓名是{name},年龄是{age},性别是{sex}')
# stu_info('liming',20,'男') #您的姓名是liming,年龄是20,性别是男
# stu_info('liming',20) #报错,个数定义和传入不一致
stu_info(20,'liming','男') #顺序应该和定义的保持一致,否则导致数据无意义
4.2 关键字参数
关键字参数:通过"键=值"的形式来加以指定,可以让函数更加清晰,容易使用,同时也清除了参数的顺序需求。
注意:函数调用时,如果有位置参数,位置参数必须在关键字参数前面(如果没有在前面,则会报错),但关键字参数之间 不存在先后顺序。
def stu_info(name,age,sex):
print(f'您的姓名是{name},年龄是{age},性别是{sex}')
stu_info('liming',age=20,sex='男') #您的姓名是liming,年龄是20,性别是男
stu_info('Tom',sex='男',age=27) #您的姓名是Tom,年龄是27,性别是男
4.3 缺省参数
缺省参数(默认参数):用于定义函数,为参数提供默认值,调用函数时可以不传该默认参数的值。
注意:
(1)所有位置参数必须出现在默认参数前面,包括函数定义和调用。
(2)函数调用时,如果为缺省参数传值则会修改默认参数值;否则使用这个默认值。
def stu_info(name,age,sex='男'):
print(f'您的姓名是{name},年龄是{age},性别是{sex}')
stu_info('liming',20) #您的姓名是liming,年龄是20,性别是男
stu_info('Rose',12,'女') #您的姓名是Rose,年龄是12,性别是女
4.4 不定长参数
不定长参数(可变参数):用于不确定调用的时候会传递多少个参数或不传参也可以。
- 包裹位置传递(组包):传进的所有参数都被args变量收集,它会根据传进参数的位置合并为一个元组,args是元组类型。
def stu_info(*args):
print(args)
stu_info('Tom') #('Tom',)
stu_info('Tom',29) #('Tom', 29)
stu_info() #()
- 包裹关键字传递(组包):传进的所有参数都被kwargs变量收集,它会根据传进参数的位置合并为一个字典,kwargs是字典类型。
def stu_info(**kwargs):
print(kwargs)
stu_info(name='liming',age=20) #{'name': 'liming', 'age': 20}
stu_info(name='liming',age=20,sex='男') #{'name': 'liming', 'age': 20, 'sex': '男'}
5. 拆包和交换变量值
5.1 拆包
- 拆包:元组
def return_num():
return 100,200
num1,num2=return_num()
print(num1) #100
print(num2) #200
5.2 交换变量值
- 方法一:借助第三变量存储变量
a = 10
b = 20
c = 0
c = a
a = b
b = c
print(a) #20
print(b) #10
- 方法二:
a,b=10,20
print(a) #10
print(b) #20
a,b=b,a
print(a) #20
print(b) #10
6. 引用
6.1 了解引用
在python中,值是靠引用来传递的。
- int类型(不可变类型)
a = 1
b = a
print(b) #1
print(id(a)) #140712041738512
print(id(b)) #140712041738512
a=2
print(a) #2
print(b) #1 (说明int为不可变类型)
print(id(a)) #140712041738544 (为2重新开辟一段内存空间,1不变)
print(id(b)) #140712041738512
- list类型(可变类型)
aa=[10,20]
bb=aa
print(bb) #[10, 20]
print(id(aa)) #2116452504136
print(id(bb)) #2116452504136
aa.append(30) #列表是可变类型
print(aa) #[10, 20, 30]
print(bb) #[10, 20, 30]
print(id(aa)) #2680429761096
print(id(bb)) #2680429761096
6.2 引用当做实参
- 不可变类型
# 不可变类型
def testA(a):
print(a) #100
print(id(a)) #140711686929776
a += a
print(a) #200
print(id(a)) #140711686932976
b=100
testA(b)
- 可变类型
# 可变类型
def testA(a):
print(a) #[11, 22]
print(id(a)) #2138237194824
a += a
print(a) #[11, 22, 11, 22]
print(id(a)) #2138237194824
b=[11,22]
testA(b)
7. 可变类型和不可变类型
- 可变类型:数据能够直接修改
(1)列表
(2)字典
(3)集合 - 不可变类型:数据不能直接修改
(1)整型
(2)浮点型
(3)字符串
(4)元组