python实用教程-第七章-函数

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第七章函数•函数能够提高应用的模块性和代码的重复利用率。Python提供了许多内建函数,开发者也可以自己创建函数。•Python快乐学习班的同学结束旋转乐园的游玩后,导游带领他们来到函数乐高积木厅,在函数乐高积木厅,同学们只要通过想象和创意,就可以使用手中的代码块拼凑出很多神奇的函数,它们有不带参数的,有带必须参数的,有带关键字参数的,有带默认参数的,有带可变参数的,有带组合参数的。现在陪同Python快乐学习班的同学一起进入函数乐高积木厅,开始我们的创意学习之行。7.1函数的定义•函数这个概念在前面的章节中已经提到过很多次,也已经使用过函数。不过到目前为止,我们用的都是Python内置函数。这些Python内置函数的定义部分对我们来说是透明的。因此,我们只需关注这些函数的用法,而不必关心函数是如何定义的。•Python支持自定义函数,即由我们自己定义一个实现某个功能的函数。•下面是自定义函数的简•(1)函数代码块以def关键字开头,后接函数标识符名称和圆括号“()”。•(2)所有传入的参数和自变量都必须放在圆括号中,可以在圆括号中定义参数。•(3)函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明。•(4)函数内容以冒号开始,并且要缩进。•(5)return[表达式]用于结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None。•单规则。•Python定义函数使用def关键字,一般格式如下:•def函数名(参数列表):•函数体•或者更直观的表示为:•defname(arg1,arg2,...argN):•statements•函数的名字必须以字母开头,可以包括下画线“_”。和定义变量一样,不能把Python的关键字定义成函数的名字。函数内的语句数量是任意的,每个语句至少有一个空格的缩进,以表示该语句属于这个函数。函数体必须保持缩进一致,因为在函数中,缩进结束就表示函数结束。7.2函数的调用•在程序设计中,函数是指用于进行某种计算的一系列语句的有名称的组合。定义一个函数时,需要指定函数的名称并写下一系列程序语句。之后就可以使用名称来“调用”这个函数。•前面我们已经见过函数调用的例子,如下示例:•print('helloworld')•helloworld•type('hello')•class'str'•int(12.1)•12•Python3内置了很多有用的函数,我们可以直接调用。•要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。可以直接从Python的官方网站查看文档:••除了到Python官网查看文档,还可以在交互式命令行通过help(abs)查看abs函数的帮助信息。在交互模式下输入:•help(abs)•Helponbuilt-infunctionabsinmodulebuiltins:•abs(x,/)•Returntheabsolutevalueoftheargument.•调用Python的函数,需要根据函数定义,传入正确的参数。•函数定义时需要注意几点:•(1)如果没有return语句,函数执行完毕后也会返回结果,只是结果为None。•(2)returnNone可以简写为return。•(3)在Python中定义函数时,需要保持函数体中同一层级代码的缩进一致。•在一个函数中可以定义多条语句,并且在函数中能做各种赋值、运算、调用其他函数等操作,并返回结果。•如可以定义输出多条语句的函数并执行(print_more.py):•defprint_more():•print('该函数可以输出多条语句,我是第一条。')•print('我是第二条')•print('我是第三条')••print_more()#调用函数•程序输出结果如下:•该函数可以输出多条语句,我是第一条。•我是第二条•我是第三条•在Python中,可以定义一个什么都不做的函数。如果想定义一个什么都不做的空函数,可以用pass语句,定义如下函数并执行(do_nothing.py):•defdo_nothing():•pass••do_nothing()•pass语句什么都不做,这样有什么用呢?•此处pass可以作为占位符使用,比如现在还没想好怎么写函数的代码,可以先放一个pass,让代码能运行起来。•函数的目的是把一些复杂操作隐藏起来,用于简化程序的结构,使程序更容易阅读。函数在调用前必须先定义。7.3函数的参数•我们在7.1节中讲述了如何定义函数,但讲述的是定义简单的函数,还有一类函数是带有参数的,称为带参数的函数。本节将探讨如何定义带参的函数及其使用。•调用函数时可以使用以下参数类型:•(1)必须参数。•(2)关键字参数。•(3)默认参数。•(4)可变参数。•(5)组合参数。7.3.1必须参数•必须参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。•defparam_one(str):•print('theparamis:',str)•print('我是一个传入参数,我的值是:',str)••Param_one('hello,world')•代码中定义了一个必须传入一个参数的函数param_one(str),其传入参数为str,结果即是将’hello,world’这个值传给str。•对于上面的示例,假如不传入参数或传入一个以上的参数,结果会怎样呢?操作如下:•param_one()#不传入参数•程序输出结果如下:•Traceback(mostrecentcalllast):•Fileparam_one.py,line7,inmodule•param_one()#不传入参数•TypeError:param_one()missing1requiredpositionalargument:'val_str'•由输出结果可以看到,程序报错:函数缺少一个必须的定位参数,参数为val_str。•在实际项目应用中,若定义函数时需要定义的参数个数较少,建议定义成必须参数形式的函数。7.3.2关键字参数•函数调用使用关键字参数来确定传入的参数值。•使用关键字参数Python解释器能够用参数名匹配参数值。•defperson_info(age,name):•print(f'年龄:{age}')•print(f'名称:{name}')•return••print('-------按参数顺序传入参数-------')•person_info(21,'小萌')•print('-------不按参数顺序传入参数,指定参数名-------')•person_info(name='小萌',age=21)•print('-------按参数顺序传入参数,并指定参数名-------')•person_info(age=21,name='小萌')•调用函数,输出结果如下:•-------按参数顺序传入参数-------•年龄:21•名称:小萌•-------不按参数顺序传入参数,指定参数名-------•年龄:21•名称:小萌•-------按参数顺序传入参数,并指定参数名-------•年龄:21•名称:小萌•在实际项目应用中,使用关键字参数的形式调用函数是不错的做法。7.3.3默认参数•调用函数时,如果没有传递参数,则会使用默认参数。•所谓使用默认参数,就是我们在定义函数时,给参数一个默认值,当没有给调用该函数时的该参数赋值时,调用的函数就使用这个默认的值。定义如下函数并执行(default_param.py):•defdefault_param(name,age=23):•print('hi,我叫:',name)•print('我今年:',age)•return••default_param('小萌')•调用函数,输出结果如下:•hi,我叫:小萌•我今年:23•在一个函数定义中,是否可以定义多个默认参数?先看看以下几个函数定义的示例。•(1)示例1:多个默认参数值(default_param_test.py)•(2)示例2:默认参数在必须参数前(default_param_try.py)•由示例1和示例2,得到如下结论。•对于默认参数:•(1)不管有多少个默认参数,默认参数都不能在必须参数之前。•(2)不管有多少个默认参数,若不传入默认参数值,都会使用默认值。•(3)若要更改某一个默认参数的值,而不想传入其他默认参数,且其位置不是第一个默认参数,可以通过参数名来更改想要更改的默认参数的值。•(4)若有一个默认参数是通过传入参数名更改参数值,则其他任何想要更改的默认参数都需要传入参数名来更改参数值,否则报错。•(5)更改默认参数的值时,传入默认参数的顺序不需要根据定义的函数中的默认参数的顺序进行传入,不过最好同时传入参数名,否则容易出现执行结果与预期不一致的情况。7.3.4可变参数•可变参数的基本语法如下:•deffunctionname([formal_args,]*var_args_tuple):•函数_文档字符串•function_suite•return[expression]•加了星号(*)的变量名会存放所有未命名的变量参数。如果变量参数在函数调用时没有指定参数,它就是一个空元组。我们也可以不向可变函数传递未命名的变量。•如果需要一个函数能处理比当初声明时更多的参数,这些参数叫做可变参数,和前面所述两种参数不同,可变函数声明时不会命名。•通过实例来说明可变函数的使用,定义如下函数并执行(person_info_var.py):•defperson_info_var(arg,*vartuple):•print(arg)•forvarinvartuple:•print(f'我属于不定长参数部分:{var}')•return••print('------------不带可变参数------------------')•person_info_var('小萌')•print('------------带两个可变参数------------------')•person_info_var('小萌',21,'beijing')•print('------------带5个可变参数----------------')•person_info_var('小萌',21,'beijing',123,'shanghai','happy')•执行以上代码段,由输出结果可以看到,虽然在定义函数时只定义了两个参数,但调用时却可以传入多个参数,这和之前函数的调用不一样了,这是怎么实现的?•这就是可变参数的好处,在函数内部,若在参数前加一个星号,在函数调用时,会将所有参数放在一个元组中,通过这种方式将这些值收集起来,然后供函数内部使用。如在函数person_info_var()中,参数vartuple接收的是一个元组,调用函数时可以传入任意个数的参数,也可以不传。•在这个示例中使用了前面所学的for循环,通过for循环遍历元组。通过这种方式定义函数,调用时是不是非常方便?我们在后续学习中会经常遇到。7.3.5组合参数•在Python中定义函数,可以用必须参数、关键字参数、默认参数和可变关键字参数,这4种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必须参数、默认参数、可变参数和关键字参数。•下面我们来介绍组合参数的使用,请看如下函数定义:•defexp(p1,p2,df=0,*vart,**kw):•print('p1=',p1,'p2=',p2,'df=',df,'vart=',vart,'kw=',kw)••exp(1,2)•exp(1,2,c=3)•exp(1,2,3,'a','b')•exp(1,2,3,'abc',x=9)•执行以上py文件,由输出结果可以看到,在定义exp()函数时,使用了组合参数的定义形式,Python解释器会自动按照参数位置和参数名把对应

1 / 47
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功