Python学习笔记(十五)函数 PartTwo
一、变量的作用域
变量的作用域指的是变量生效的范围,主要分为两类:局部变量 和 全局变量。
- 局部变量
所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效。
def testA():
a = 100
print(a)
testA()
print(a)
局部变量的作用:在函数体内部,临时保存数据,即在函数调用完后,则销毁局部变量。
- 全局变量
所谓全局变量,指的是在函数体内外都能生效的变量。
思考:如果一个数据在函数体内外都要用,怎么办?
答案:设置为全局变量
a = 100 #全局变量a:函数体内外都能访问
print(a)
def testA():
print(a)
def testB():
print(a)
testA()
testB()
结果截图:
思考:上述例子中,testB函数需求修改变量a的值为200,如何修改程序?
那么,怎么做到testB函数修改全局变量呢?
# global 关键字声明a为全局变量
global a
a = 200
a = 100 #全局变量a:函数体内外都能访问
print(a) #100
def testA():
print(a) #100
def testB():
# global 关键字声明a为全局变量
global a
a = 200
print(a) #200
testA()
testB()
print(a) #200 在testB已经修改全局变量a了
二、多函数程序的执行流程
一般在实际开发过程中,一个程序往往由多个函数组成,并且多函数共享一些数据。
- 共用全局变量
- 返回值作为参数传递
def test1():
return 50
def test2(num):
print(num)
result = test1()
test2(result) #50
三、函数的返回值
函数有多个返回值的情况:
上面的情况只能返回一个返回值,那么怎么返回多个返回值呢?
def return_num():
return 1,2
result = return_num()
print(result) #(1,2), 返回的是元组
注意:
- return a,b 写法,返回多个数据的时候,默认是元组类型。
- return后面可以连接列表、元组和字典,以返回多个值。
def return_num():
return 1,2
result = return_num()
print(result) #(1,2), 默认返回的是元组
def return_num1():
return (10, 20, 30)
result1 = return_num1()
print(result1)
def return_num2():
return [10, 20, 30]
result2 = return_num2()
print(result2)
def return_num3():
return {'name': 'Python', 'age': 3}
result3 = return_num3()
print(result3)
四、函数的参数
4.1 位置参数
4.2 关键字参数
4.3 缺省参数(默认参数)
4.4 不定长参数(可变参数)
以下两种都是参数不确定的情况:
例子:
def user_info(name,age,gender):
print(f'您的姓名是{name},年龄{age},性别是{gender}')
# 1.位置参数
user_info('Tom',12,'男')
# 2. 关键字参数
user_info('Rose',age=15,gender='女') # 位置参数必须写在关键字参数前
user_info(gender='男',name ='小明',age=12) # 关键字参数无先后顺讯
# 3. 缺省参数(默认参数)
def user_info1(name,age,gender='男'):
print(f'您的姓名是{name},年龄{age},性别是{gender}')
user_info1('Tom',12) #没有为缺省参数传值,表示使用默认值
user_info1('Rose',18,'女') #如果缺省参数传值则修改默认参数值
# 4.不定长参数(可变参数)
def user_info2(*args):
print(args)
user_info2()
user_info2('Tom')
user_info2('Tom',20)
user_info2('Tom',20,'男')
def user_info3(**kwargs):
print(kwargs)
user_info3(name = 'Tom')
user_info3(name = 'Tom', age = 18, gender ='男' )
结果截图:
五、拆包和交换两个变量的值
5.1 拆包
-拆包:元组
def return_num():
return 100,200
num1,num2 = return_num()
print(num1) #100
print(num2) #200
-拆包:字典
dict1 = {'name':'Tom','age':19}
a,b = dict1
print(a) #a为key值
print(b) #b为key值
print(dict1[a]) #'Tom'
print(dict1[b]) #19
5.2 交换变量的值
需求:a = 10和 b = 20 ,交换两个变量的值。
- 方法一
借助第三变量存储数据。
a = 10
b = 20
# 1. 定义中间变量
c = 0
# 2. 将a的数据存储到c
c = a
# 3. 将b的数据赋值到a
a = b
# 4. 将c的数据赋值到b
b = c
print(a) #20
print(b) #10
- 方法二
a,b = 1,2
a,b = b,a
print(a) #2
print(b) #1
六、引用
在Python中,值是靠引用来传递的。
我们可以用 id() 来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标识。
# 1. int类型
a = 1
b = a
print(b) #1
print(id(a)) #2045600944
print(id(b)) #2045600944
a = 2
print(b) # 1,说明int类型为不可变类型
print(id(a)) #2045600960,此时得到的是数据2的内存地址
print(id(b)) #2045600944
# 2.列表
list1 = [1,2]
list2 = list1
print(list2) #[1.2]
print(id(list1)) #51070456
print(id(list2)) #51070456
list1.append(3)
print(list2) # [1,2,3],列表为可变类型
print(id(list1)) #58934776
print(id(list2)) #58934776
引用当做实参:
例子:
# 需求:引用是否能当实参传递
def test1(a):
print(a)
print(id(a))
a += a
print(a)
print(id(a))
# int : 计算前后id值不同
b = 100
test1(b)
# 列表 :计算前后id值相同
c = [10,20]
test1(c)
结果截图:
七、可变和不可变类型
八、总结