调用函数
python有很多内置函数,我们可以直接调用,详见python官方文档:内置函数 — Python 3.11.2 文档,也可以在命令行中输入help(函数名)来查看该函数的使用法则。
函数名的本质就是指向一个函数对象的引用,完全可以用赋值的方法为原函数起一个别名:
a=abs//给abs函数起一个别名a
print(a(-12))//使用a来代替abs实现其功能
'''
12
'''
定义函数
定义函数的格式
def my_first_hanshu(x,y,z):
if x==8 and y==8 and z==8:
print('Crush')
else:
print('Pity')
return
#以下为试用自定义的函数1
my_first_hanshu(8,8,8)
'''
Crush
'''
总之,定义语句要以def开头,接下来就是函数名和参数列表,参数不需要声明数据类型,注意要使用return语句。
空函数
若要定义一个功能暂时没想好的函数,可以用pass语句:
def non():
pass
这样让pass先代替函数体,使得该函数被调用时,程序可以正常运行;
此外,pass语句还可以用于条件语句和循环语句中。
参数检查
对于自定义函数,当传入不恰当的参数时,系统不会像内置函数一样返回出错信息,所以要在自定义的函数体的开端使用内置函数isinstance()和错误提示语句raise,实现数据类型的检查:
def my_first_hanshu(x,y,z):
if not isinstance(x,int) and not isinstance(y,int) and not isinstance(z,int):
raise TypeError('bad operand type')
if x==8 and y==8 and z==8:
print('Crush')
else:
print('Pity')
返回多个值
函数需要返回多个值时,只要把值都写在同一个return语句后即可,会返回一个元组tuple,里面包含了多个值,可以将tuple通过一个赋值号赋值给多个变量,系统会按位置一一赋值。
import math
def ma(x):
return math.ceil(x),math.floor(x)
a,b=ma(1.123)
print(a,b)
'''
2 1
'''
函数的参数
位置参数
def power(a,b):
s=1
while b>0:
b-=1
s*=a
return s
上面的power函数中有两个位置参数a和b,调用函数时,传入的两个值按位置顺序依次赋值给参数a和b。
默认参数
上面定义了新的power函数后,原来power函数使用一个参数计算平方的功能就用不了了,这时可以修改一下原定义,直接在参数列表中给b赋值为2,这样如果调用函数时只写了一个参数,那就默认参数b为2:
def power(a,b=2):
s=1
while b>0:
b-=1
s*=a
return s
需要注意的是,默认参数必须放在参数列表的后端,可以有多个默认参数;
默认参数必须指向不变对象,比如列表也可以作为默认参数,但每次调用后,若对列表进行了增减删改,则其在下一次调用时就变化了。
可变参数
可变参数,即传入的参数个数是可变的,可以是0个或任意个。
在不使用可变参数时,若需要传入不定个数的值,则函数参数应为列表或元组:
def calc(numbers):
sum=0
for n in numbers:
sum+=n
return sum
calc([1,2,3,4,5,6,7,8,9])
calc((9,8,7,6,5,4,3,2,1))
若使用可变参数,只需在参数前加上*:
def calc(*numbers):
sum=0
for n in numbers:
sum+=n
return sum
calc(1,2,3,4,5,6,7,8,9)#不需要数据写成list或tuple
list=[11,22,33,44,55]
calc(*list)#在列表名前加*,就可以将列表的所有元素作为可变参数传进去
关键字参数
可变参数允许传入任意个参数,这些参数在函数调用时自动组装为一个元组;
关键字参数则允许传入任意个含参数名的参数,这些关键字参数在调用时自动组装为一个字典:
def person(name,age,**other):#前两个参数为必选参数;other为关键字参数,调用时可以不传入
print('name:',name,'age:',age,'other:',other)
#可以只传入必选参数:
person('Tom',18)
'''
name:Tom age:18 other:{}
'''
#可以再传入一个关键字参数:
person('Bob',19,homeland='USA')
'''
name:Bob age:19 other:{'homeland':'USA'}
'''
#可以传入多个关键字参数:
person('Eric',18,homeland='China',gender='M')
'''
name:Eric age:18 other:{'homeland':'China','gender':'M'}
'''
同样,若有给定一个字典dict,可以在调用person函数时,在关键字参数的位置上写**dict,就会将dict的内容放入other中。
命名关键字参数
若单独使用一个关键字参数标志**other,则可传入的关键字参数的数量和类型没有限制;
若要限制关键字参数的名字,就可以用命名关键字参数,使用特殊分隔符*,其后的参数被视为命名关键字参数:
def person(name,age,*,homeland,gender):
print(name,age,homeland,gender)
#调用如下:
person('Jack',23,homeland='UK',gender='M')
'''
Jack 23 UK M
'''
命名关键字参数可以有默认值,从而简化调用:
def person(name,age,*,homeland='China',gender):
print(name,age,homeland,gender)
#调用如下:
person('Tom',11,gender='M')
'''
Tom 11 China M
'''
参数组合
在python中定义函数,参数定义的顺序必须是:必选参数、默认参数、可变参数、关键字参数和命名关键字参数.
递归函数
函数自己调用自己就是递归。
典例:汉诺塔问题