函数******
首先为了认识函数,我们研究之前用过的一个python里的内置函数len()
例子:
s1 = "hello world" print(len(s1)) #这是用内置函数len()来计算s1字符串的长度
如果说现在有一个需求:不允许你用len()这个方法来计算他的长度。那我们会用什么方法呢?
s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #采用for循环来迭代出其中的值,迭代一次加一次次数,最后打印次数
我们通过for循环很好的算出了此字符串的长度,好了,现在我们又需要你计算另外一个字符串的长度比如说 s2 = 'zzps686'
我们可以按照同样的方法来做:
s2 = "zzps686" length = 0 for i in s1: length = length+1 print(length)
很棒,我们又一次完成了。现在我们来想一想,相比于python中内置函数len()来说的话,我们这种方法在面对大量的字符串时是不是需要重复写很多的相同代码?
如果我们把这些代码放在一起,每次想用的时候把他拿出来是不是就很好了?
下面我们就需要利用函数
函数的初识(定义与调用)
按照之前我们写的例子把他包成一个函数
#函数定义 def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函数调用 mylen()
总结一:
定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
def 是固定的,不能变,必须是连续的def三个字母,不能分开。。。它们要相亲相爱的在一起。
空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。
函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能
括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
调用:就是 函数名() 要记得加上括号。
函数的参数与返回值
上面我们定义了一个函数,但是在面对多个字符串时,我们同样解决不了一个问题,每次计算一个新字符串的长度时都要重新改函数里面的变量名
那这样我们的函数就没有多大的意义了。因此我们需要参数与返回值
return
def mylen(): """计算s1的长度""" s1 = "hello world" length = 0 for i in s1: length = length+1 return length #函数调用 str_len = mylen() print('str_len : %s'%str_len)
return关键字的作用
return 是一个关键字,在pycharm里,你会看到它变成蓝色了。你必须一字不差的把这个单词给背下来。
这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”
要研究返回值,我们还要知道返回值有几种情况:分别是没有返回值、返回一个值、返回多个值
一旦遇到return,结束整个函数**********
没有返回值
不写return的情况下,会默认返回一个None:我们写的第一个函数,就没有写return,这就是没有返回值的一种情况。
return 返回的是任意类型。可以返回一个值,同样也可以返回多个值。返回多个值,当返回多个值时是当作元组来接收的。
函数参数
实参与形参
参数还有分别:
我们调用函数时传递的这个“hello world”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。
定义函数时的s1,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
传递多个参数
参数可以传递多个,多个参数之间用逗号分割。
def mymax(x,y): the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma)
我们接下来研究参数站在两个角度去研究 分别是实参和形参
站在实参角度
1.按照位置传值
def mymax(x,y): #此时x=10,y=20 the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma)
2.按照关键字传值
def mymax(x,y): #此时x = 20,y = 10 print(x,y) the_max = x if x > y else y return the_max ma = mymax(y = 10,x = 20) print(ma)
3.位置、关键字形式混着用(混合参数)
def mymax(x,y): #此时x = 10,y = 20 print(x,y) the_max = x if x > y else y return the_max ma = mymax(10,y = 20) print(ma)
重点啊:位置参数一定要在关键字参数的前面
站在形参角度(对于一个形参只能赋值一次)
1.位置参数
实参传的值一定要与形参的一一对应,而且位置参数必须传值
2.关键字参数
不需要位置要相对应
默认参数
将变化比较小的值设置成默认参数
1.默认参数的定义
def stu_info(name,sex = "male"): """打印学生信息函数,由于班中大部分学生都是男生, 所以设置默认参数sex的默认值为'male' """ print(name,sex) stu_info('alex') stu_info('eva','female')
2.参数陷阱:默认参数是一个可变数据类型
def defult_param(a,l = []): l.append(a) print(l) defult_param('alex') defult_param('egon') #['alex'] #['alex', 'egon'] 这是结果 #如果我们想按照我们的想法去传参就是 defult_param('alex',[]) defult_param('egon',[]) #['alex'] #['egon'] 得到的是这个结果
动态参数
按位置传值多余的参数都由args统一接收,保存成一个元组的形式
def mysum(*args): the_sum = 0 for i in args: the_sum+=i return the_sum the_sum = mysum(1,2,3,4) print(the_sum)
def stu_info(**kwargs): print(kwargs) print(kwargs['name'],kwargs['sex']) stu_info(name = 'alex',sex = 'male')
站在调用函数传递实参的角度 实参的个数不固定的情况
也就意味形参也不固定
站在形参的角度 可以用*和**来接收多余的(溢出的)位置参数和关键字参数
1.*
站在形参的角度 看 *
形参中的*会将多余的(溢出的)位置实参 统一用元组的形式处理 传递给*后面的形参名
def func(x,y,*z): print(x,y,z) # z = (3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8) func(1,2,3,4,5,6,7,8,54,43,4,5,6,6,7,8,)
站在实参的角度 看 *
def func(x,y,z): print(x,y,z) l = [1,2,3] a,b,c = l func(a,b,c) func(*[1,2,3,4,5,6]) # *会将列表打散成位置实参一一传入等价于func(1,2,3,4,5,6) func(*(1,2,3)) # 等价于func(1,2,3) def func(x,*z): print(x,z) func(1,*{1,2,3}) # *在形参中只能接收多余的位置实参 不能接收关键字实参
*只能将列表 元组 集合 字符串
*的内部你可以看成是for循环
2,**
站在形参的角度看 **
def func(x,y,**z): print(x,y,z) # z = {'z': 1, 'a': 1, 'b': 2, 'c': 3} func(x=1,y=2,z=1,a=1,b=2,c=3)
**会接收所有多余的关键字参数 并将关键字参数 转换成字典的形式 字典的key就是关键字的名字
字典的value就是关键字的名字指向的值 将字典交给**后面的变量名
站在实参的角度看 **
def func(x,y,z): print(x,y,z) func(12,3,4) func(x=1,y=2,z=3) d = {'x':1,'y':2,'z':333} func(x=1,y=2,z=3) func(**d) # 等价于func(x=1,y=2,z=333)
**会将字典拆封成 key = value的形式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!