函数简介
# s = 'heelowold' # print(len(l)) # len不能用了,然后求列表的长度 # 定义一个计数器 def my_len(): n = 0 for i in l: n += 1 # print(n) return n print(my_len()) """ 目前的问题: 1. 我们现在所写的代码冗余度比较高,需要写重复代码 2. 目前写的代码兼容性太差了 函数:函数就类似于是一个工具箱,什么时候使用什么时候拿到就用 内部封装了一些功能,哪里需要就在哪里使用 """
函数的语法结构
def my_len(a, b): '''函数注释''' # 函数体 return '123' """ 1. def 就是定义函数的关键字,它不能够省略,必须写 2. my_len():函数名,函数名的命名遵循变量的命名规范,他也是必填的,不能省略的,括号不能省略 3. a, b称为是函数的参数,是可选的,可有可无 参数就是执行函数的一些前提条件 4. '''函数注释''' 注释不参与函数的执行,只起到函数功能的提示作用,以及各个参数是什么意思 # 可有可无的,但是,推荐每个函数都加上函数注释 5. # 函数体 才是函数的核心,它是函数所具备的核心功能,应该是必须有的,pass 没有函数体的函数是没有意义的函数,一般情况都是要有函数体的 6. 返回值 return 函数的返回值 # 返回值也是可选的,可以有返回值,也可以没有返回值,但是一般情况下都要有返回值 # 一个函数只能有一个返回值... """
函数的定义与调用(重点)
************************************************************************************** 1. 函数必须先定义后调用,没有定义函数是一定不能够调用的 2. 函数在定义阶段,只检测语法是否错误,不检测逻辑是否有问题 3. 逻辑上的错误只会在调用阶段检测 4. 函数一定是被调用之后才会执行函数内部的代码块,不调用函数一定不会执行函数的 # 如何调用函数 函数名() # 只要函数名加括号一定会执行函数体代码 函数如果在定义阶段有参数,那么,在调用的时候,连参数一块写上 ************************************************************************************** 函数调用的内部原理: 1. 先在内存空间中申请一块空间地址来存储函数体代码 2. 把函数名和函数体所在的空间地址绑定在一起 3. 以后只需要通过函数名()来访问函数体代码即可
函数的分类
1. 内置函数 # Python解释器中原本就存在的,可以直接拿来使用,无需定义,直接调用 len print input 之前学习的数据类型的各个方法 2. 自定义函数 # 程序员自己写的函数,就必须先定义后调用 1. 无参函数:函数在定义阶段没有参数 def my_len(): pass my_len() 2. 有参函数:在函数定义阶段有参数的存在 def my_len(a, b): pass my_len(1, 2) 3. 空函数 def my_len(): pass """作用就在于可以帮助我们梳理业务逻辑""" def register(): pass def login(): pass def address(): pass def order(): pass
函数的返回值
关键字:return
def home():
print(123)
return 1, 2, 3
res = home() # 把home函数执行之后返回的结构赋值给res变量
print(res)
"""
1. 每一个函数不行必须要有返回值的,可有可无
2. 当函数中没有return关键字,那么,函数的返回结果是什么?
3. 只有是return关键字后面的数据才是函数的返回结果
4. 一个函数中只能有一个return关键字,函数体体代码只有遇到return直接退出
5. return后面可以返回值多个值,逗号隔开,以元组的形式返回
"""
函数参数的两大分类(形参、实参)
形式参数
函数在'定义阶段'括号中定义的'变量名'就是形式参数,简称'形参'
def index(a, b):
pass # a,b 就是形参
实际参数
函数在'调用阶段'括号中写的'变量值'就是实际参数,简称'实参'
def index(a, b):
pass
index(1, 2) # 1, 2就是函数的实参
"""
形参和实参的关系
简单理解为把形参名=实参值-----------》变量名=变量值的形式来看
形参和实参是在函数调用阶段临时绑定,函数调用结束的时候,两者断开
"""
位置参数
位置参数
函数在括号中从左往右依次写入的参数就是位置参数
def index(a, b, c):
pass
位置形参
在函数定义阶段括号中从左往右依次写入的变量名就是位置形参
def index(a, b, c):
pass
# a,b,c就是位置形参
位置实参
在函数调用阶段括号中从左往右依次传入的变量值就是位置实参
index(1, 2, 3)
# 1, 2, 3称为是位置实参
"""位置参数的特点:形参和实参是一一对应的"""
def my_max(a, b):
print(a, b)
if a > b:
return a
return b
2. 调用函数
'''位置参数传递,实参个数少一个不行', 实参个数多一个也不行,参数的个数必须要一一对应'''
res = my_max(10, 2,) # 2 10
print(res)
my_max(y=10, x=20, b=1, a=2) # 指名道姓的传递
res = my_max(b=1, 2) # 不可以,位置参数不能够放在关键字的后面
res = my_max(2,b=1) # 可以,位置参数不能够放在关键字的后面
res = my_max(a=1,2) # 可以,位置参数不能够放在关键字的后面
res = my_max(2,a=1) # 不可以,位置参数不能够放在关键字的后面
'''位置参数不能够放在关键字参数的前面!!! 越短的越靠前'''
关键字实参:可以打破按照顺序传递参数的规则
特点:严格按照变量名=变量值的形式一一传递
默认参数(默认形参,没有默认实参)
定义:
在函数定义阶段已经给形参赋予了变量值
1. 如果你在函数定义的时候,给形参赋予值之后,调用函数的时候,实参如果你没有给,就使用默认的
2. 如果你在函数调用的时候,给了值,就使用你给的值,不在使用默认的
# 让你写一个注册用户的函数
def register(name, age, gender='male'):
print("name:%s, age:%s, gender:%s" % (name, age, gender))
register('j', 21)
register('k', 22, 'female')
"""
1. 函数在定义阶段,给的默认值直接就定死了,后续不会在改变
2. 根据变量名和变量值在内存中得关系来理解
"""
可变长参数
1. 无论我传入多少个位置参数,函数都能够正常的被调用?
'''
*号在形参中的使用:它会接收多余的位置参数,然后组装成元组的形式赋值给*号后面的变量名
'''
def index(x, y, m, n, *a):
print(x, y, m, n, a)
index(1, 2, 3, 4, 5, 6, 7)
2. 无论我们传入多少个关键字参数,函数都能够被正常的调用?
'''
**号在形参中得使用:会接收多余的关键字参数,并且组装成字典的形式赋值给**号后面的变量名
'''
def index(x, y, q, z, **a):
# print(a)
print(x, y, a)
index(x=1, y=2, m=3, n=4, z=5)
'''补充:
*和和**号后面的变量名可以随便叫
但是嫩:在Python中,推荐使用*args **kwargs
args:arguments 位置参数
kwargs: keywords arguments 关键字参数
'''
# 3. 无论我传入多少个位置参数和关键字参数,函数都能够被正常调用
def index(a, b, c=1, *args, **kwargs, ):
print(args)
print(kwargs)
index(1, 2, 3, 4, x=10, y=20, z=30)
# 4. 可变长参数(*和**号)在实参中得使用(重要)
**号在实参中得使用
def index(x, y, a, b,):
print(x, y)
'''
**号在实参中得使用:会把字典打散成关键字的形式当成实参传递
'''
def index(**kwargs):
print(kwargs)
命名关键字参数(了解)
'''
命名关键字传参:在形参中会出现*的用法,如果出现在*号后面的形参,那么,实参传递的时候,必须以关键字的形式传递
'''
def register(name,age,*,sex,height,salary): #sex,height为命名关键字参数
pass
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术