函数
- 变量得作用域
- 多函数程序执行流程
- 函数得返回值
- 函数得参数
- 拆包和交换两个变量得值
- 引用
- 可变和不可变类型
一、变量作用域
变量得作用域是指变量生效得范围,主要两类:局部变量和全局变量
- 局部变量
所谓局部变量是定义在函数体内部得变量,即只在函数体内部得变量
def testa(): a=100 print(a) testa() print(a) #报错
作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量
- 全局变量
a=100 print(a) def teata(): print(a) teata()
修改全局变量
a=100 print(a) def teata(): print(a) def teatb(): a=200 print(a) teata() teatb() """ 100 100 200 """
修改全局变量 使用关键字 global
a=100 print(a) def teata(): print(a) def teatb(): global a a=200 print(a) teata() teatb() print(a) """ 100 100 200 200 """
二多函数程序执行流程
一般在实际开发过程中,一个程序往往由多个函数组成,并且多个函数共享某些数据,如下所示:
- 共用全局数据
#定义全局变量 num=0 def test1(): global num num=100 def test2(): print(num) test1() test2() #100
- 返回值作为参数传递
def test1(): return 50 def teat2(num): print(num) #保存test1得返回值 result=test1() #将函数返回值所在变量作为参数传递到teat2 teat2(result)
三、函数得返回值
思考:如果一个函数如些两个return,程序如何执行
def retur_num(): return 1 return 2 result=retur_num() print(result) #1
答 只执行第一个return,原因是return可以退出当前函数,导致return下方代码不执行。
思考 如果一个函数要有多个返回值,该如何书写代码
def retur_num(): #return 1,2 #teturn 后面可以直接书写元组,字典,列表 return [1,2] result=retur_num() print(result) #(1, 2)
四函数得参数
4.1位置参数
位置参数:调用函数时根据函数定义得参数位置来传递参数
def user(name,age,gender): print(f'您得名字{name},年龄{age},性别{gender}') user('tom',20,'男') #您得名字tom,年龄20,性别男
注意:传递和定义参数得顺序几个数必须一致
4.2关键字参数
函数调用通过‘键=值’来加以制定,可以让函数更加清晰、容易使用、同时也清楚了参数得顺序需求
def user(name,age,gender): print(f'您得名字{name},年龄{age},性别{gender}') # user('tom',20,'男') # #您得名字tom,年龄20,性别男 user('小米',gender='男',age=16) user('小米',age=66,gender='男') #您得名字小米,年龄16,性别男
注意 函数调用时,如果又位置参数时,位置参数必须在关键字参数得前面,但关键字参数之间不存在先后顺序
4.3缺省参数
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数得值
注意:所有参数必须出现在默认参数前,包括函数定义和调用
def user(name,age,gender='男'): print(f'您得名字{name},年龄{age},性别{gender}') # user('tom',20,'男') # #您得名字tom,年龄20,性别男 user('小米',20) user('小米',66,gender='女') """ 您得名字小米,年龄20,性别男 您得名字小米,年龄66,性别女 """
注意:函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值。
4.4不定长参数
不定长参数也叫可变参数,用于不确定调用得时候会传递多少个参数(不传递也可以)得场景。此时,可用包裹(packing)位置参数,或者包裹(packing)关键字参数,来进行参数传递,回显得非常方便。
- 包裹位置参数
def user(*args): print(args) user('小米',20) user('小米') """ ('小米', 20) ('小米',) """
注意:传进得所有参数都会被args变量收集,他会根据传进得参数得位置合并为一个元组,args是元组类型,这就是包裹位置传递。
- 包裹关键字传递
def user(**kwargs): print(kwargs) # user('tom',20,'男') user(name='小米',age=20, id=110) user(name='小米',age=66,gender='女') """ {'name': '小米', 'age': 20, 'id': 110} {'name': '小米', 'age': 66, 'gender': '女'} """
五,拆包和交换变量值
5.1拆包
- 拆包:元组
def return_num(): return 100,200 num1,num2=return_num() print(num1) print(num2) """ 100 200 """
- 拆包:字典
dict1 = {'name':'小米','age':66} a,b=dict1 print(a) print(b) """ name age """ print(dict1[a]) print(dict1[b]) """ 小米 66 """
交换变量得值
需求:有变量a=10和b=20,交换两个变量得值
- 方法一
借助第三变量
c=0 a=10 b=20 c=a a=b b=c print(a) print(b)
- 方法二
a,b=1,2 a,b=b,a print(a) print(b)
六、引用
6.1了解引用
在python语言中值都是考引用来传递得。
我们可以通过id来判断两个变量是否为同一个值引用。我们可以将id值理解为那块内存得地标识
a=1 b=1 print(b) print(id(a)) #140709588734784 print(id(b)) #140709588734784 a=2 print(b) #1
在列表中
#列表 aa=[10,20,30] bb=aa print(id(aa)) print(id(bb)) aa.append(30) print(bb) print(id(aa)) print(id(bb)) """ 2756781695560 2756781695560 [10, 20, 30, 30] 2756781695560 2756781695560 """
6.2引用当作实参
代码如下
def test1(a): print(a) print(id(a)) a += a print(a) print(id(a)) #int b=100 test1(b) #列表 c=[10,20] test1(c) “”“ 100 140709647785888 200 140709647789088 [10, 20] 2491374002760 [10, 20, 10, 20] 2491374002760”“”
注意:如果以(test 或test1等等)命名可能出错,具体原因不清楚
fixture ‘xxx’ not found的问题
在python中数据得传递通过引用
七 可变和不可变类型
所谓得可变类型和不可变类型是指;数据能够直接修改,如果能够直接修改那么就是可变,否则就是不可变。
可变类型
- 列表
- 字典
- 集合
不可变类型
- 整形
- 浮点型
- 字符串
- 元组