首页 > 其他学习 > python > Python中的自定义函数
2016
12-16

Python中的自定义函数

callable(object)函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。对于函数,方法,lambda函式,类,以及实现了__call__方法的类实例,它都返回True。

def 函数名(形参):

函数体

全局变量:在函数体中使用global语句来声明变量是全局变量,声明以后可以使用和修改在函数外部声明的变量,可以一次指定多个全局变量,如global a,b,c

默认参数值:在定义函数时为形参赋予一个默认值,当调用函数时如果没有传入该参数则使用默认值,def day(month,day=1,year=2016):。设置参数默认值要从形参列表的末尾开始设置。

可变参数,当参数数量不确定时,在定义函数时形参前面加上星号(*),def func(*list),表示参数数量不确定,可以使用列表或者元组传入参数,但是对应的实参个数,顺序和数据类型要保证正确,如定义一个列表shican=[12,20,2020],此时调用可以用day(*shican),通过星号(*)来表示变量shican是实参列表。

关键字参数:如果某个函数调用时只想指定其中的一部分参数值,而且这一部分参数值在形参列表中并不是从左至右排序的,此时可以通过命名来为这些参数赋值,这些参数称为关键字参数。

调用函数时我们使用day(10,year=2020)这种方式来特别的指定年份值,这样调用时我们不必考虑参数的顺序,上面的例子中我们甚至可以这样调用day(year=2020,10),关键字参数也可以使用字典传入,如定义一个字典zidian={'month':10,'year':2020},此时调用可以用day(**zidian),通过两个星号(**)来表示变量zidian是要传入的关键字参数组成的字典。

命名关键字参数:对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部检查。如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person(name, age, *, city, job):

print(name, age, city, job)

和关键字参数不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。

>>> person('Jack', 24, city='Beijing', job='Engineer')

Jack 24 Beijing Engineer

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person(name, age, *args, city, job):

print(name, age, args, city, job)

命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错:

命名关键字参数可以有缺省值,从而简化调用:

def person(name, age, *, city='Beijing', job):

使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数:

def person(name, age, city, job):

# 缺少 *,city和job被视为位置参数

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

处理冗余参数,当实参数量多于形参数量时,多于的部分实参称为冗余参数,而且此时会报错。为了处理冗余参数,在定义函数时在形参使用星号:def func(x,*yuanzu):

上面函数传入的实参第一个会赋值给形参x,其余所有的实参都会保存在形参yuanzu中,且yuanzu为元组类型。

同样的,如果冗余参数中含有关键参数,此时的元组形参满足不了了,需要使用字典形参来接收关键参数:def func(x,*yuanzu,**zidian):

这样冗余参数中一般参数会保存到yuanzu中,并以元组类型保存,关键参数会保存到zidian中,并以字典类型保存数据。

DocStrings :文档字符串,在Python中,函数、模块和类的第一个逻辑行的字符串(一般为该函数、模块或类的使用说明)是文档字符串,文档字符串一般为多行字符串(所以一般使用三引号),首行第一个字母一般为大写,末尾以句号结束。使用属性__doc__调用文档字符串,如day.__doc__

函数名:由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。

如自定义一个函数def func():...

然后f = func,那么f()的结果和func()的一样,为了区分这种函数,python为函数提供了__name__属性,可以拿到函数的名字。func.__name__返回'func',f.__name__也返回'func'

匿名函数:lambda函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方。

def f(x,y):

return x*y

调用时:f(3,5),返回乘积值15

g=lambda x,y:x*y,冒号前面是形参,可以有多个,用逗号隔开,冒号后面是返回值。调用时:g(3,5),返回乘积值15。

在程序中很多时候一个特定的函数并不会重复的调用,这个时候并不关心函数名叫什么,此时使用lambda创建一个匿名函数是个很好的办法

如reduce(func,list)函数。定义一个列表:l=range(1,20),此时使用reduce(f,l)即可求出列表中的所有数字的乘积。我们实现这个步骤要先定义f(),其实这个时候我们并不关心这个函数的名字,那么使用reduce(lambda x,y:x*y,l)即可实现。

 

最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。