1.def 函数
如果我们用代码实现了一个小功能,但想要在程序代码中重复使用,不能在代码中到处粘贴这些代码,因为这样做违反了软件工程中DRY原则。Python提供了函数功能,可以将我们这部分功能抽象成一个函数以方便程序调用,或者提供给其他模块使用。
def function_name(parameters):
expressions
在Python中使用def开始函数定义,紧接着function_name是函数名,括号内部parameters为函数的参数,expressions内部为函数的具体功能实现代码,如果想要函数有返回值,在expressions中的逻辑代码中用return返回。
实例
def function():
print('This is a function')
a = 1+2
print(a)
上面我们定义了一个名字为function的函数,函数没有参数,所以括号内部为空,紧接着是函数的功能代码。如果执行该脚本,发现并没有输出任何输出,因为我们只定义了函数,而并没有执行函数。这时我们在Python命令提示符中输入函数调用function(),注意这里调用函数的括号不能省略。那么函数内部的功能代码将会执行,输出结果:
This is a function
如果我们想要在脚本中调用的脚本,只需要在脚本中最后添加函数调用语句
function()
那么在执行脚本的时候,将会执行函数。
2.函数参数
我们在调用函数的时候,想要指定一些变量的值在函数中使用,那么这些变量就是函数的参数,函数调用的时候,传入即可。
def function_name(parameters):
expressions
parameters的位置就是函数的参数,在调用的时候传入即可。
实例
def func(a, b):
c = a+b
print('the c is ', c)
在这里定义一个函数func,其参数就是两个数值a,b,函数的功能就是把两个参数加起来c = a+b。运行脚本后,在Python提示符内调用函数func,如果不指定参数func(),那么将会出错; 输出func(1,2),将a=1,b=2 传入函数,输出the c is 3。所以在调用函数时候,参数个数和位置一定要按照函数定义。如果我们忘记了函数的参数的位置,只知道各个参数的名字,可以在函数调用的过程中给指明特定的参数func(a=1,b=2),这样的话,参数的位置将不受影响,所以func(b=2,a=1)是同样的的效果。
3.函数默认参数
我们在定义函数时有时候有些参数在大部分情况下是相同的,只不过为了提高函数的适用性,提供了一些备选的参数,为了方便函数调用,我们可以将这些参数设置为默认参数,那么该参数在函数调用过程中可以不需要明确给出。
def function_name(para_1,...,para_n=defau_n,..., para_m=defau_m):
expressions
函数声明只需要在需要默认参数的地方用=号给定即可,但是要注意所有的默认参数都不能出现在非默认参数的前面。
实例
def sale_car(price, color='red', brand='carmy', is_second_hand=True):
print('price', price,
'color', color,
'brand', brand,
'is_second_hand', is_second_hand,)
在这里定义了一个sale_car函数,参数为车的属性,但除了price之外,像color,brand和is_second_hand都是有默认值的,如果我们调用函数sale_car(1000),那么与sale_car(1000,'red','carmy',True)是一样的效果。当然也可以在函数调用过程中传入特定的参数用来修改默认参数。通过默认参数可以减轻我们函数调用的复杂度。
4.进阶
4.1自调用
如果想要在执行脚本的时候执行一些代码,比如单元测试,可以在脚本最后加上单元测试代码,但是该脚本作为一个模块对外提供功能的时候单元测试代码也会执行,这些往往我们不想要的,我们可以把这些代码放入脚本最后:
if __name__ == '__main__':
#code_here
如果执行该脚本的时候,该if判断语句将会是True,那么内部的代码将会执行。如果外部调用该脚本,if判断语句则为False,内部代码将不会执行。
4.2可变参数
顾名思义,函数的可变参数是传入的参数可以变化的,1个,2个到任意个。当然可以将这些参数封装成一个list或者tuple 传入,但不够pythonic。使用可变参数可以很好解决该问题,注意可变参数在函数定义不能出现在特定参数和默认参数前面,因为可变参数会吞噬掉这些参数。
def report(name, *grades):
total_grade = 0
for grade in grades:
total_grade += grade
print(name, 'total grade is ', total_grade)
定义了一个函数report,传入一个参数为name,后面的参数*grades使用了*修饰,表明该参数是一个可变参数,这是一个可迭代的对象。该函数输入姓名和各科的成绩,输出姓名和总共成绩。所以可以这样调用函数report('Mike',8,9),输出的结果为Mike total grade is 17,也可以这样调用report('Mike',8,9,10),输出的结果为Mike total grade is 27
4.3关键字参数
关键字参数可以传入0个或者任意个含参数名的参数,这些参数名在函数定义中并没有出现,这些参数在函数内部自动封装成一个字典(dict).
def portrait(name, **kw):
print('name is', name)
for k,v in kw.items():
print(k, v)
定义了一个函数portrait,传入一个参数name,和关键字参数**kw,使用了**修饰。表明该参数是关键字参数,通常来讲关键字参数是放在函数参数列表的最后。如果调用参数portrait('Mike',age=24,country='China',education='bachelor')输出:
name is Mike
age 24
country China
education bachelor
通过可变参数和关键字参数,任何函数都可以用universal_func(*args,**kw)表达。
本文介绍了Python中的函数定义与使用,包括def函数语法、函数参数(位置参数、默认参数、可变参数和关键字参数)、函数调用以及自调用和条件执行。通过示例详细解释了如何创建和使用具有不同参数类型的函数。

被折叠的 条评论
为什么被折叠?



