今日内容详细
函数的简介
1.什么是函数
假如你是一位维修工,你需要事先把工具准备好 而不是当你接到一个维修工作时 到了现场才临时制造工具
同理,函数就相当于具备某一种功能的工具
2.函数的作用
减少代码的沉余 增加代码的可扩展性和维护性
提高应用的模块性和代码的重复利用率
减少代码的重复 方便修改
函数的本质
结合上述我们可以把函数看成具有某种功能的工具 提前定义好 以便可以进行反复的使用
函数的使用必须遵守一个原则:
先定义
后调用
函数的语法结构
def 函数名(参数1,参数2,...)
'''函数的注释'''
函数体
return 返回值
1.def
是定义函数的关键字
2.函数名
与变量名的命名一致 最好能做到见名知意
3.括号
在定义函数的时候函数名后面必须加上括号
4.参数
定义函数的括号内可以写参数(个数不固定)也可以不写参数,用于接收外界传递给函数体代码内部的数据
5.函数的注释
类似于说明书 用于接收函数的主体功能和具体的使用方法
6.函数体代码
整个函数最核心的区域(逻辑代码)
7.return返回值
控制函数的返回值 返回值就是在调用函数后 看有没有反馈的结果 如果有就会得到返回值 没有结果就不会得到返回值
函数的定义与调用
函数的定义
def my_func():
pass
函数的调用
my_func()
1.函数必须先定义后使用
定义函数的代码必须要在调用函数的代码之前运行即可
2.定义函数使用def关键字 调用函数使用函数名加括号(可能需要添加额外的参数)
3.函数在定义阶段只检测函数代码体代码语法 不执行函数代码体
4.函数名到底是什么东西
函数名绑定的是一块内存地址 里面存放了函数体代码
想要运行该代码 就需要调用函数>>>:函数名加括号
注:函数名加括号执行优先级最高(定义阶段除外)
函数的分类
1.内置函数
python解释器提前帮你定义好的函数 用户可以直接使用 len()
'''内置函数可以直接调用
但是数据类型的内置方法(函数)必须使用数据类型点的方式才可以调用 相当于是数据类型独有的一些内置方法
'''
2.自定义函数
2.1空函数 函数体代码使用pass顶替 暂时没有任何的功能 主要用于前期的项目搭建 充当主要功能
def func()
pass
2.2无参函数 函数定义阶段括号内没有填写 无参函数直接函数名加括号即可调用
def func()
print('无参函数')
2.3有参函数 函数定义阶段括号内填写参数 有参函数调用需要函数名加括号并且给数据值
def func(name,height)
print('有参参数')
func('老六',175)
函数的返回值
返回值就是调用函数之后产生的结果 可有可无 获取函数返回值的方式是固定的
上述方式有则获取 没有则默认接收None
1.函数体代码没有return关键字:默认返回None
def func():
print('没有return返回值的结果')
info = func()
print() # None
2.函数体代码有return关键字:后面不写 返回的也是None
def func():
print('有return返回值的结果')
return
info = func()
print(info) # None
3.函数体代码有return关键字: return后面写什么 就返回什么
def func():
print('有return返回值的结果,后面跟着参数结果')
return 666
info = func()
print(info) # 666
def func():
print('有return返回值的结果,后面跟着参数结果')
name = 'joker'
return name
info = func()
print(info) # joekr
如果是数据值则直接返回 如果是变量则需要找到对应的数据值返回
4.函数体代码有return关键字并且后面写了多个数据值(名字)逗号隔开:默认情况下会自动组织成元组返回
def func()
return 11,22,33,44
info = func()
print(info) # (11,22,33,44)
def func()
return [11,22,33,44]
info = func()
print(info) # [11,22,33,44]
def func()
return[11,22,33,44],{'name' = 'joker'},123
info = func()
print(info) # ([11,22,33,44],{'name' = 'joker'},123)
5.当函数体代码遇到return关键字会立刻结束函数体代码的运行
def func()
print('嘿嘿嘿')
return 666
print('猜猜我会运行吗')
func() # 嘿嘿嘿
函数的参数
参数有两大类
1.形式参数
函数在定义阶段括号内填写的参数 简称为'形参'
2.实际超参数
函数在调用阶段括号内填写的参数 简称为'实参'
def func(info): # info就是func的形式参数
pass
def func(info): # 111就是func的实际参数
pass
function(111)
形参与实参关系
形参相当于是变量名,实参相当于是数据值,在函数调用阶段形参会与实参临时进行绑定,函数体代码运行结束以后,立刻解除关系
def func(info): # 动态绑定
print(info)
func(111) # 111
func('joker') # joker
func('666') # 666
func([1, 2, 3, 4, 5]) # 1, 2, 3, 4, 5
当函数在定义阶段的时候,形参info处于一个游离状态,当函数调用实参的时候,形参就会与实参临时进行绑定,函数体代码运行结束以后,形参与实参解绑,之后等待下一次的调用,在进行绑定,获取数据值,以此类推,形参可以和任意数据值进行绑定,给它什么它就输出什么!
位置参数
1.位置形参,在函数定义阶段括号内从左往右依次填写的变量名,称之为位置形参
给位置形参传值的时候个数必须一一对应,不能多也不能少
def func(name, age): # name, age就是位置形参
pass
2.位置实参,在函数调用阶段括号内从左往右依次填写的数据值,称之为位置实参
实参填写的可以是数据值,也可以是变量名
def func(name,age,sex):
print(name,age,sex)
register(name='egon',sex='male',age=18) # 可以不按位置传值
默认值参数
1.在函数定义阶段括号内以什么等于什么的形式填写的形参称之为默认值形参
2.在函数定义阶段就给形参绑定值 后续调用阶段就可以不传
3.调用阶段不传值就使用默认的 传了就用传了的
4.还需要遵循前面总结的规律 (短的在前面 长的在后面)
def func(name,age,gender='male')
print(f"""
name:{name}
age={age}
gender{gender}
""")
func('jason',18)
func('joker',20)
func('lisa',21,'female')
# name: jason
# age: 18
# gender: male
# name: joker
# age: 20
# gender: male
# name: lisa
# age: 21
# gender: famale
可变长参数
如果我们在调用函数的时候,如果传入的实参过多,就回出现错误,但是我们可以使用(*+形参名)或者(**形参名)来接受过多的实参
原则上形参名可以是任意名,但是君子协议俗成通常为(*args)和(**kwargs)
1.*args。用来接受位置实参。多出来的实参会被保存成元祖。
2.**kwargs 用来接受关键字参数 多出来的实参会被保存成字典。
当然,在函数内部使用的时候,是不带星号的。
在定义的时候请务必放到默认参数之后。*args在**kwargs之前
# *args的使用
def func(x,y,*args):
print(x,y,args)
func(1,2,3,4,5,6) # 1 2 (3,4,5,6)
# **kwargs的使用
def func(x,y,**kwargs):
print(x,y,kwargs)
func(1,2,a=3,c=4) # 1 2 {"a":3,"c":4}