函数基础学习之语法结构、定义与调用、分类、返回值、形参与实参、位置参数、关键字参数、默认值参数、可变长参数
目录
函数的本质
1.函数的含义
函数可以看成是工具,提前定义好,之后反复使用
2.为什么要有函数呢?
举例说明:假使我们在修水管的时候需要用到扳手,但是我们没有提前准备好,只能现场制造,然后制造好了这次使用过后就扔掉了,那么我们下次使用的时候又没有准备又得现场制造,这样每次反复操作,过程繁琐,费时又费力。那运用到我们函数的身上函数就相当于那个扳手。
'''
1.提前定义好一个方法
2.后面用的时候,可以反复使用,无论在那个地方都可以调用
3.函数必须要提前定义好,之后才能使用
'''
def my_len(): # 函数的定义(提前准备工具的过程)
print('aaaa')
my_len() # 函数的使用,也称函数的调用(开始选择工具并使用)
my_len()
函数的语法结构
def 函数名(参数1,参数2....):
'''函数功能的注释,告诉别人这个函数是干嘛用的'''
函数体(实现功能的代码)
return 返回值
语法结构中各个数据的含义:
1.def 是定义函数的关键字
2.函数名 与变量名的命名一致,最好做到见名知意
3.括号 在定义函数的时候函数名后面必须要有括号
4.参数 定义函数括号内的参数可以写多个不限制参数的个数,同样也可以一个都不写,用于接收外界传递给函数体代码内部的数据
5.函数作用 用于介绍函数的功能,教你怎么用,用在什么地方
6.函数体代码 整个函数最核心的区域,各种功能的实现
7.return 控制函数的返回值,调用函数之后的返回值,就是函数体执行完后返回的结果,可以设置你想要的结果,不要也可以,总结就是执行完函数体后有没有反馈
函数的定义与调用
1.函数必须先定义后使用,定义函数的代码必须要在调用函数之前先执行
2.定义函数使用def关键字,调用函数使用函数名加括号,括号里可能会因为需求会传参数进去
3.函数在定义阶段只检测函数体代码语法,不执行函数体代码,函数体的代码直到有在调用的阶段才会正真的去执行函数体代码,注意它检测函数体代码的语法问题,就是检测函数的语法,例如一些if、for等,语法要没问题才可以
![1jeay9HPYpORx7b](https://s2.loli.net/2022/07/03/pgRiMP4bDOFBV2I.png)
![qJTyxDl5zwsSekt](https://s2.loli.net/2022/07/03/S1JUqeKODf4AP3k.png)
函数名到底是是什么?
函数名绑定的是一个内存地址,里面存放的是函数体代码,想要使用这段代码的话需要用函数名加括号进行调用
def func():
print('from func')
func
这个时候返回的是什么呢?
其实这个时候func相当于一个变量名,只是拿了一下,没有用,并没有进行打印或者赋值因此是没有错误的
def func():
print('from func')
print(func())
函数名加括号执行优先级最高,在执行的时候先执行函数名加括号,先出来func()的打印结果,然后再执行Print
def func():
print('from func')
print(func) # <function func at 0x0000022307409550>
那么函数名到底是什么??通过打印我们可以看到结果是一个地址,其实这个就是一个内存地址他跟普通的变量名稍微有一点不同绑定的是内存地址里面的某一个东西,如果要用的话可以加括号使用
但是其实它跟变量名差不多,变量名是绑定的一个数据值而它绑定的是一串代码,如果要使用的话加括号就是使用这个函数,就是说如果你想拿到这串代码的话你得使用这个函数名加()
函数名与变量名的区别就是,一个绑的是一个具体的数据值,一个绑的是一串代码,使用的时候一个直接使用变量名就可以,使用函数的时候需要用函数名加括号
函数的分类
1.内置函数
解释器提前定义好的函数,用户可以直接调用
内置方法与内置函数的区别:内置函数是解释器提前定义好的,在任何地方都可以使用,而内置方法它得跟在具体得数据类型后面才可以使用
2.自定义函数
2.1 空函数:没有函数体代码使用pass顶替,暂时没有任何功能
def func():
pass
主要用于前期得搭建,提示主要功能,先整一个框架出来,后期再慢慢的添加功能代码'''
2.2 无参函数
def func():
print('aaa')
空函数也算是无参函数的一种
无参函数在使用的时候就是直接使用无需调用参数进去,直接拿着函数名()就执行就好了
2.3 有参函数
def func(a,b):
print('aaa')
指函数定义阶段括号内填写的参数
在调用的时候必须传入参数(数据值)才可以,不给参数(数据值)就会报错不能使用
函数的返回值
1.什么是返回值?
返回值就是调用函数之后产生的结果,可以有也可以没有,获取函数返回的方式是固定的
2.函数的返回值
'''
1.函数体代码没有return关键字,默认返回None
'''
def func():
print('from func')
res = func()
print(res)
# 先执行func(),然后将函数执行的返回值赋值给变量名,但是此时函数没有返回值,因此返回的是None
'''
2.函数体代码有return关键字:有但是后面没有写 也返回None
'''
def func():
print('from func')
return
res = func()
print(res) # None
'''
3.函数体代码有return关键字:并且有值,函数体代码有return,return后面是啥就返回啥
'''
def func():
print('from func')
return 123
res = func()
print(res) # 123
'''
4.函数体代码有return关键字:写什么就返回什么,如果是变量名,那么就要找到那个变量名,变量名绑定的值是什么就返回什么
'''
def func():
print('from func')
name = 'jason'
return name
res = func()
print(res) #jason
'''
5.函数体代码有return关键字并且后面写了多个数据值(名字)逗号隔开,返回之后自动变成元组(默认情况下),如果想返回其他类型就要去自己加上他们该有的特征
'''
def func():
return 1, 2, 3, 4, 5
'''
6.函数体代码遇到return关键字会立刻结束函数体代码的运行
'''
def func():
print('aaa')
return 123
print('bbb')
func()
# return类似于循环中的break,函数体代码运行结束的标志
函数的参数
1.形式参数
函数在定义阶段括号内填写的参数,简称:“形参”
![image-20220701173002289](https://s2.loli.net/2022/07/01/6rpHi5hsI28meqT.png)
2.实际参数
函数在调用的阶段填写的参数,简称“实参”
![image-20220701173403742](https://s2.loli.net/2022/07/01/3WXjpQ9DvanAkOz.png)
3.形参与实参的关系
形参相当于是变量名,实参相当于是数据值,在函数调用的阶段形参会临时与实参进行绑定,函数运行结束立即解除。
动态绑定 动态解除
函数的位置参数
1.位置形式参数
在函数定义阶段括号内从左往右依次填写的变量名称之为位置形参
2.位置实际参数
在函数调用阶段括号内从左往右依次填写的变量名称之为实际参数。实参可以是数据值也可以是绑定了的数据值的变量名。
ps:给位置形参传值时候必须个数一致,多不行少也不行,得正正好。
![image-20220701185424440](https://s2.loli.net/2022/07/01/cUnetgNPfF19l3I.png)
![image-20220701185620692](https://s2.loli.net/2022/07/01/9kEX1UQo3AiVNDF.png)
函数的关键字参数
关键字实参
在函数调用阶段括号内以什么等于什么的形式传值称之为关键字实参
'''
1.指名道姓是传值,打破了位置得限制
'''
def func(a, b):
print(a, b)
func(a=1, b=2)
func(b=1, a=2)
'''
1.第一个是关键字实参给到了b,第二个是位置实参也给到了b,这么做是不可以的
2.同一个形参同一时间不可以多个给值
3.位置实参必须在关键字实参前面
ps:也可以记为,无论是形参还是实参,越短得越靠前(这个长短不是长短得长短,而是它们得复杂程度)
'''
def func(a, b):
print(a, b)
func(b=1, 2) # positional argument follows keyword argument
def func(a, b):
print(a, b)
# func(1, 2)
# func(b=1,a=2)
# func(b=1,2)
# func(2,b=1)
func(666,a=1)
函数的默认值参数
默认值形参
在函数定义阶段括号内以什么等于什么的形式填写的形参称之为默认值形参
'''
在生活中,我们经常会碰到注册一些账号的时候,有些东西我们如果不填的话,进去主页以后然后更改信息的时候会发现会有默认值,一些女性软件可能在初始的时候默认为女性,就是提前定义好,默认是这个值,如果想要别的值可进行重新定义
主要用于函数定义的阶段,就定义函数的时候就默认给予参数初始值,如果后期需要别的值也可以传入,这个时候参数的默认值将不再是原来的默认值会更改为现在你传入的值
碰到默认值参数的时候,如果不填的话就是默认的值,如果填了的话就是此时的值
参数的放置情况还是按照复杂程度从短到长放置
'''
def register(name, age, gender='male'):
print(f"""
--------infor-------
name:{name}
age:{age}
gender:{gender}
--------------------
""")
register('zhangran', 18, 'female')
register('mengmeng', 16, 'female')
register('jerry', 23)
![image-20220701193125969](https://s2.loli.net/2022/07/01/jHcFoimuJlEvR3S.png)
函数的可变长参数
可变长形参
可以打破形参与实参的个数限制,随意传值
君子协议:``*``args,**kwargs
'''
定义一个函数,无论接收多少位置实参都可以执行
*X 不是变量名,变量名是以字母数字下划线组成的
在形参中的作用:接收多余的位置参数并组织成元组的形式赋值给*后面的变量名
'''
def func(*X):
print(X)
func() # ()
func(1) # (1,) 函数中是没有位置参数的,所以它是一个对于的参数
func(1, 2) # (1, 2)
func(1, 2, 3, 4) # (1, 2, 3, 4)
'''
定义一个函数,无论接收多少关键字实参,都可以执行
**在形参中的作用:接收多余的关键字参数并组织成字典的形式赋值给**后面的变量名
'''
def func(**Y):
print(Y)
func(name='jsaon') # {'name': 'jsaon'}
func(name='jsaon',age=18) # {'name': 'jsaon', 'age': 18}
func(name='jsaon',age=18,gender='male') # {'name': 'jsaon', 'age': 18, 'gender': 'male'}
'''
能够定义一个函数,无论怎么传值都可以执行
'''
def func(*X, **Y):
print(X)
print(Y)
func() # () {} 没有位置形参也没有关键字形参,返回一个空括号,返回一个空字典
func(1) # (1,) {} 没有位置形参也没有关键字形参,但是1是位置实参,所以放到了多余的位置形参里,没有多余的关键字形参,返回一个空字典
func(1, 2) # (1, 2) {} 没有位置形参也没有关键字形参,但是1,2是位置实参,所以放到了多余的位置形参里,以元组的方式返回,没有多余的关键字形参,返回一个空字典
func(a=1) # () {'a': 1} 没有位置形参也没有关键字形参,没有多余的位置实参,返回一个空括号,a=1是多余的关键字实参,所以放到多余的关键字形参里
func(a=1, b=2) # () {'a': 1, 'b': 2} 没有位置形参也没有关键字形参,没有多余的位置实参,返回一个空括号,a=1,b=2是多余的关键字实参,所以放到多余的关键字形参里