python学习笔记
今日内容概要
- 函数的本质
- 函数的语法结构
- 函数的定义与调用
- 函数的分类
- 函数的返回值
- 函数的参数
今日内容详细
函数的本质
函数可以看成是工具
提前定义好,之后可以反复使用
举例说明有函数和没有函数的区别
没有函数(没有工具)
每次使用某个工具的时候都需要现场制作
有函数(有工具)
提前准备好工具,用的时候直接使用即可
注意:函数必须要先定义,之后才能使用
# 函数的定义(提前准备工具的过程)
def my_func():
pass
# 函数的使用(开始选择工具并使用)
my_func() # 使用函数,我们更加习惯说成调用函数,函数调用
函数的语法结构
def 函数名(参数1,参数2):
'''函数注释'''
函数体代码
return 返回值 # 返回值支持python语言所支持的任何对象
1.def
是定义函数的关键字
2.函数名
与变量名的命名一致,尽量做到见面知意
3.括号
在定义函数的时候函数名后面必须跟括号
4.参数
定义函数括号内可以写参数(个数不固定),也可以不写参数
用于接收外界传递给函数体代码内部的数据
5.函数注释
类似于说明书,用于介绍函数的主体功能和具体用法
6.函数体代码
整个函数最核心的区域(逻辑代码)
7.return
控制函数的返回值
ps:调用函数之后返回值如何理解
使用函数之后有没有相应的反馈
函数的定义与调用
1.函数必须先定义后使用
定义函数的代码必须要在调用函数的代码之前先运行即可
2.定义函数使用def关键字,调用函数使用函数名加括号(可能需要添加额外的参数)
3.函数在定义阶段只检测函数体代码语法,不执行函数体代码
只有在调用阶段才会真正的执行函数体代码
4.函数名到第是什么东西
函数名绑定的是一块内存地址,里面存放了函数体代码
要想运行该代码,就需要调用函数,函数名加括号
函数名加括号执行优先级最高(定义阶段除外)
def foo():
pass
print(foo())
输出:
None
函数的分类
1.内置函数
解释器提前帮你定义好的函数,用户可以直接调用
len()
内置函数可以直接调用
但是数据类型的内置方法(函数)必须使用数据类型点的方式才可以调用
相当于是数据类型独有的一些内置方法
2.自定义函数
1.空函数
函数体代码使用pass顶替,暂时没有任何功能
主要用于前期的项目搭建,提示主要功能
def run():
pass
2.无参函数
函数定义阶段括号内没有填写参数
def func():
print('from func')
ps:无参函数直接函数名加括号即可调用
3.有参函数
函数定义阶段括号内填写参数
def func(a, b):
print('from func')
ps:有参函数调用需要函数名加括号并且给数据值
函数的返回值
返回值就是调用函数之后产生的结果,可有可无
获取函数返回值的方式是固定的
变量名 = 函数()
上述方式有则获取,没有则默认接收None
1.函数体代码没有return关键字:默认返回None
def func():
print('from func')
res = func()
print(res) # None
2.函数体代码有return关键字:后面不写,也返回None
def func():
print('from func')
return
res = func()
print(res) # None
3.函数体代码有return关键字:return后面写什么就返回什么(如果是数据值则直接返回,如果是变量则需要找到对应的数据值返回)
def func():
print('from func')
return 666
res = func()
print(res) # 666
def func():
print('form func')
name = 'jason'
return name
res = func()
print(res) # jason
4.函数体代码有return关键字并且后面写了多个数据值(名字)逗号隔开:默认情况下会自动组织成元组返回
def func():
return 1, 2, 3, 4
res = func()
print(res) # (1, 2, 3, 4)
def func():
return [1, 2, 3, 4]
res = func()
print(res) # [1, 2, 3, 4]
def func():
return [1, 2, 3, 4],{'name':'jason'},123
res = func()
print(res) # ([1, 2, 3, 4], {'name': 'jason'}, 123)
5.函数体代码遇到return关键字会立刻结束函数体代码的运行
def func():
print('我在上面')
return 123 # 直接结束
print('我在下面')
func() # 我在上面
函数的参数
参数有两大类
1.形式参数
函数在定义阶段括号内填写的参数,简称为'形参'
2.实际参数
函数在调用阶段括号内填写的参数,简称为'实参'
形参与实参关系:
形参相当于是变量名
实参相当于是数据值
在函数调用阶段形参会临时与实参进行绑定,函数运行结束立刻解除(动态绑定,动态解除)
位置参数
1.位置形参
在函数定义阶段括号内从左往右依次填写的数据值称之为位置形参
2.位置实参
在函数调用阶段括号内从左往右依次填写的数据值称之为位置实参
ps:1.实参可以是数据值也可以是绑定了数据值的变量名
2.给位置形参传值得时候必须个数一致,多一个不行,少一个也不行
def reus(x,y,z): #x y z是3个形参
print(x)
print(y)
print(z)
reus(1,2,3)#因为形参是三个,所以实参也得是3个,得一一对应,不然就会报错
输出结果:
1
2
3
关键字参数
关键字实参
在函数调用阶段括号内以什么等于什么的形式传值称之为关键字实参
ps:1.指名道姓的给形参传值(打破了位置的限制)
2.位置实参必须在关键字实参的前面
小诀窍:无论是形参还是实参,都遵循短的(简单的)在长的(复杂的)前面
3.同一个形参在一次调用中只能传一次值
def func(a, b):
print(a, b)
func(1, 2) # 1,2
func(b=1,a=2) # 2,1
func(b=1,2) # 报错(没有遵循少的在多的前面)
func(2,b=1) # 2,1
func(666,a=1) # 报错(没有遵循一个形参在一次调用中只能一次值)
默认值参数
默认值形参
在函数定义阶段括号内以什么等于什么的形式填写得到形参称之为默认值形参
def register(name, age, gender='male'): # 默认gender的值为male
print(f"""
-------------info-----------
name:{name}
age:{age}
gender:{gender}
----------------------------
""")
register('jason',18) # name=jason,age=18,gender=male
register('oscar',28) # name=oscar,age=28,gender=male
register('jerry',38) # name=jerry,age=38,gender=male
register('lili',18,'female') # name=lili,age=18,gender=female
"""
1.在函数定义阶段就给形参绑定值,后续调用阶段就可以不传
2.调用阶段不传值就使用默许的,传了就用传了的
ps:还需要遵循前面总结的规律(简单的在左边,复杂的在右边)
"""
可变长参数
可变长形参
可以打破参与实参的个数限制,随意传值
def func(*x):
print(x)
"""
*在形参中的作用
接收多余的位置参数并组织成元组的形式赋值给*后面的变量名
"""
def func(**y):
print(y)
func() # {}
func(name='jason') # {'name': 'jason'}
func(name='jason',age=18) # {'name': 'jason', 'age': 18}
func(name='jason',age=18,hobby='read') # {'name': 'jason', 'age': 18, 'hobby': 'read'}
"""
**在形参中的作用
接收多余的关键字参数并组织成字典的形式赋值给**后面的变量名
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了