函数
一、函数的定义:
指在程序中创建一个独立的代码块,用于完成特定的任务或执行特定的操作。函数通常接收输入参数,并返回输出结果。通过定义函数,可以将复杂的程序分解成更小的模块,提高代码的可读性和可维护性。
二、函数的定义规则
1、函数代码块以 def 关键词开头,后接函数名称和圆括号 ()
2、如果需要传入参数(变量),可在圆括号内定义
3、函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明
4、函数内容以冒号 : 起始,并且缩进
5、可选择性地使用return返回一个值给调用方,不 return 相当于返回 None
6、在Python中不需要定义返回值类型,可自动推断
def
是定义函数的关键字,后面是函数名和参数列表,然后是冒号和缩进的函数体。return
语句用于返回结果,可以省略,如果没有返回值,则函数默认返回 None
。
函数定义后,可以通过函数名来调用函数,并传递相应的参数。调用函数会执行函数体中的代码,将返回结果返回给调用处。
例如:计算圆的面积
1、首先要知道圆的面积公式S=pi*r*r,当知道半径r的值时,就可以根据公式计算出面积,假设需要计算3个不同大小的圆的面积:
PI=3.1415 #常量在def的上部分定义
def area_of_circle(r): #r为函数的必选参数
S=PI * r * r
return S
if __name__ == '__main__':
s1=area_of_circle(4) #调用函数名,括号内写入参数
s2=area_of_circle(5)
s3=area_of_circle(6)
print(s1,s2,s3)
即当直接填入参数即可获取圆的面积,并且最好在定义函数的上部分定义常量。
3、函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段
4、函数能提高应用的模块性,和代码的重复利用率
5、Python提供了许多内建函数,比如print()、type()、类型转换函数等等
6、用户也可以自己创建函数,这被叫做用户自定义函数
三、函数的参数 (必选参数、默认参数、可变参数、关键字参数和命名关键字参数)
定义函数的时候,需要把参数的名字和位置确定下来,函数的接口定义就完成了,对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,除定义的必选参数外,还可使用默认参数、可变参数、关键字参数和命名关键字参数,且必须按照以上的前后顺序填入def定义的函数后的括号内。
1、必选参数
又名位置参数,调用函数时必须按顺序提供,不多不少
2、默认参数
def power(x,n): #其中x为必选参数,n为默认参数
s=1
while n>0:
s=s*x
n=n-1
return s
if __name__ == '__main__':
print(power(5, 2))
也可以这么写:
def power(x,n=3):
s=1
while n>0:
s=s*x
n=n-1
return s
if __name__ == '__main__':
print(power(5, 2))
其结果同上,但是如果在最后一条代码中没有给出2,直接写的print(power(5)),那么打印结果就是5的3次方了。
3、可变参数(用*号+参数表示)
def calc(lt):
summ=0
for i in lt:
summ=summ+i**2
return summ
if __name__ == '__main__':
print(calc([1, 2, 3, 4]))
有可变参数的代码:
def calc(*lt):
summ=0
for i in lt:
summ=summ+i**2
return summ
if __name__ == '__main__':
calc(1,2,3,4)
print(calc(1,2,3,4))
二者看起来相差不大,但是在使用的时候不用再定义列表、元组等数据类型,直接输入可变参数的多组数据即可使用。
4、关键字参数(两个*号+参数名, 一般传入时需要带入参数名称 以字典的形式接收)
可变参数允许传入0个或任意个参数,可变参数在函数调用时自动组装为一个tuple,而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict,示例如下:
def person(name,gender,age,*args,**kwargs):
return name,gender,age,args,kwargs
if __name__ == '__main__':
print(person('小美', 'man', '18', 10, 20,heigh=180, weight=70))
其中*arg是可变参数,其输入的值为10和20,以元组的形式输出,**kwargs是关键字参数,以字典的形式输出
5、命名关键字参数
函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查
命名关键字参数函数调用方式如下:
以person()函数为例,希望检查是否有city和job参数,则需要手动判断:
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错
如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
6、参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用
注意参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
例如:
def person(name,gender,age,*args,job,city,**kwargs):
return name,gender,age,args,kwargs,job,city
if __name__ == '__main__':
print(person('小美', 'man', '18', 10, 20,heigh=180, weight=70,job='AI',city='Hefei'))
其输出结果为:
四、递归函数
函数内部可以调用其他函数,如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数需要满足两个条件:自己调用自己、有停止条件
例如:
计算n的阶乘,即n! = n * ( n - 1 ) * ( n - 2 ) * ( n - 3 ) *......* 3 * 2 * 1,通过循环实现代码逻辑稍微复杂,该需求可使用递归函数
def jiech(n):
if n==1:
return 1
return n*jiech(n-1)
if __name__ == '__main__':
print(jiech(10))
即当需要打印10 的阶乘时,第一步运行到 return n*jiech(n-1)这一步,然后返回jieba(n-1),然后继续调用函数,继续从头再来计算从9开始的阶乘,以此类推,直到运行到1的阶乘时返回1,然后再把通过 return n*jiech(n-1)的值全部返回到def jiech(n),然后就能打印出来了