'''
每日更新内容为10天前当天学习内容,想通过写博客的方式复习和记录,欢迎大佬提意见、纠错和萌新学习与讨论。
'''
目录
一、函数是什么,为什么要学习和使用函数
1.函数引出
# 例1 引出
print('小王的体重是%f'%140)
print('小王的身高是%f'%1.83)
print('小王的爱好是%s'%'睡觉')
print('小王的专业是%s'%'计算机')
# 多次打印出小张的信息
print('---------------------多次输出相同的信息很麻烦------------------------')
print('小王的体重是%f'%140)
print('小王的身高是%f'%1.83)
print('小王的爱好是%s'%'睡觉')
print('小王的专业是%s'%'计算机')
针对上面这种情况,每次我们打印信息都要输入这么多内容,不仅代码多麻烦,而且也很难看。
争对上面的场景 需要进一步的优化代码【方案:封装函数】
2.定义一个函数
定义一个函数:
def 函数名(参数列表) : # 0~n个参数
函数体[一系列的python语句,表示独立的功能]
函数的调用:
函数名()# 本质上就是去执行函数定义里面的代码块,在调用之前 必须先定义
def printInfo():
'''
这个函数用来打印小王个人信息
:return:
'''
#函数的代码块
print('小王的体重是%.1f'%140) # %.1f 表示保留一位小数
print('小王的身高是%.2f' % 1.83)
print('小王的爱好是%s' % '睡觉')
print('小王的专业是%s' % '计算机')
pass
# 函数的调用
printInfo() # 调用
printInfo() # 第二次调用
运行结果:
可以看到我们调用了两次函数,信息就打印了两次;要打印几次就调用几次函数就可以了,不用每次都写一长串代码。这样使代码结构更清晰,更简洁。
结论:
什么是函数:一系列python语句的组合,可以在程序中运行一次或者多次,一般是完成具体的独立的功能
为什么要使用函数:
代码的复用最大化以及最小化冗余代码,使整体代码结构清晰,问题局部化
3.带参数的函数
上面的代码我们只能打印小王的的个人信息 当我们想要打印别人的信息时就用不了。
这时候我们就需要通过传入参数来实现打印不同的信息。
# 进一步的完善需求【输出不同人的信息】 方案:通过传入参数来解决
def printInfo1(name,height,weight,hobby,pro): #形参
'''
这个函数是用来打印个人信息的
:return:
'''
#函数的代码块
print('%s的身高是%.1f' %(name,height))
print('%s的体重是%.1f' %(name,weight))
print('%s的是爱好%s' %(name,hobby))
print('%s的专业是%s' %(name,pro))
pass
# 调用带参数的信息
printInfo1('小李',189,200,'打球','计算机') #实参
print('-----------------------------------')
printInfo1('peter',175,160,'码代码','咨询师')
运行结果:
通过传入参数就可以输入不同人的信息,下面我来简单介绍一下参数的几种类型
二、 函数的参数分类
参数简介
几种类型:必选参数、默认参数[缺省参数]、可选参数、关键字参数
参数:其实就是函数为了实现某项特定的功能,进而为了得到实现功能所需要的数据 为了得到外部数据
形参和实参的区别:定义函数时括号内部为形参,调用时填入的为实参。实参和形参的区别可以参考下面这位博主的文章。
1.必选参数
# 必选参数
def sum(a,b): #形式参数:只是意义上的一种参数,在定义的时候,是不占用内存地址的
sum=a+b
print(sum)
pass
sum(20,26) #调用 20 15 为实际参数:实参,实实在在的参数,是实际占用内存地址的
# sum(15) #不能这么写 缺少必选参数会报错
运行结果为 46
必选参数在函数调用时必须写上,不然函数内部代码就会因为缺少参数而报错。
比如这里如果执行sum(15):
2.默认参数【缺省参数】
# 2.默认参数【缺省参数】
def sum1(a=20,b=30):
print('默认参数的使用=%d'%(a+b))
pass
# 默认参数调用
sum1() # 结果为50 在调用时如果未赋值,就会用定义函数时给的默认值
sum1(10) # 结果为40
sum1(15,21) #结果为36
运行结果:
我们可以看到使用默认参数做形参时,我们调用少填参数也不会报错,会按照默认参数去运行。
3.可变参数
(当参数的个数不确定时使用,比较灵活 加*号即为可变参数)
def getComputer(*args): # 可变长的参数 *args可以用别的替代但是要写*号 通常我们就写*atgs
'''
计算累加和
:param args:可变长的参数类型
:return:
'''
print(args) # 打印 观察一下参数
result=0
for item in args:
result+=item
pass
print('result=%d'%result)
pass
# 调用
getComputer(1) #args为(1,)是一个元组
print('-------------------')
getComputer(1,3) #4
运行结果:
可以看到这时参数 arg 被封装成了一个 元组
使用可变参数,我们填入变量的个数就不会收到参数类型的限制。
4.关键字可变参数
# 关键字可变参数
# ** 来定义
# 在函数体内 函数关键字是一个字典类型
def keyFunc(**kwargs): #长度为0~n个
print(kwargs) # 参数传入之后被封装成了 字典
pass
#调用
# keyFunc(1,2,3) 不可以这样传
dictA={'name1':'liu','age1':25}
keyFunc(**dictA) #实参必须是字典类型
keyFunc(name2='peter',age2=26) # 命名参数的形式也可传
keyFunc(name1='peter',age1=26) # 命名参数的形式也可传
keyFunc()
运行结果:
可以看到通过关键字可变参数传入参数,参数传入后被封装成了一个字典
5.多种参数混合使用
使用时不同类型的参数要按类型摆放!
参数顺序 必选参数->默认参数【缺省参数】->可变参数->关键字可变参数
# 多种参数混合使用 参数顺序 必选参数->默认参数【缺省参数】->可变参数->关键字可变参数
def complexFunc(a=110,*args,**kwargs):
print(a)
print(args)
print(kwargs)
pass
complexFunc(110,2,3,4,name='刘德华',msd=15)
print('-------------------------')
complexFunc(age=16) # 自动识别参数类型 自动填充
# def TestMup(**kwargs,*args): # 错误 可变参数必须放到关键字可变参数之前
# 可选参数:接受的数据是一个元组类型
# 关键字可选参数:接受的数据是一个字典类型
运行结果:
一定注意:使用时不同类型的参数要按类型摆放!
不然容意出现错误 大家可以自己尝试一下
三、函数返回值
函数返回值简介
概念:函数执行完以后会返回一个对象,如果在函数的内部有 return,就可以返回实际的值,否则返回None
类型:可以返回任意类型,返回值类型应该取决于return后面的类型
用途:给调用方返回数据 在一个函数体内可以出现多个retur值,但是肯定只能返回一个return
# 如果在一个函数体内 执行了return,就意味着函数执行完成退出了,return后面的代码语句将不会执行
函数返回值实例
程序一:返回求和结果:
def Sum1(a,b):
sum=a+b
return sum # 将计算结果返回
pass
rs=Sum1(10,30) # 将返回值赋给其他的变量
print(rs)
运行结果:40
程序二:求1~10的和
def calComputer(num):
li=[]
result=0
i=1
while i<=num:
result+=i
i+=1
pass
li.append(result)
return li
pass
# 调用函数
value=calComputer(10)
print(value,type(value)) #类型由return的类型决定
运行结果:
可以看到返回的结果由return 后面的类型决定
五、函数的嵌套调用
# 函数的嵌套调用
# 函数嵌套
def fun1():
print('--------------fun1111 start-----------------------')
print('--------------执行代码省略------------------------')
print('--------------fun1111 end--------------------------')
pass
def fun2():
print('--------------fun2222 start------------------------')
fun1() #调用第一个函数
print('---------------fun2222 end-------------------------')
pass
fun2() #调用fun2
运行结果:
在fun2中调用fun1 实现了函数的嵌套。 这个很好理解。
# 根据函数的返回值和函数的参数,对函数进行分类
不过就四种类型
# 有参数无返回值
# 有参数无返回值
# 无参数有返回值
# 无参数无返回值