1、python内置了很多有用的函数,我们可以直接调用。
要调用一个函数最重要的是要知道函数的名称和参数。需要根据函数的定义,传入正确的参数。
常用函数,比如:
绝对值的函数:abs()
调用abs()函数:
>>>abs(20)
20
max函数可以接收任意多个参数,并返回最大的那个。
>>>max(1,2)
2
数据类型转换函数:
>>>int('123')
123
>>>str(12.67)
'12.67'
>>>bool(1)
True
函数名其实就是指向一个对象的引用,可以将函数名赋给一个变量,相当于给这个函数起了一个别名
#变量a指向,max函数
>>>a=max
数据类型检查可以用内置函数isinstance()实现
def my_abs(x):
if not isinstance(x,(int,float)):
raise TypeError('bad operand type')
if x>=0:
return x
else:
return -x
小结:
定义函数时,需要确定函数名和参数个数;
有必要可以先对参数的数据类型做检查;
函数内部可以用return随时返回函数结果;
函数执行完毕后也没有return语句时,自动return None;
函数可以同时返回多个值,但其实是一个tuple;
python的函数定义非常的简单,但灵活度非常的大;除了正常定义的必选参数外,还可以使用默认参数、可变参数、关键字参数,使得函数定义的接口不但能处理复杂参数,还可以简化调用者的代码。
位置参数:
def power(x,n):
s = 1
while n>0:
n=n-1;
s=s*x
return s
x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋值给x和n
默认参数:
设置默认参数时,有几点需要注意:
1)必选参数在前,默认参数在后,否则python解析器会报错
2)当函数有多个参数时,把变化大的参数放在前面,变化小的参数放在后面。变化小的参数可以作为默认参数。
3)默认参数必须指向不可变对象;为什么一定要是不可变对象呢,分析如下:
def add_end(L=[]):
L.append('end')
return L
当你使用默认参数时,一开始结果是对的:
>>>add_end()
['END']
但是再次调用add_end()时,结果就不对了:
>>>add_end()
['END','END']
>>>add_end()
['END','END','END']
默认参数是[],但是函数每次都记住了,上次添加了'END'后的list
原因如下:
python函数在定义的时候,默认参数L是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是定义的[]了。故默认参数必须指向不可变对象。
修改上面的例子,我们可以用None这个不变对象来实现
def add_end(L=None):
if L is None:
L = None
L.append('END')
return L
现在无论调用多少次都不会有问题
>>>add_end()
['END']
>>>add_end()
['END']
可变参数:
在python中,可以定义可变参数,顾名思义,可变参数就是传入的参数个数是可变的,可以是1个,2个,不可以是0个。
我们将函数改为可变参数:仅在参数前面加了一个*。
def calc(*numbers):
sum =0
for n in numbers:
sum = sum+ n*n
return sum
但是在调用该函数时,可以传入任意个参数并且自动组装成一个tuple
>>>calc(1,2)
5
>>>nums =[1,2,3]
>>>calc(*nums)
14
*nums表示把num这个list的所有元素作为可变参数传进去
关键字参数:
关键字参数允许你传入0个或者任意个含参数名的参数,而这些关键字参数在函数内部自动装成一个dict
在调用该函数时,可以只传入必选参数
def person(name,age,**kw):
print('name',name,'age',age,'other',kw)
>>>person('张三',27)
name:张三 age:27 other:{}
>>>person('张三',27,city='深圳')
name:张三 age:27 other:{'city':'深圳'}
组装一个dict,然后将dict转换为关键字参数传进去:
>>>extra = {'city':'深圳','job':'Enginer'}
>>>person('张三',27,**extra)
name:张三 age:27 other:{'city':'深圳'}
命名关键字参数:
如果要限制关键字参数的名字,就可以用命名关键字参数。
比如:只接受city和job作为关键字参数,这种方式定义的函数如下:
def person(name,age,*,city,job):
print(name,age,city,job)
命名关键字参数需要一个特殊的分割符*,*后面的参数被视为命令关键字参数
调用方式如下:
>>>person('Jcak',24,city='深圳',job='教师')
Jack 24 深圳 教师
注意:命名关键字参数必须传入参数名,若没传入,调用则会报错。
参数组合:
在python中定义函数,参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数,除了可变参数无法和命令关键字参数混合,其他都可以组合。
所以,对于任何函数,都可以通过类似的func(*args,**kw)的形式调用它,无论参数是如何定义的。