函数的定义
Python的函数定义使用关键字def,如定义一个返回绝对值的函数my_abs
1 2 3 4 5 | def my_abs(x): if x> = 0 : return x else : return - x |
函数调用
参数错误
如果在调用函数时,传给函数的参数增多或减少,python解释器都会检查出来
TypeError:提示my_abs()只需一个参数,但是调用时给了两个
虽然python解释器能检查到参数个数的变化,但当给函数一个非法类型的参数时,就无法准确检测到
解释器虽然给出了错误,但是没有定义具体是哪种错误
参数类型检查
python提供了内置函数isinstance()来判断参数的数据类型
1 2 3 4 5 6 7 | def my_abs(x): if not isinstance (x, ( int , float )): raise TypeError( 'wrong type......' ) if x > = 0 : return x else : return - x |
改写了my_abs函数后,如果传参不是int或float类型,则会报错并给出错误信息'wrong type'
函数的参数
python的函数定义虽然相对简单,但是参数种类非常灵活。如正常的必须参数,还有默认参数、可变参数以及关键字参数
位置参数
即必须参数,在传参时按照函数定义的顺序赋给函数
1 2 3 4 5 6 | def power(x, n): s = 1 while n > 0 : n = n - 1 s = s * x return s |
定义一个函数power()来求x的n次方,在调用时根据函数定义的顺序传参。不同的位置顺序得到不同的结果
默认参数
同其他编程语言一样,python在定义函数时可通过设置默认参数来避免因某些参数没有传入而导致的错误
如power(x, n),如果没有传入参数n则会引起错误
解释器提示power()缺少一个必须的参数n。来使用默认参数来改进一下power函数
1 2 3 4 5 6 | def power(x, n = 2 ): s = 1 while n > 0 : n = n - 1 s = s * x return s |
两种形式的函数调用都能正常运行,这正是因为默认函数的作用。当参数都给全时,函数按照给定的参数进行运算;当参数n未传入时,函数按照设置的默认参数进行运算
可变参数
可变参数即参数的个数是可变的,在定义函数时,无需一个一个的给定
1 2 3 4 5 | def add( * numbers): sum = 0 for n in numbers: sum = sum + n return sum |
定义一个add函数用来计算参数的和
通过可变参数,我们可以传入任意个参数来调用函数进行运算
关键字参数
不同于可变参数,关键字参数允许传入0或任意个含参数名的参数,这些关键字参数在函数内部自动组合成dict
1 2 | def student(name, age, * * args): print ( 'name: ' , name, 'age: ' , age, 'other: ' , args) |
**args:代表传入的是关键字参数
命名关键字参数
上述student函数可以接收除name,age外的任意参数,但是如果需要限制接收的参数就要用到命名关键字参数
假设对于student信息还只需要一个city信息,可以改写student函数如下
1 2 | def student(name, age, * , city): print (name, age, city) |
运行结果如下
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错
函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了,如
1 2 | def student(name, age, * args, city): print (name, age, args, city) |