文章目录
函数的作用
函数就是将一段具有独立功能的代码块整合到一个整体并命名,需要时调用即可。
函数在开发过程中,可以更高效的实现代码重用
函数使用步骤
函数必须先定义,在调用
定义函数
def 函数名(参数):
代码1
代码2
......
return 返回值
调用函数
函数名(参数)
函数的说明文档
语法
- 定义函数的说明文档
def 函数名(参数):
'''
说明文档位置
:param a: 参数1
:param b:参数2
:return:返回值
'''
代码
.......
return 返回值
def sum_num(a,b):
'''
求和函数
:param a: 参数1
:param b: 参数2
:return:返回值a+b的值
'''
return a+b
help(sum_num)
输出:
函数中修改全局变量
在python的函数中,为用global修饰的均为局部变量
a=100
def testA():
a=200 # 这个a相当于局部变量
def testB():
global a # 声明这个a是全局变量
a=200
testA()
print(a) # 输出仍为100
testB()
print(a) # 输出为200
函数有多个返回值
一个函数要是有多个返回值,可以用return a,b 写法,返回多个数据时,默认为元组类型。
return后面可以接列表、元组、字典,以返回多个值
方法1:直接一起返回
def return_num():
return 1,2
print(return_num()) # (1, 2)
方法2:封装成列表、元组、字典等返回
def return_num2():
return [1,2]
print(return_num()) # [1, 2]
函数参数传递方法
- 位置参数:就和其他高级语言一样,参数位置,个数均要对应传递
- 关键字参数:
关键字参数通过 键=值 的形式加以指定。可让函数更清晰、容易使用,也清楚了参数的顺序要求。
def user_info(name,age,gender):
print(f'name={name},age={age},gender={gender}')
user_info('Rose',age=20,gender='女')
注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数前面,但关键字之间不存在先后顺序
- 缺省(默认)参数
缺省参数又叫默认参数,用于定义函数时为参数提供默认值,调用函数时可不传递默认参数值
注意:所有位置参数必须出现在默认参数前,包括函数定义和调用
def user_info(name,age,gender='男'):
print(f'name={name},age={age},gender={gender}')
user_info('Tom',20) # name=Tom,age=20,gender=男
- 不定长参数
不定长又叫可变。用于不确定调用的时候会传递多少个参数的场景。此时可以用包裹(packing)位置参数,或包裹关键字参数来进行参数传递。
包裹位置传递
def user_info(*args):
print(args)
user_info('Tom') # ('Tom',)
user_info('Tom',19) # ('Tom', 19)
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组,args是元组类型,这就是包裹位置传递
包裹关键字传递
合并为一个字典类型
def user_info(**kwargs):
print(kwargs)
user_info(name='Tom',age=20) # {'name': 'Tom', 'age': 20}
综上:无论是包裹位置还是包裹关键字,都是一个组包的过程
拆包
之前提到过,函数有多个返回值时,可以直接一起return,如return 1,2 这些数据会组包成一个元组。还有包裹传递也有组包成元组,组包成字典。所谓拆包就是将这些组合数据拆成单个数据
- 元组拆包
def return_num():
return 100,200 # 组包成元组
num1,num2=return_num() # 拆包成单个数据
print(f'{num1},{num2}') # 100,200
# 所以元组拆包:
tuple1=(100,200,300,400)
num1,num2,num3,num4=tuple1
- 字典拆包
dict1 = {'name': 'TOM', 'age': 18}
a, b = dict1
# 对字典进⾏拆包,取出来的是字典的key
print(a) # name
print(b) # age
print(dict1[a]) # TOM
print(dict1[b]) # 18
引用
了解引用
在python中,值是靠引用来传递的。
我们可以通过id()来判断两个变量是否为同一个值的引用。我们可以将id值理解为那块内存地址的标识
- 对不可变数据类型
# int类型(不可变数据类型)
a=1
b=a
print(id(a)) # 2727844276528
print(id(b)) # 2727844276528
a=2
print(b) # 1
print(id(a)) # 2727844276560
print(id(b)) # 2727844276528
分析得出:int类型是不可变类型。a=1时,内存开辟一块int类型大小的空间存放1,a相当于一个指针指向这块内存。b=a则相当于一个名为b的指针指向那块内存。
当a=2时,因为int为不可变类型,不能再原有内存上修改,所以又开辟一块新的内存空间存储2,a指向新的内存空间。但此时b并未发生改变,仍然指向原先内存。
- 对可变数据类型
# 列表(可变数据类型)
aa=[10,20]
bb=aa
print(id(aa)) # 2569029172480
print(id(bb)) # 2569029172480
aa.append(30) # [10, 20, 30]
print(bb) # 2569029172480
print(id(aa)) # 2569029172480
print(id(bb)) # 2569029172480
注意:列表为可变类型,aa.apend(30)并未修改aa变量所指向的那块内存空间起始地址。
引用当做实参
当为不可变类型时,如int,计算前后id不一样
def test1(a):
print(id(a)) # 1951452452304
a+=a
print(id(a)) # 1951452455568
b=100
test1(b)
print(id(b)) # 1951452452304
当可变类型时,如list,计算前后id一样
def test1(a):
print(id(a)) # 1960252161280
a.append(1)
print(id(a)) # 1960252161280
b=[1,2]
test1(b)
print(id(b)) # 1960252161280
可变类型和不可变类型
可变类型
- 列表
- 字典
- 集合
不可变类型
- 整型
- 浮点型
- 字符串
- 元组