函数
一、变量作用域
变量作用域指变量生效的范围,主要分为两类:局部变量和全局变量。
- 局部变量
定义:局部变量是定义在函数体内部的变量,只在函数体内部生效。
作用:在函数体内部,临时保存数据,当函数调用完成后,则销毁局部变量。
def testA():
a = 100
print(a)
testA() #100
print(a) #报错:name 'a' is not defined
变量a是定义在函数体内部的变量,在函数体外部访问时会报错。
- 全局变量
定义:在函数体内、外都能生效的变量
a = 100
def textA():
print(a)
def textB():
a = 200 #定义了一个局部变量
print(a)
textA() #100
textB() #200
print(f'全局变量a = {a}') #全局变量a=100
如何在函数体内部修改全局变量(global):
def textB():
global a #global声明a为全局变量
a = 200
print(f'全局变量a = {a}') #全局变量a=200
(1)如果在函数里面直接把变量a=200赋值,此时的a不是全局变量,而是相当于在函数体内部声明了一个新的局部变量。
(2)函数体内部修改全局变量:global声明,然后再重新赋值。
二、多函数程序执行流程
在实习开发中,一个程序往往由多个函数组成,并且多个函数共享某些数据:
1.共用全局变量
2.返回值作为参数传递
三、函数返回值
当一个函数有两个return,那么最后只返回第一个return。因为return可以退出当前函数,导致return下方的代码不执行。
- 一个函数多个返回值的写法:return a, b 且返回的默认是一个元组。
- return后面可以连接列表、元组或字典,以返回多个值
def nums():
return 1, 2
print(nums()) #(1, 2)
def num():
return (100, 200) #跟元组
return [100, 200] #跟列表
return {'name': 'python'} #跟字典
四、函数的参数
4.1 位置参数
调用函数时根据函数定义的参数位置来传递参数。
传递和定义参数的顺序及个数必须一致
def user_info(name, age, gender):
print(f'你的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('Tom', 20, '男')
4.2 关键字参数
函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。
def user_info(name, age, gender):
print(f'你的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('Rose', age=20, gender='女')
user_info(age=18, name='Lily', gender= 'girl')
4.3 缺省参数
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值。
缺省参数带有默认值
注:所有的位置参数必须出现在默认参数之前,包括函数定义和调用。
def user_info(name, age, gender='女'): #缺省参数:gender
print(f'你的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('Rose', 20)
user_info(age=18, name='Tom', gender= '男')
4.4不定长参数
不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可以用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递。
无论是包裹位置还是包裹关键字传递,都是一个组包的过程
- 包裹位置传递 (*args)
注:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组,args是元组类型,这就是包裹位置传递。
def user_info(*args):
print(args)
user_info('Tom') #('Tom',)
user_info('Tom', 19) #('Tom', 19)
user_info() #()
- 包裹关键字传递 (**kwargs)
收集所有关键字参数,返回一个字典
关键字传递是根据每个参数的名字传递参数
def user_info(**kwargs):
print(kwargs)
user_info(name='Tom', age=18, id=110)
# {'name': 'Tom', 'age': 18, 'id': 110}
五、拆包和交换变量值
5.1 拆包
- 拆包:元组
def return_num():
return 100, 200
num1, num2 = return_num()
print(num1) #100
print(num2) #200
- 拆包:字典
字典拆包中变量存储的数据是key值
dict1 = {'name': 'Tom', 'age': 10}
a, b =dict1
print(a) #name
print(b) #age
#v值
print(dict1[a]) #Tom
print(dict1[b]) #10
5.2 交换变量值
方法一:借助第三变量存储数据
a = 1
b = 2
c = 0 #定义中间变量
c = a
a = b
b = c
print(a) #2
print(b) #1
方法二:简单方法
a, b = 1, 2
a, b = b, a
print(a) #2
print(b) #1
六、引用
6.1 了解引用
在python中,值都是靠引用来传递的。
可通过id()来判断两个变量是否为同一个值的引用。可以理解为内存地址的标识。
ex 不可变类型:int
a = 1
b = a
print(id(a)) #1968123570480
print(id(b)) #1968123570480
a = 2 #因为修改了a的数据,内存要开辟另外一份内存存储2
print(b) #1 说明int类型为不可变类型
print(id(a)) #1637400209744,此时得到的是数据2的内存地址
ex 可变类型:列表
aa = [10, 20]
bb = aa
print(id(aa)) #2606560199552
print(id(bb)) #2606560199552
aa.append(30)
print(bb) #[10, 20, 30] 列表为可变数据类型
print(id(aa)) #2606560199552 内存地址不变
七、可变和不可变类型
可变类型 (数据能直接修改)
- 列表
- 字典
- 集合
不可变类型 (数据不能直接修改)
- 整型
- 浮点型
- 字符串
- 元组
本文详细介绍了Python中的函数,包括变量作用域(局部和全局)、多函数程序执行流程、函数返回值、不同类型的参数(位置、关键字、缺省和不定长)、拆包与交换变量值,以及引用和可变、不可变类型的概念。
1695

被折叠的 条评论
为什么被折叠?



