调用函数
传入参数量和参数类型不对时,都会返回TypeError错误
定义函数
以def开头,依次写出函数名,括号,括号中的参数和冒号,在缩进块中写函数体,函数的返回值用return返回
如果没有return语句,函数就会返回none
空函数
想定义一个什么也不做的空函数,可以用pass语句。pass可以用来做占位符,让代码先运行起来
参数检查
自定义函数的参数检查,当参数个数不对时,会返回类型错误,但当类型不对时,不会返回,这时可在函数内部定义,对参数类型进行检查,使用isinstance()函数:is instance(x,(int,float))
返回多个值
使用return x,y。但其实函数返回的也只是单一值,返回值是一个tuple。
函数的参数
位置参数
对于power(x)函数,参数x就是一个位置参数,当我们调用函数时,必须传入有且仅有的一个参数x。当有多个位置参数时,传入的多个值按照位置顺序依次赋给参数
默认参数
可以对一个参数设置默认值,只要这个值不变化,调用时就不用传入这个参数。使用时需注意,必须参数在前,默认参数在后。当有多个默认参数时,调用时,既可以按顺序提供调用参数,也可以不按顺序提供部分默认参数,但不按顺序调用时,需要写上参数名字。
有一个情况需要注意,函数在定义的时候,默认参数就被计算出来了,即为[],默认参数也是一个变量,指向对象[],每次调用,若改变了默认参数的内容,则下次调用时,默认参数的值就被改变了。所以定义默认参数必须注意一点,默认参数必须指向不变对象。所以可让空的指向none,设置str、none这样的不变对象,是因为这样的对象一旦创建,对象内部的数据就不能更改,这样就减少了由于修改数据产生的错误,此外,由于对象不变,多任务环境下同时读取对象不需要加锁
可变参数
定义可变参数时,在参数名前加一个*号。当在list或者tuple前面加一个*时,也可把他们中的元素变成可变参数传进去。
可变参数允许你传入0个或者任意个参数,这些可变参数在调用时自动组装成一个tuple
关键字参数
形式为**函数名。允许你传入0个或者任意个含参数名的参数,这些关键词参数在函数内部自动组装成一个dict。关键字参数可以扩展函数的功能。在使用时,也可以先组装一个dict,然后把该dict转换为关键字参数传进去
命名关键字参数
如果要限制关键字参数的名字,就可以用命名关键字参数,在定义参数时,需要一个*分隔符,*后面的参数为命名关键字参数。如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个*了。命名关键字参数使用时必须传入参数名,否则将报错
参数组合
这些参数可以任意组合,但参数定义的顺序必须是必选参数、默认参数、可变参数、关键字参数、命名关键字参数
小结
Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
要注意定义可变参数和关键字参数的语法:
*args
是可变参数,args接收的是一个tuple;
**kw
是关键字参数,kw接收的是一个dict。
以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3)
,又可以先组装list或tuple,再通过*args
传入:func(*(1, 2, 3))
;
关键字参数既可以直接传入:func(a=1, b=2)
,又可以先组装dict,再通过**kw
传入:func(**{'a': 1, 'b': 2})
。
使用*args
和**kw
是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*
,否则定义的将是位置参数。