变量作用域
局部变量只作用于函数体内部,在外部调用就会出错,因为外部不存在这个数据。其作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量
全局变量函数内外都可作用。
局部变量的改变,可以在函数体内部再次赋值变量。而全局变量需要先用global关键字声明a是全局变量,再重新赋值,才会生效。
a = 100 print(a) def testA(): print(a) def testB(): global a a = 200 print(a) testA() testB() testA()
100
100
200
200
多函数程序执行流程
公用全局变量
glo_num = 0 def test1(): global glo_num glo_num = 100 def test2(): print(glo_num) print(glo_num) test1() test2() print(glo_num)
0
100
100
返回值作为参数传递
def test1(): return 50 def test2(num): print(num) result = test1() test2(result)
50
num就是一个形参。
返回值
def return_num(): return [100, 200] #return 1 #return后可写元组,列表,字典,返回多个值 result = return_num() print(result)
[100, 200]
参数
位置参数
调用函数时根据函数定义的参数位置来传递参数
def user_info(name, age, gender): print(f'您的姓名是{name}, 年龄是{age}, 性别是{gender}') user_info(20, 'TOM', '男')
您的姓名是20, 年龄是TOM, 性别是男
个数和传入的个数不一致会报错。顺序也要和定义一致,虽然程序不报错,但是却是一个个对应下来,会导致数据无意义
关键字参数
函数调用,通过“键=值”形式加以指定。可以让函数更容易被使用
def user_info(name, age, gender): print(f'您的姓名是{name}, 年龄是{age}, 性别是{gender}') user_info('Paul', gender = '男', age = '36')
您的姓名是Paul, 年龄是36, 性别是男
函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序
缺省参数
也叫默认参数,用于定义参数,为参数提供默认值,调用函数时可不传该默认参数的值,所有位置参数必须在缺省参数前,包括函数定义和调用。,因为这个缺省参数是关键字参数写法。函数调用时,如果实参里没有缺省参数,那就使用默认值,否则就修改这个默认值(此句参考下面)
def user_info(name, age, gender='男'): print(f'您的姓名是{name}, 年龄是{age}, 性别是{gender}') user_info('Paul', 36) user_info('Lilly', 25, '女')
您的姓名是Paul, 年龄是36, 性别是男
您的姓名是Lilly, 年龄是25, 性别是女
不定长参数
也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的时候。此时,可用包裹(packing)位置或关键字参数来进行参数传递。如果此时不用不定长参数,使用位置,关键字参数会报错,因为个数不一致会出问题。
位置参数
def user_info(*args): print(args) user_info('Paul', 25) user_info('Paul') user_info()
('Paul', 25)
('Paul',)
()
传入的参数都被args变量收集,根据传进参数的位置合并为一个元组,args是元组类型
关键字参数
def user_info(**kwargs): print(kwargs) user_info(name = 'Paul', age = '37') user_info()
{'name': 'Paul', 'age': '37'}
{}
返回字典形式
拆包和交换变量值
拆包
元组
def return_num(): return 34, 345 num1, num2 = return_num() print(num2) print(num1) print(num1, num2)
345
34
34 345
如果只用一个变量接受,它就会打印出元组
字典
d1 = {'name': 'Paul', 'age': 18} a, b = d1 print(a) print(b) print(d1[a]) print(d1[b])
name
age
Paul
18
交换变量值
用第三个变量来暂时存储,以及一个直接交换赋值
a, b = 1, 2 a, b = b, a print(a) print(b)
2
1
引用
用id()来显示某个数据的地址
不可变类型
a = 1 b = a print(b) print(id(a)) print(id(b)) a = 2 print(b) print(id(a)) print(id(b))
1
1706169925872
1706169925872
1
1706169925904
1706169925872
数据1开辟空间后,拥有了地址,随后起了变量名a,a被赋值给b,b也有了1和这个地址,也就是1和它的地址同时有两个变量名。再出现一个数据2,赋值给a,也就是a这个变量名不再是代表1和地址了,而是代表2了;此时b还是代表1和地址。int类型是不可变类型
可变类型
aa = [10, 20] bb = aa print(bb) print(id(aa)) print(id(bb)) aa.append(30) print(bb) print(id(aa)) print(id(bb))
[10, 20]
1668671582848
1668671582848
[10, 20, 30]
1668671582848
1668671582848
列表是可变类型。aa改变后,改的是原数据,原数据改了,bb也跟着改了。但是地址不变。
引用当作实参
def test1(a): print(a)访问打印形参看是否有数据 print(id(a))访问形参的id a += a print(a) print(id(a)) 改变形参的数据,查看这个形参并打印id,看id值是否相同 b = 100 test1(b) c = [11, 22] test1(c)
调用函数,可变和不可变两种类型依次当做实参传入
100
1976634772816
200
1976634776016
[11, 22]
1976636125824
[11, 22, 11, 22]
1976636125824
有数据打印出来则证明引用可以当作实参传递。整数类型前后地址不同,列表类型前后地址不变。
可变和不可变类型
可变:列表,字典,集合。可以直接修改原数据
不可变:整型,浮点型,字符串,元组
结束。