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 不定长参数
不定长参数(可变参数):用于不确定调用的时候会传递多少个参数或不传参也可以。
def stu_info(*args):
print(args)
stu_info('Tom') #('Tom',)
stu_info('Tom',29) #('Tom', 29)
stu_info() #()
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中,值是靠引用来传递的。
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
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. 可变类型和不可变类型