想必大家对于函数并不陌生,下面就让我们一起来看一看怎么编写自己的函数吧。
def my_compare( a , b ):
if a > b:
print( 'The max is %s' %a );
else:
print( 'The max is %s' %b );
fun_my = my_compare;
fun_my(10,20)
对于函数定义,需要使用的格式为 def、函数名、小括号中的参数和冒号':',然后在缩进中编写函数体,函数的返回值需使用return。
作为一个程序员,需要时刻小心传入参数不合法的问题,即对于my_compare函数,我们希望比较的参数是整型或者浮点型,但当用户不小心输入字符串时,my_compare函数并不会告诉用户说:对不起,您输入的参数有误,应输入整型。python函数为我们提供了数据类型检查工具instance(),isinstance(object,classinfo)函数用来判断一个对象是否和一个已知类型的相同,当对象和已知类型相同时函数返回True,否则返回False,如下所示:
# -*- coding: utf-8 -*-
def my_compare( a , b ):
if not isinstance( a , ( int ,float ) ):
raise TypeError( ' 对不起,您输入的第一个参数类型有误 ' );
if not isinstance( b , ( int ,float ) ):
raise TypeError( ' 对不起,您输入的第二个参数类型有误 ' );
if a > b:
print( 'The max is %s' %a );
else:
print( 'The max is %s' %b );
fun_my = my_compare;
fun_my('aaa','bbb')
交互行命令输出为
为什么明明输入的两个参数都是字符串类型,可第二个参数没有报错呢?这是因为python中if语句是从上到下执行的,当第一个if 的条件不满足时,python就会抛出错误并结束语句。
是不是上面判断isinstance()需要两次if语句判断,显得有些复杂呢?对于isinstance函数可不可以只需要一个if判断语句呢?这时就是布尔值派上用场的时候了,还记得and、or、not么?
# -*- coding: utf-8 -*-
def my_compare( a , b ):
if not ( isinstance( a , ( int ,float ) ) or isinstance( b , ( int ,float ) ) ) :
raise TypeError( ' 对不起,您输入的参数类型有误 ' );
if a > b:
print( 'The max is %s' %a );
else:
print( 'The max is %s' %b );
fun_my = my_compare;
fun_my('aaa','bbb')
这时交互行输出为
对于Python来讲,大家都希望其能有默认的参数,这样当调用函数的时候就只需要传递没有默认值的参数就好了。
# -*- coding: utf-8 -*-
def my_compare( a , b = 1 ):
if not isinstance( a , ( int ,float ) ) or isinstance( b , ( int ,float ) ) :
raise TypeError( ' 对不起,您输入的参数类型有误 ' );
if a > b:
print( 'The max is %s' %a );
else:
print( 'The max is %s' %b );
fun_my = my_compare;
fun_my(10)
输出为
虽然默认参数方便了函数的使用,但是一定要注意的是默认参数一定要放在最后面且为不变对象!!!
默认参数一定要放在最后面且为不变对象!!!
默认参数一定要放在最后面且为不变对象!!!
可变参数:
在Python中,为我们提供了一中特殊的参数,可变参数。也就是说参数的数量是可变的,这样就省去了我们一一定义参数的步骤。但是需要注意的是,这种可变参数一般用在for循环中,比如需要计算几个数的和:
def summation( *num ):
for ii in num:
if not isinstance( ii , ( int ,float ) ):
raise TypeError('输入类型有误')
sum = 0 ;
for n in num:
sum = sum + n;
print( "The sum is %s" %sum)
summation(1,2,3,4,6 )
输出为
The sum is 10