函数
- 变量得作用域
- 多函数程序执行流程
- 函数得返回值
- 函数得参数
- 拆包和交换两个变量得值
- 引用
- 可变和不可变类型
一、变量作用域
变量得作用域是指变量生效得范围,主要两类:局部变量和全局变量
- 局部变量
所谓局部变量是定义在函数体内部得变量,即只在函数体内部得变量
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中数据得传递通过引用
七 可变和不可变类型
所谓得可变类型和不可变类型是指;数据能够直接修改,如果能够直接修改那么就是可变,否则就是不可变。
可变类型
-
列表
-
字典
-
集合
不可变类型 -
整形
-
浮点型
-
字符串
-
元组