工程师们大家好,配套免费视频(平时上班周末录制)
在实际生活中,一家做汽车的工厂。
要完成一个完整的汽车,需要很多步骤,比如组装发动机,组装轮胎,喷漆等等
我们可以看到,这些工厂都会把这些各种功能拆分为单独的车间,有很多好处,
比如:方便管理,避免交叉(一交叉就容易乱),易于新员工上手(你刚入行,只是面对轮胎比你面对整个车压力要小很多)...
那么在程序中其实也一样,一个系统,会包含很多的功能,我们也应该借鉴现实生活的例子,把这些功能单独的分开。
1.函数
函数:就是具有某项功能作用的代码集合。
首先定义函数:先从概念理解 下面在学习格式
函数一:{
组装发动机(30行代码)
}
函数二:{
组装轮胎(40行代码)
}
函数三:{
喷漆(50行代码)
}
然后组装一个车:
调用函数一: 完成发动机
调用函数二: 完成轮胎
调用函数三: 完成喷漆
最后完整的车出厂
。。。。。。
好处:
1.重用:比如喷漆,不仅仅是可以给汽车,还有很多东西都需要喷漆,把喷漆独立出来,在其他地方使用的时候就可以直接调用函数3
(因为它是一个函数,是一个整体,你写在一起就没法单独调出来)
2.安全:如果我写在一起,你想要我喷漆的代码,因为我没有把他独立出来不得不把所有代码都给你,那么暴露越多越危险
3.可维护性强:喷漆出了问题,我找函数3 50行代码,轮胎出问题我找函数二。。。如果写在一起我面对的就是120行代码,
然后去找到出错的。肯定工作量更大,我还得区分代码
4.易上手:对新入职的员工,我让你改下喷漆的代码,你只需要看函数三,
。。。。。
在python中函数需要先定义,才能使用。如同上面,需要有函数一二三,才能去调用
格式:
def 函数名(参数):
代码块
代码块
return xxx
def是关键字,固定写法
注意代码块缩进格式
1.1函数名
满足前面说的标识符规则,尽量见名知意:
1.由数字、字⺟、下划线组成
2.不能数字开头
3.不能使⽤内置关键字
4.严格区分⼤⼩写
1.2参数/拆包
函数是为了完成功能,比如上面调用函数三可以喷漆,你调用我函数三的时候应该给我一个车身,我才知道喷在哪里,
也就是调用函数的时候,需要给函数什么,这就是参。当然根据功能的不同,参数可以没有,可以有很多
没有参数的函数:
def aaa():
print('我是一个没有参数的函数')
print('调用我可以完成一个特定的功能')
# 调用aaa函数
aaa()
位置参数:
def aaa(name, age):
print('我是一个有两个参数的函数')
print(f'接收到参数name:{
name},参数age:{
age}')
# 调用aaa函数 根据位置会直接把张三给到name,10给到age
aaa('张三',10)
# 注意:传递和定义参数的顺序及个数必须⼀致。
关键字参数:
def aaa(name, age):
print('我是一个有两个参数的函数')
print(f'接收到参数name:{
name},参数age:{
age}')
# 调用aaa函数 如果根据参数名字来传递参数 那么久可以不用遵守位置
aaa(age=10, name='张三') # 指定了哪个值给哪个参数
缺省参数:
def aaa(name, age=10):
print('我是一个有两个参数的函数')
print(f'接收到参数name:{
name},参数age:{
age}')
# 调用aaa函数 如果根据参数名字来传递参数 那么久可以不用遵守位置
aaa(name='张三') # 不传递age参数 那么age就采用默认的值10
aaa(name='张三', age=5) # 传递了参数了5 就会覆盖掉10
也可以混用:
def aaa(name, address, age=10):
print('我是一个有两个参数的函数')
print(f'接收到参数name:{
name},参数age:{
age},地址是:{
address}')
# name采用位置匹配 第一个匹配第一个 address采用名字匹配 age采用默认值
aaa('张三', address='成都')
不定长参数:
不定⻓参数也叫可变参数。⽤于不确定调⽤的时候会传递多少个参数(不传参也可以)的场景
def aaa(*args):
print(args) # 传递的张三跟10 会被args装为一个元组 ('张三', 10)
print(args[0]) # 通过元组的取值可以得到张三
aaa('张三', 10)
# 也可以混用
def bbb(name, *args):
print(f'获得参数name: