




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章自定义函数6.5lambda表达式6.4函数的返回值6.2函数调用6.6生成器6.3函数的参数6.1函数定义6.7装饰器6.8变量的作用域6.9函数的递归6.1函数的定义6.1函数定义函数(function)是指一个有命名的、执行某个功能的语句序列。在定义一个函数的时候,需要指定函数的名字和语句序列。
函数不仅可以实现代码的复用,还可以保证代码的一致性。Python将函数的声明和定义视为一体。函数的定义语法如下:
def函数名([参数列表]):函数体6.1函数定义Ø自定义函数通过关键字def来定义,通过return语句指定返回值。Ø函数可以通过return语句同时返回多个值,如果没有return语句,则函数返回值为None。Ø函数名命名规则与变量名相同,不能是关键字,应该避免函数名和变量名同名。Ø函数的第1行称为函数头,必须以冒号:结束,其余部分称为函数体,而函数体必须缩进。按照惯例,缩进总是4个空格。Ø函数形参不需要声明类型,也不需要指定函数返回值类型。Ø当函数不需要任何参数时,也必须保留一对空的圆括号。ØPython允许嵌套定义函数。6.1函数定义
函数的形参和返回值可以是任何数据类型,包括函数。可以使用pass关键字,表示函数什么也不做,起到占位的作用。
定义函数时,建议设置其docstring,提供函数的帮助文档。可以通过函数名?或者help(函数名)看到这些docstring,使用三双引号来定义docstring。
用Python编写的函数,在Jupyternotebook中可以通过“函数名??”来显示源代码。defmyfun1(a,b): """
这是一个函数嵌套定义,完成a*(a+b)功能 """ n=a+b defmyfun2(c,d): #函数的嵌套定义 returnc*d returnmyfun2(n,a) #调用内部函数
6.1函数定义6.2函数的调用6.2函数调用1.函数的调用方式对于一个函数,可以通过“函数名(实参)”的方式来调用。如果函数有返回值,那么可以在函数调用的同时将返回值传递出来,此时这个函数调用可以当做一个值来使用。
>>>result=myfun1(5,4)
#函数调用时实参传递给形参,如果实参是表达式,先计算表达式的值,然后再传递给形参>>>result452.特殊的内置函数1)map()map()函数接受一个函数f和一个序列sq,其作用是将函数f作用在序列的每个元素上,等价于[f(x)forxinsq]。>>>list(map(int,"123")) #将字符串中的每个字符应用int()函数,转换为整型数[1,2,3]6.2函数调用
2)filter()filter()函数也接受一个函数f和一个序列sq,其作用是通过函数f来筛选序列中的每个元素,等价于[xforxinsqiff(x)]。>>>defis_odd(x): returnx%2!=0>>>list(filter(is_odd,[1,2,3,4,5,6]))[1,3,5]6.2函数调用
6.2函数调用
3)reduce()reduce()函数接受一个二元操作的函数f和一个序列sq,实现对序列sq中的元素累加计算,并返回单一结果。注意:reduce()使用时需要引入functools模块。>>>fromfunctoolsimportreduce>>>defadd(x,y): returnmax(x,y) #求x,y的最大者>>>reduce(add,[10,-10,100,200,1,2])2006.3函数的参数6.3函数的参数
函数定义时,圆括弧内是使用逗号分隔开的形参列表,函数可以有多个参数,也可以没有参数,形参只是起到占位的作用。定义函数时不需要声明参数类型,解释器会根据实参的类型自动推断形参类型。如果传递给函数的实参是整数、实数、复数等基本类型或元组、字符串这样的不可变类型的数据,在函数内部直接修改形参的值不会影响实参,而是创建一个新变量。如果传递给函数的实参是可变序列,并且在函数内部使用下标或可变序列自身的方法增加、删除元素或修改形参元素时,实参也会得到相应的修改。6.3函数的参数>>>defsub(num): print("操作前,形参地址是:%0x"%id(num)) num-=1 print("操作后,形参地址是:%0x"%id(num))>>>test=100>>>print("实参地址是:%0x"%id(test))>>>sub(test)实参地址是:52557a40操作前,形参地址是:52557a40操作后,形参地址是:52557a206.3函数的参数>>>defadd(s): s.append(10)>>>t=[1,2,3]>>>add(t)>>>t[1,2,3,10]>>>defmodify(lst): print("操作前,形参的地址是:",hex(id(lst)))
lst=[4,5,6] #lst指向一个新的内存地址 print("操作后,形参的地址是:",hex(id(lst)))>>>a=[1,2,3]>>>modify(a)1.
位置参数位置参数是最常用的形式,调用函数时实参和形参的顺序以及必须严格一致,并且实参和形参的数量必须相同。>>>defmenu(food,cigarette,wine): print("主食:",food,"香烟:",cigarette,"白酒:",wine)>>>menu("面条","红塔山","郎酒")主食:面条香烟:红塔山白酒:郎酒6.3函数的参数6.3函数的参数2.默认值参数在调用带有默认值参数的函数时,可以不用为设置默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值。在调用函数时是否为默认值参数传递实参是可选的。需要注意的是,在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误。函数的默认值参数是在函数定义时确定值的,所以只会被初始化一次。带有默认值参数的函数定义语法如下:def函数名(……,形参=默认值):
函数体6.3函数的参数
多次调用函数并且不为默认值参数传递实参时,默认值参数只在定义时进行一次解释和初始化。因此,对于列表、字典这样可变类型的默认值参数,可能会导致逻辑错误。>>>defbuggy(arg,result=[]): result.append(arg) print(result)>>>buggy(3,[1,2])[1,2,3]>>>buggy(3)
>>>buggy(4)[3]
[3,4]6.3函数的参数
一般来说,要避免使用列表、字典、集合等可变序列作为函数参数默认值,对于上面的函数,更建议使用下面的写法。>>>defbuggy(arg,result=None): ifresultisNone: result=[] result.append(arg) print(result)6.3函数的参数3.关键参数关键参数指调用函数时的参数传递方式,与函数定义无关。通过关键参数可以按照参数名字传递值,明确指定哪个值传递给哪个参数,实参的顺序可以和形参的顺序不一致,并不影响参数值的传递结果。>>>menu(wine="茅台",food="米饭",cigarette="好猫")主食:米饭香烟:好猫白酒:茅台还可以混合位置参数和关键参数,但是要确保位置参数在关键参数的左边。>>>menu("米粉",wine="五粮液",cigarette="云烟")主食:米粉香烟:云烟白酒:五粮液6.3函数的参数4.可变长度参数Python支持在函数定义时可以使用个数不确定的参数。可变长度参数主要有两种形式:在参数名前加*或**。*parameter用来接收多个位置参数并将其放在一个元组中。**parameter用来接收多个关键参数并将其存放到一个字典中。6.3函数的参数>>>defprint_args(arg1,arg2,*pargs,**kargs): print("arg1is",arg1) print("arg2is",arg2) foreachpargsinpargs: print("additionalpositionarg:",eachpargs) forkey,valueinkargs.items(): print("additionalkeywordarg:%s:%s"%(key,value))>>>print_args("主食","面条","白酒","汾酒",香烟="芙蓉王")6.4函数的返回值6.4函数的返回值
在Python中,定义函数时不需要声明函数的返回值类型,函数返回值类型与return语句返回表达式的类型一致。return语句结束函数的执行。
Python支持同时返回多个值,多个值以元组的形式返回。>>>defadddiv(a,b): a,b=a+b,a/b returna,b #返回一个元组,包含a和b的值>>>add,sub=adddiv(10,3) #元组的拆封>>>print("参数之和是:%d,参数相除是:%.2f"%(add,sub))参数之和是:13,参数相除是:3.336.5lambda表达式6.5lambda表达式lambda表达式可以用来声明匿名函数,也就是没有函数名字的临时使用的函数。在使用函数作为参数的时候,如果传入的函数比较简单或者使用次数较少,直接定义这些函数就显得比较浪费,这是就可以使用lambda表达式。
lambda<variables>:<expression>其中variables是函数的参数,expression是函数的返回值,它们之间用冒号:分隔。
lambda表达式只可以包含一个表达式,不允许包含选择、循环等语法结构,该表达式的计算结果可以看作是函数的返回值,不允许包含复合语句,但在表达式中可以调用其他函数。6.5lambda表达式>>>f=lambdax,y,z:max(x,y,z)>>>f(10,20,30)30>>>L=[1,2,3,4,5]>>>print(list(map(lambdax:x+10,L)))[11,12,13,14,15]>>>defdemo(n): returnn*n>>>list(map(lambdax:demo(x),(1,2,3,4))) #使用函数作为lambda表达式的返回值[1,4,9,16]>>>fromrandomimportsample#导入random包中的sample模块>>>data=[sample(range(100),6)foriinrange(3)]
>>>forrowindata: print(row)[22,62,82,50,36,99][62,19,72,88,82,25][28,27,92,63,20,5]>>>forrowinsorted(data,key=lambdarow:row[0]):#按照每行的第一个元素升序排列 print(row)[22,62,82,50,36,99][28,27,92,63,20,5][62,19,72,88,82,25]6.5lambda表达式6.6生成器
生成器(generator)是创建迭代器(iterator)对象的一种简单而强大的工具。生成器的语法和普通函数一样,只是返回数据时需要使用yield语句而非return语句。包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。与一般函数不同的是,一般函数在执行到return语句时,会立刻结束函数的运行,而生成器在每次执行到yield语句时,会返回一个中间的结果给调用者,之后会暂停或挂起后面代码的执行,下次通过生成器对象的__next__()方法、内置函数next()、for循环遍历生成器对象元素或其他方式显式获取数据时,它会准确地从离开地方继续执行。6.6生成器>>>defmy_range(first=0,last=10,step=1): number=first whilenumber<last: yieldnumber#暂停执行,需要时再产生一个新元素 number+=step>>>ranger=my_range(1,6)>>>forxinranger: #迭代生成器对象 print(x,end='\t')1 2 3 4 5 6.6生成器6.7装饰器
装饰器(decorators)本质上是一个输入参数是函数,并且返回值也是函数的函数。装饰器的语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课程教学设计说课
- 4.3线上文件共分享【知识精研】三年级信息技术下册(冀教版2024)
- 盘扣式脚手架作业指导图示
- 2025年工程机械专用油合作协议书
- 以生物膜为靶点探究芦丁联合阿奇霉素对粘液型铜绿假单胞菌的抗菌作用
- 高中语文科普文教学研究
- 骨性Ⅰ类不同垂直骨面型成人腭中缝融合程度的CBCT研究
- 伴侣低头行为对亲密关系满意度的影响-基于主客体互倚模型
- 贝壳入职工作流程
- 小学安全教育课:预防踩踏事件
- 2024解析:第十六章电压和电阻-基础练(解析版)
- 湖北联投集团2024校园招聘【298人】管理单位遴选500模拟题附带答案详解
- 2025年中考语文专题复习:记叙文阅读提炼信息(含练习题及答案)
- DZT0203-2020矿产地质勘查规范稀有金属类
- 中学实验室安全风险分级管控制度
- 部编版语文七年级下册第六单元《课外古诗词诵读》导学案(含答案)
- 文艺复兴史学习通超星期末考试答案章节答案2024年
- 血透患者常用药物及用药指导
- 2025届上海市静安区新中高级中学高二上生物期末检测模拟试题含解析
- 2024年新疆中考数学试卷(含答案解析)
- 眩晕病人的护理
评论
0/150
提交评论