一、python函数简介
![](https://i-blog.csdnimg.cn/blog_migrate/50606c1b42be50892520ced9ace55d77.png)
其实函数就类似于是一个工具,我们把他编写为一个整体,想使用时,直接调用即可
![](https://i-blog.csdnimg.cn/blog_migrate/c152d305d1144a6d195a83a25e71e1a8.png)
二、函数基础
什么是函数:一系列python语句的组合,可以在程序中运行一次或者多次,一般是完成具体的独立功能
为什么要使用函数:代码的复用最大化以及最小化冗余代码,使得整体代码结构清晰,问题局部化
函数的使用: def 函数名(参数列表):参数个数是0-n个
函数体【一系列的Python语句,表示独立的功能】
函数的调用:本质就是执行函数定义的代码块,要先定义才能使用函数
#函数的定义
def printInfo():
'''
这个函数是用来打印林然的个人信息,这样便于理解模块功能属性
:return:
'''
print('林然的年龄是%d'%18)
print('林然的学校是%s'%'湖南工商大学')
print('林然的专业是%s'%'计算机科学与技术')
pass
printInfo()#调用就直接函数名字+(),如果有参数就需要放置参数,这个知识点提早了
三、函数参数
- 参数简介
参数:其实就是函数为了实现某项功能,进而为了得到实现功能的得到的数据,【参数就是得到外部数据】
![](https://i-blog.csdnimg.cn/blog_migrate/46446dfca4cc6849f0893efbe2682a3e.png)
在上述代码中就只是输出了林然的信息,我们可以通过参数传递,让用户调用时,自己传递参数,从而1输出不同的信息
#函数的定义
def printInfo(name,age,school,major):
'''
这个函数是用来打印不同的个人信息
:return:
'''
print('%s的年龄是%d'%(name,age))
print('%s的学校是%s'%(name,school))
print('%s的专业是%s'%(name,major))
pass
printInfo('辉桶',18,'湖南中医药大学','中医药')
#调用就直接函数名字+(),如果有参数就需要放置参数
![](https://i-blog.csdnimg.cn/blog_migrate/2a17681022491fd87c954c282458864c.png)
我们调用函数时,可以挪动下鼠标,就可以看到函数的参数信息,以及功能介绍
2.参数分类
必选参数、默认参数【缺省参数】、可选参数、关键字参数
- 必选参数:
在相应位置必须放置对应的值,否则会报错
def sum(a,b):#形式参数:只是意义上的一种参数,在定义的时候是不占内存地址的
sum=a+b
print(sum)
pass
sum(20,15)#20和15就是实际参数:实参是实实在在的参数,是占内存地址的
sum()
![](https://i-blog.csdnimg.cn/blog_migrate/fe4c31fe48e50bc404fc1841cbdc2cfb.png)
- 默认参数【缺省参数】
def sum(a=10,b=20):#默认参数,当不传递参数时,a默认为10,b默认为20,
sum=a+b
print(sum)
pass
sum(20,15)#20和15就是实际参数:实参是实实在在的参数,是占内存地址的
sum()#并不会报错,在调用时如果未赋值,就好用定义函数给的的默认值10和20
![](https://i-blog.csdnimg.cn/blog_migrate/e26af04ec2e9fc5f45585c50728aaa94.png)
默认参数【缺省参数】始终存在于参数列表的尾部
'''def sum(a=10,b):#这种是错误的
sum=a+b
print(sum)
pass'''
def sum(a,b=20):#这种是正确的的
sum=a+b
print(sum)
pass
- 可选参数:
当参数的个数不确定时使用,比较灵活
一个函数有时候会处理比当初声明的参数要多,这就是不定长参数,定义函数时不用声明参数名。加了星号(*)的变量args会存放所有未命名的变量参数,args为元组;而加**的变量kwargs会存放命名参数,即形如key=value的参数, kwargs为字典。
def getcomputer(*args):
'''
:param args:可变长参数类型
:return:
'''
print(args)
print(type(args))
pass
getcomputer((1,5.6,8,9,44))
getcomputer(1)
getcomputer(2,3)
结果:我们可以看到不定长参数是一个元组类型
![](https://i-blog.csdnimg.cn/blog_migrate/71273b776c44e278d5d10b130ad76c00.png)
eg.计算累加和
def getcomputer(*args):
'''
计算累加和
:param args:可变长参数类型
:return:
'''
result=0
for item in args:
result+=item
print(result)
pass
- 关键字可变参数
采用**来定义,在函数体内,关键字参数是一个字典类型,Key是一个字符串
def keyFun(**kwargs):
'''
**来定义
在函数体内,关键字参数是一个字典类型,key是一个字符串
:param kwargs: 关键字可变参数
:return:
'''
print(kwargs)
pass
#调用
dictA={'name':'林然','age':35}
#当我们传递字典对象时,需要加上**
keyFun(**dictA)
#或者直接通过键值对来传递
keyFun(name='peter',age=20)
#不传,也就是空字典
keyFun()
![](https://i-blog.csdnimg.cn/blog_migrate/e5bcb75a50cffdc47b5dfddc6df49994.png)
- 可选参数与关键字可选参数混合使用
def complexFun(*args,**kwargs):
'''
可选参数必须放到关键字可选参数之前
可选参数是一个元组类型,
关键字可选参数是一个字典类型
:param args:
:param kwargs:
:return:
'''
print(args)
print(kwargs)
pass
complexFun()
complexFun(1,3,4,name='Linran',age=18)
complexFun(name='Linran',age=18)
#他会自动识别是否是字典类型,遇到字典类型时,他会将内容放置kwargs
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/b85584b41628ca8593e9a41509936d43.png)
四、函数返回值
概念:函数执行完以后会返回一个对象,如果在内部有return 关键字,就可以返回实际的值【可以是任何类型,】,否则会返回一个空值,
返回类型:返回值类型取决于return后面的类型
用途:给调用方返回数据
在一个函数体可以出现多个return关键字,但是肯定只能返回一个return
r如果在函数体执行了return,那么就代表函数执行结束
![](https://i-blog.csdnimg.cn/blog_migrate/f1e84decf0dede1ce967661d741e67c8.png)
def sum(a,b):
sum=a+b
return sum#将计算结果返回
print(sum(10,20))#返回值返回到调用的地方
rs=sum(4,5)#将返回值赋值给其他变量
print(rs)
def calcomputer(num):
'''
计算累加和
:param num:
:return:
'''
result=0
i=1
while i<=num:
result+=i
i+=1
pass
return result
value=calcomputer(10)
print(value)
print(type(value))
返回元组类型:返回多个值
def returnTuple():
return 1,2,3,4
res=returnTuple()
print(res)
print(type(res))
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/8680fab38324062f7cb0e5b89374152c.png)
五、函数嵌套调用
def fun1():
print("第一个函数")
pass
def fun2():
fun1()
print("第二个函数")
pass
fun2()#函数2会调用函数1,然后再执行2之间的代码块
六、总结
![](https://i-blog.csdnimg.cn/blog_migrate/7a9c3d0aa2bbaf1f82d6207a2d934790.png)
七、课后作业
写函数,接收n个数字,求这些参数数字的和
写函数,找出传入的列表或元组的下标奇数位对应的元素,并返回一个新的列表
写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。PS:字典中的value只能是字符串或列表
八、作业答案
eg1:
def sum(*args):
'''
#写函数,接收n个数字,求这些参数数字的和
思路:个人思路采用可选参数,也就是不定长参数进行实现
代码千千万,适合最重要
:param args:
:return: 返回用户传递过来的参数之和
'''
result=0
for i in args:
result+=i
pass
return result
print(sum(1,2,3,4,5))
eg2
def list_fun(li_or_tup):
'''
#写函数,找出传入的列表或元组的下标奇数位对应的元素,并返回一个新的列表
个人思路:传递列表或者元组后,利用列表或元组【序列】的Index函数去判断是否是奇数位
:param li:
:return:
'''
new_li=[]
for i in li_or_tup:
if(li_or_tup.index(i)%2==1):
new_li.append(i)
return new_li
li=list(range(20))
new_list=list_fun(li)
print(new_list)
tupleA=tuple(range(40))
new_list=list_fun(tupleA)
print(new_list)
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/a535794bc398293df15ad693f7972065.png)
eg3
def check_dict(**dictA):
'''
写函数,检查传入字典的每一个value的长度,如果大于2,
那么仅保留前两个长度的内容,并将新内容返回给调用者。
PS:字典中的value只能是字符串或列表
个人思路:利用关键字可选参数,传入字典,然后通过循环遍历,判断
value长度大于2,是则利用切片处理,因为字符串和列表都是序列
:param dictA:
:return:
'''
for key,value in dictA.items():
if(len(value)>2):
new_value=value[0:2]
dictA[key]=new_value
return dictA
dictA={'name':'linran','age':[1,2,3,4]}
dictB=check_dict(**dictA)
print(dictB)
结果:
![](https://i-blog.csdnimg.cn/blog_migrate/21453b5f165226faee8705830c5ee683.png)