Day 15
今日内容概要
- 函数的本质
- 函数的语法结构
- 函数的定义与调用
- 函数的分类
- 函数的返回值
- 函数的参数
今日内容详细
1.函数的本质
"""
提前定义好函数后续可以反复使用
把函数看作是工具
没有函数(没有工具):每次使用都要现场制作
有函数(有工具):提前准备好工具,需要的时候直接拿出来使用
需注意函数必须先定义然后才能使用
"""
提前定义函数(提前准备工具):
def my_func():
pass
函数的调用(选择工具并使用)
my_func()
2.函数的语法结构
def 函数名(参数1,参数2):
'''函数注释'''
函数体代码
return 返回值
'''
1.def
是定义函数的关键字
2.函数名
与变量名一致 尽量做到见名知意
3.括号
在定义函数的时候函数名后面必须跟括号
*4.参数
定义函数括号内可以写参数(可单、可多个) 也可以不写参数
用于接收外界传递给函数体代码内部的数据
简单理解为使用该函数的条件
5.函数注释
类似于说明书 用于介绍函数的主要功能和使用方法
*6.函数体代码
整个函数的核心区域 写逻辑代码的地方
*7.return
控制函数的返回值,也就是使用完该函数后有没有相应的反馈
'''
3.函数的定义与调用
1.函数必须先定义后使用
定义函数的代码必须要在调用函数的代码之前先运行即可
2.定义函数使用def关键字,调用函数使用函数名加括号(可能需要添加额外的参数)
3.函数在定义阶段只检测'函数体代码的语法' 不执行函数体代码
只有在调用阶段才会真正执行函数体代码
4.函数名到底是什么?
函数名绑定的是一块内存地址 里面存放了函数体代码
要想运行该代码 就需要调用函数:函数名()
"""
函数名加括号执行优先级最高(定义阶段除外)
"""
eg:
def func():#定义一个函数
print('a')#函数体为打印'a'
print(func())#结果为a None 由于没有return所以没有返回值则为None
4.函数的分类
1.内置函数
解释器提前帮你定义好的函数 用户可以直接调用 len()
"""
内置函数可以直接调用
数据类型的内置方法(函数)必须使用.的方式才可以调用
"""
2.自定义函数
1)空函数
函数体代码使用pass顶替 暂时没有任何功能
主要用于前期的项目搭建 提示主要功能
def run():
pass
2)无参函数
函数定义阶段括号内没有填写参数
def func():
print('张三')
ps:无参函数直接函数名加括号即可使用
3)有参函数
函数定义阶段括号内填写参数
def func(a,b):
print('张三')
func([1],2)#结果是张三
ps:有参函数调用需要函数名加括号并且给数据值才能调用
5.函数的返回值
返回值就是调用函数之后产生的结果 可有可无
获取函数返回值的方式是固定的
变量名 = 函数()
#有则获取 没有则默认接收None
1.函数体代码没有return关键字:默认返回None
def func():
print('张三')
res = func()#先执行func()函数体代码 然后把返回值赋给res
print(res)#张三 None
2.函数体代码有return关键字:后面不写东西也返回None
def func():
print('张三')
return#后面没写东西也返回None
res = func()#先执行func()函数体代码 然后把返回值赋给res
print(res)#张三 None
3.函数体代码有return关键字:后面写什么就返回什么(数据值就返回数据值,变量名就找到对应的数据值然后返回,变量名对应的函数体就返回函数体)
def func():
print('张三')
name = '李四'
return name#后面写变量名 则返回变量名对应的数据值
res = func()#先执行func()函数体代码 然后把返回值赋给res
print(res)#张三 李四
4.函数体代码有return关键字,且后面写了多个数据值名字 用逗号隔开:默认情况下自动组成元组返回
多个数据值用逗号隔开默认组成元组
def func():
return '张三',2,3
res = func()
print(res)#('张三', 2, 3)
写列表:(字典等都需要自己定义 不然默认返回元组)
def func():
return [1,2,3]
res = func()
print(res)#(1, 2, 3)
多个数据值用逗号隔开且最外层的括号不加自动变元组
def func():
return [1,2,3],{'a':1},123
res = func()
print(res)#([1, 2, 3], {'a': 1}, 123)
5.函数体代码遇到return关键字会立刻结束函数体代码的运行(类似break)
def func():
print('我在上面')
return 123
print('我在下面')#当上面有return时下面的函数体代码不执行
func()#调用函数时执行循环体后只会返回return后面的值 不会执行下面的循环体代码
6.函数的参数
1.函数有两大类:
1)形式参数
函数在定义阶段括号内填写的参数 简称为'形参'
def func(a)#定义时括号内就是形参
pass
2)实际参数
函数在调用阶段括号内填写的参数 简称为'实参'
def func(a)
pass
func(1)#调用时括号内的就是实参
2.形参与实参的关系:
形参相当于变量名
实参相当于数据值
函数在调用阶段形参会临时与实参绑定,函数运行结束立刻解除
绑定关系就叫动态绑定和动态解除
def func(a):
print(a)
func(1)#结果为1
func(2)#结果为2
____________________________________________
def func(a):
print('张三')
func(1)#结果为张三
func(2)#结果为张三
7.位置参数
1.位置形参
在函数定义阶段括号内从左往右依次填写的变量名就叫位置形参
2.位置实参
在函数调用阶段括号内从左往右依次填写的数据值就叫位置实参
eg:
def func(a,b,c):#函数定义阶段括号内的多个变量名就叫位置形参
pass
func(1,2,3)#函数调用阶段括号内的多个数据值就叫位置实参
"""
1.实参可以时数据值也可以时绑定了数据值的变量名
2.位置实参给位置形参传值的时候必须个数一致 不能多也不能少
"""
8.关键字参数
1.关键字实参
在函数调用阶段括号内以什么等于什么传值称之为关键字实参
"""
1.关键字实参给形参传值,打破了位置的限制
2.关键字实参必须在位置实参的后面
诀窍:无论时形参还是实参,都遵循简单的在前,复杂的在后,同复杂随便.
3.同一个形参在依次调用中只能传一次值(一个形参只能给一个值)
"""
eg:
def func(a,b):
print(a,b)#传给形参什么就打印什么
func(a=1,b=2)#结果为 1 2 关键字实参
func(b=1,a=b)#结果为 2 1 关键字实参 打破了位置限制
func(1,b=2)#结果为 1 2 关键字实参要在位置实参后面
func(a=1,2)#结果会出错 关键字实参在位置实参前会报错
func(1,a=2)#结果会出错 同一个形参在依次调用中只能传一次值
func(a=1, a=2)#结果会出错 同一个形参在依次调用中只能传一次值
9.默认值参数
1.默认值形参
在函数定义阶段括号内以什么等于什么的形式填写的形参称为默认值形参
eg:写一个学院注册系统
def register(name,age,gender='女'):#在形参定义阶段就可以给性别默认绑定一个女,当用户注册时不录就会默认女,录男就会该为男(你传就用你的,你不传就用默认的)
print(f"""
-------info-------
name:{name}
age:{age}
gender:{gender}
------------------
""")
register('丽丽',18)
register('张三',18,'男')
#1.在函数定义阶段给形参绑定值,后续调用阶段就可以不传值
#2.调用阶段不传值就使用默认的,传了就用新传的值
#ps:定义阶段还需遵循前面的规律(简单在做 复杂在右 同等复杂度随便)
10.可变长参数
1.可变长形参
可以打破形参与实参的个数限制,随意传值
1)*在形参中的作用:接收多余的位置实参并组成元组赋值给*后面的变量名
#*后面的形参变量名一般用args
eg:定义一个函数,无论接收多少实参都可以执行
def func(*args):#*接收多余的位置实参给后面的args
print(args)
func() #()
func(1) #(1,)
func(1,2) #(1,2)
2)**在形参中的作用:接收多余关键字实参并组成字典赋值给**后面的变量名
#**后面的形参变量名一般用kwargs
eg:定义一个函数,无论接收多少关键字实参都可以执行
def func(**kwargs):#**接收多余的关键字实参给后面的kwargs
print(kwargs)
func() #{}
func(name='a') #{name='a'}
func(name='a',age=18) #{'name':'a','age':18}
3)*与**结合使用
eg:定义一个函数,无论怎么传值都可以执行
def func(*args,**kwargs):
print(args)
print(kwargs)
#位置实参给*,结果是元组() 关键字实参给**,结果是字典{}
func() #() {}
func(1) #(1,) {}
func(1,2) #(1,2) {}
func(a=1) #() {'a':1}
func(a=1,b=2) #() {'a':1,'b':2}
func(1,2,3,a=1,b=2) #(1,2,3) {'a':1,'b':2}