Python程序设计基础及应用(微课版)课件 -第6章 函数_第1页
Python程序设计基础及应用(微课版)课件 -第6章 函数_第2页
Python程序设计基础及应用(微课版)课件 -第6章 函数_第3页
Python程序设计基础及应用(微课版)课件 -第6章 函数_第4页
Python程序设计基础及应用(微课版)课件 -第6章 函数_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《Python程序设计基础及应用》配套课件第六章

函数6.1函数定义6.2函数调用和返回值6.3

函数参数6.4lambda表达式6.5递归函数6.6

生成器函数6.7

内置函数和模块函数6.8

变量作用域6.1函数定义1.函数概述函数(function)是指一个有命名的、执行某个功能的语句序列。函数不仅可以实现代码的复用,还可以保证代码的一致性。设计函数时,应注意提高函数的内聚性,同时降低函数之间的隐式耦合。在实际项目开发中,往往会把一些通用的函数封装到一个模块中,这样更方便管理。2.函数定义Python不同于C语言,它将函数的声明和定义视为一体。定义函数的时候,需要指定函数的名字和语句序列。函数的定义语法如下:def函数名([形参列表]): #形参可有可无语句序列 #函数要完成功能的实现[return表达式]

#函数的返回值,可以没有2.函数定义自定义函数通过关键字def来定义,通过return语句指定返回值函数可以通过return语句同时返回多个值,如果没有return语句,则函数返回值为None函数的命名规则与变量名相同,不能是关键字,应该避免函数名和变量名同名函数的第1行称为函数头,必须以冒号“:”结束,其余部分称为函数体,函数体必须缩进。按照惯例,缩进总是4个空格(使用tab键)函数形参不需要声明类型,也不需要指定函数返回值类型2.函数定义当函数不需要任何参数时,也必须保留一对空的圆括号Python允许嵌套定义函数函数的形参和返回值可以是任何数据类型,包括函数可以使用pass关键字,表示函数什么也不做,起到占位的作用定义函数时,建议设置其docstring,提供函数的帮助文档,使用三双引号来定义docstring。2.函数定义defget_hobbies(name,hobbies):"""参数:name人名,hobbies个人爱好功能:返回个人爱好的字符串"""returnf"{name}爱好是{hobbies}" 6.2函数调用和返回值1.函数调用方式函数定义时,函数名后面括号中的变量称为“形式参数”(简称形参)形参只是起到占位的作用函数调用时,函数名后面括号中的参数称为“实际参数”(简称实参)函数定义时不需要声明形参类型,解释器会根据实参的类型自动推断形参类型函数调用时,实参会自动传递给形参。不同于C/C++/JAVA等语言,形参不决定实参的类型,编写程序时如果对实参类型有要求,一定要在函数定义中对实参进行类型检查。2.参数传递机制(1)传值函数调用时,实参的值复制一份给形参,形参和实参是两个独立的内存单元,修改形参不会影响实参。如果实参是整数、实数、复数等基本类型,或者是元组、字符串这样的不可变类型的数据,那么采用传值方式。(2)传地址函数调用时,实参的内存首地址传递给形参,形参和实参指向同一块内存地址,修改形参会影响实参。如果实参是可变序列(列表、字典、集合等),并且在函数内部使用下标或可变序列自身的方法增加、删除或修改形参元素,那么采用传地址方式。2.参数传递机制#传值方式defsub(num):num-=1 #修改形参的值不会影响实参test=100 #实参test为基本数据类型sub(test) #实参test的值复制给形参numprint(test) #输出:100,形参不影响实参#传地址defadd(s):s.append(10) #使用可变序列提供的方法修改形参会影响实参t=[1,2,3] f=add #将函数赋值给变量ff(t) #通过变量f来调用函数,实参t是列表,属于可变序列print(t) #输出:[1,2,3,10],形参影响了实参3.函数返回值Python函数的返回值类型和return语句返回的表达式类型一致,return语句可以结束当前函数的执行,将返回值带到函数调用处如果函数没有return语句,或者有return语句但是没有执行到,或者执行了不返回任何值的return语句,解释器都会认为该函数返回空值None函数可以返回一个或者多个值,返回值是多个时,会自动打包成元组的形式返回6.3函数参数1.位置参数位置参数(positionalarguments)位置参数是最常用的形式,调用函数时实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。defmenu(food,cigarette,wine):print("主食:",food,"香烟:",cigarette,"白酒:",wine)menu("面条","红塔山","郎酒")主食:面条香烟:红塔山白酒:郎酒2.默认值参数调用带有默认值参数的函数时,可以不用为设置默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值调用函数时是否为默认值参数传递实参是可选的需要注意的是,在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误函数的默认值参数是在函数定义时确定值的,只会被初始化一次2.默认值参数带有默认值参数的函数定义语法如下:def函数名(……,形参=默认值,/):函数体多次调用函数并且不为默认值参数传递实参时,默认值参数只在定义时进行一次解释和初始化。因此,对于列表、字典这样可变类型的默认值参数,可能会导致逻辑错误。2.默认值参数带有默认值参数的函数定义语法如下:def函数名(……,形参=默认值,/):函数体多次调用函数并且不为默认值参数传递实参时,默认值参数只在定义时进行一次解释和初始化。因此,对于列表、字典这样可变类型的默认值参数,可能会导致逻辑错误。2.默认值参数defbuggy(arg,result=[]): result.append(arg) print(result)buggy(3,[1,2]) #输出[1,2,3]buggy(3) #输出[3]

buggy(4) #输出[3,4]3.关键字参数关键字参数指调用函数时的参数传递方式,与函数定义无关通过关键字参数可以按照形参名字传递值,明确指定哪个值传递给哪个参数实参的顺序可以和形参的顺序不一致,并不影响参数值的传递结果menu(wine="茅台",food="米饭",cigarette="好猫")主食:米饭香烟:好猫白酒:茅台3.关键字参数关键字参数指调用函数时的参数传递方式,与函数定义无关通过关键字参数可以按照形参名字传递值,明确指定哪个值传递给哪个参数实参的顺序可以和形参的顺序不一致,并不影响参数值的传递结果可以混合位置参数和关键字参数,但是要确保位置参数在关键字参数的左边menu(wine="茅台",food="米饭",cigarette="好猫")主食:米饭香烟:好猫白酒:茅台menu("米粉",wine="五粮液",cigarette="云烟")主食:米粉香烟:云烟白酒:五粮液4.可变长度参数Python语言的一大特点就是支持可变长度参数,也就是在函数定义时可以使用个数不确定的参数,同一个函数可以使用不同个数的参数来调用。这使得函数更加通用,适用于多种情况。可变长度参数主要有两种形式:在参数名前加*或**。*parameter称为可变位置参数,用来接收多个位置参数并将其放在一个元组中**parameter称为可变关键字参数,用来接收多个关键字参数并将其存放到一个字典中4.可变长度参数defprint_args(arg1,arg2,*pargs,**kargs): print("arg1is",arg1) print("arg2is",arg2) foreachpargsinpargs: print("additionalpositionarg:",eachpargs) forkey,valueinkargs.items(): print(f"additionalkeywordarg:{key},{value}")print_args("主食","面条","白酒","汾酒",香烟="芙蓉王")6.4lambda表达式1.lambda表达式概述lambda表达式可以用来声明匿名函数,也就是没有函数名字临时使用的函数使用场合在使用函数作为参数的时候,如果传入的函数比较简单或者使用次数较少,直接定义这些函数就显得比较浪费,这时就可以使用lambda表达式。特点没有函数名、功能简单、只使用一次,本质上还是函数。1.lambda表达式概述lambda表达式语法如下:lambda<variables>:<expression>其中variables是函数的参数,expression是函数的返回值,它们之间用冒号:分隔lambda表达式只可以包含一个表达式,不允许包含选择、循环等语法结构表达式的计算结果可以看作是函数的返回值,不允许包含复合语句,但在表达式中可以调用其他函数2.lambda表达式使用lambda表达式可以作为sorted、map、filter和reduce等内置函数的参数。f=lambdax,y,z:max(x,y,z)print(f(10,20,30)) #输出:30list_a=[1,2,3,4,5]print(list(map(lambdax:x+10,list_a))) #输出:[11,12,13,14,15]defdemo(n): #自定义函数 returnn*nprint(list(map(lambdax:demo(x),(1,2,3,4))))#使用函数作为lambda表达式的返回值6.5递归函数1.递归函数概述直接或者间接调用自身的函数称为递归函数,递归函数的执行过程称为递归递归是一种分而治之的程序设计技术,它将一个大型、复杂规模的问题转换成一个与原问题相似的小规模问题进行求解,给出一个直观、简单的解决方案递归函数的特点如下:使用选择结构将问题分成不同的情况。会有一个或多个基础情况用来结束递归。非基础情况的分支会递归调用自身。每次递归调用会不断接近基础情况,直到变成基础情况终止递归。2.递归函数编写#

递归法求斐波那契数列第n项deffib(n): ifn==1orn==2: #递归结束条件 return1 else: returnfib(n-2)+fib(n-1)#递归,减少问题规模2.递归函数编写注意递归(recursion)函数的编写(结束条件)递归可能会导致堆栈的溢出,效率低下,但是简单使用递归时应认真考虑,能不用递归方式的时候,尽快使用非递归方式,如果非要用递归方式,可以使用缓存机制来实现使用缓存方式后,性能提升很明显。但是即使用到了缓存加速,仍然会受到递归深度的限制尽量采用迭代(iterate)方式来实现2.递归函数编写#使用迭代法求斐波那契数列第n项deffib(n): ifnin(1,2): #初始条件 return1 else: a=b=1 foriinrange(3,n+1): a,b=b,a+b #迭代公式 i+=1 returnb6.6生成器函数1.生成器函数概述生成器函数的语法和普通函数一样,只是返回数据时需要使用yield语句而非return语句。包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。与一般函数不同的是,一般函数在执行到return语句时,会立刻结束函数的运行,而生成器在每次执行到yield语句时,会返回一个中间的结果给调用者,之后会暂停或挂起后面代码的执行,下次通过生成器(iterator迭代器)对象的__next__()方法、内置函数next()、for循环遍历生成器对象元素或其他方式显式获取数据时,它会准确地从离开地方继续执行。2.生成器函数编写deff(): a,b=1,1 #序列解包,同时为多个元素赋值 whileTrue: yielda #暂停执行,需要时再产生一个新元素 a,b=b,a+b #序列解包,继续生成新元素a=f() #创建生成器对象next(a) #使用内置函数next()获取生成器对象中的元素#返回1next(a) #每次索取新元素时,由yield语句生成1next(a) #也可以调用生成器对象的__next__()方法#返回22.生成器函数编写defmy_range(first=0,last=10,step=1): number=first whilenumber<last: yieldnumber #返回中间值并暂停执行,下次调用时再产生一个新值 number+=stepranger=my_range(1,6)forxinranger: #迭代生成器对象 print(x,end='\t') #输出:123456.7内置函数和模块函数1.内置函数和模块函数概述Python解释器将一些频繁使用的功能封装起来,形成了内置函数(BIF,built-infunctions),以确保执行效率和代码复用性。内置函数使用时不需要导入任何模块,就可以直接调用。它的执行效率要高于标准库函数,实际编程时要尽量多的使用内置函数。执行dir(__builtins__)命令可以列出所有的内置函数,使用help(函数名)可以查看对应函数的用法。模块函数是指定义在模块中的函数,使用前需要导入所在的模块。2.常用内置函数2.常用内置函数2.常用内置函数内置函数bin()、oct()、hex()用来将整数转换为二进制、八进制和十六进制字符串形式>>>bin(555) #转换为二进制字符串'0b1000101011'>>>oct(555) #转换为八进制字符串'0o1053'>>>hex(555) #转换为十六进制字符串'0x22b'内置函数int(x,base=10)用来获取实数的整数部分,或者尝试把字符串按指定的进制转换为10进制数,base表示数字字符串的进制,为0、2-36。>>>int(-3.14) #获取实数的整数部分-3>>>int('1111',8) #把八进制数转换为十进制数5852.常用内置函数内置函数int(x,base=10)用来获取实数的整数部分,或者尝试把字符串按指定的进制转换为10进制数,base表示数字字符串的进制,为0、2-36。>>>int(-3.14) #获取实数的整数部分-3>>>int('1111',8) #把八进制数转换为十进制数585内置函数float()用来将其他类型数据转换为实数,complex()可以用来生成复数。>>>float(3)#把整数转换为实数3.0>>>float('3.5')#把数字字符串转换为实数3.5>>>complex(3,5)#指定实部和虚部(3+5j)2.常用内置函数ord()和chr()是一对功能相反的函数。ord()用来返回单个字符的Unicode码,而chr()则用来返回Unicode编码对应的字符。>>>ord('a') #查看指定字符的Unicode编码97>>>chr(65) #返回数字65对应的字符'A'>>>chr(ord('A')+1) #Python不允许字符串和数字之间的加法操作'B'>>>ord('董’)338912.常用内置函数str()则直接将任意类型参数转换为字符串。>>>str(1234) #数字转变成字符串'1234'>>>str([1,2,3]) #list转变成字符串'[1,2,3]'>>>str((1,2,3)) #tuple转变成字符串'(1,2,3)'>>>str({1,2,3}) #set转变成字符串'{1,2,3}'2.常用内置函数内置函数type()和isinstance()可以用来判断数据类型,常用来对函数参数进行检查,可以避免错误的参数类型导致函数崩溃或返回意料之外的结果。>>>type(3) #查看3的类型<class'int'>>>>type({3})in(list,tuple,dict)#判断{3}是否为list,tuple或dict类型的实例False>>>isinstance(3,int)#判断3是否为int类型的实例True2.常用内置函数max()、min()、sum()分别用于计算列表、元组或其他包含有限个元素的可迭代对象中所有元素最大值、最小值以及所有元素之和>>>max([1,2,3])>>>fromrandomimportrandint>>>a=[randint(1,100)foriinrange(10)]#包含10个[1,100]之间随机数的列表>>>print(max(a),min(a),sum(a))#最大值、最小值、所有元素之和>>>sum(a)/len(a)#平均值2.常用内置函数函数max()和min()还支持default参数和key参数,其中default参数用来指定可迭代对象为空时默认返回的最大值或最小值,而key参数用来指定比较大小的依据或规则,可以是函数或lambda表达式。>>>max(['2','111'])#不指定排序规则'2'>>>max(['2','111'],key=len)#返回最长的字符串'111'>>>print(max([],default=None))#对空列表求最大值,返回空值NoneNone2.常用内置函数>>>x=['21','1234','9’]>>>max(x)'9'>>>max(x,key=len)'1234'>>>max(x,key=int)'1234'2.常用内置函数range([start,]end[,step]):返回range对象,其中包含左闭右开区间[start,end)内以step为步长的整数,参数start默认为0,step默认为1。>>>range(5) #start默认为0,step默认为1range(0,5)>>>list(_) #idle中_表示上一次命令的结果[0,1,2,3,4]>>>list(range(1,10,2)) #指定起始值和步长[1,3,5,7,9]>>>list(range(9,0,-2)) #步长为负数时,start应比end大[9,7,5,3,1]2.常用内置函数排序函数sorted(x,key=None,reverse=False)对列表、元组、字典、集合或其他可迭代对象进行排序并返回新列表,默认升序排列,reverse为True时,降序排列>>>x=['1111','23','4','2','21']>>>sorted(x,key=len,reverse=True)#默认参数reverse为Fasle['1111','23','21','4','2']>>>sorted(x,key=int)['2','4','21','23','1111']2.常用内置函数逆序函数reversed()可以对可迭代对象(生成器对象和具有惰性求值特性的zip、map、filter、enumerate等类似对象除外)进行翻转(首尾交换),并返回可迭代的reversed对象。>>>x=range(1,11)>>>list(x)[1,2,3,4,5,6,7,8,9,10]>>>list(reversed(x))[10,9,8,7,6,5,4,3,2,1]2.常用内置函数内置函数map(func,iterableobject)把一个函数func依次映射到序列或迭代器对象的每个元素上,并返回一个可迭代的map对象作为结果。map对象中每个元素是原序列中元素经过函数func处理后的结果。>>>list(map(str,range(5))) #把列表中元素转换为字符串['0','1','2','3','4']>>>x=9876542.常用内置函数枚举函数numerate(iterable,start=0)函数用来枚举可迭代对象中的元素,返回可迭代的enumerate对象,其中每个元素都是包含索引和值的元组,start为索引开始值,默认为0>>>list(enumerate('abcd’)) #枚举字符串中的元素[(0,'a'),(1,'b'),(2,'c'),(3,'d')]>>>forindex,valueinenumerate(range(10,15)):#枚举range对象中的元素 print((index,value),end='')(0,10)(1,11)(2,12)(3,13)(4,14)2.常用内置函数拉链函数zip(iter1[,iter2[...]])函数用来把多个可迭代对象中的元素压缩到一起,返回一个可迭代的zip对象,其中每个元素都是包含原来的多个可迭代对象对应位置上元素的元组>>>list(zip('abcd',[1,2,3]))#压缩字符串和列表[('a',1),('b',2),('c',3)]>>>x=zip('abcd','1234')>>>list(x)[('a','1'),('b','2'),('c','3'),('d','4')]2.常用内置函数过滤函数filter()将一个单参数函数作用到一个序列上,返回该序列中使得该函数返回值为True的那些元素组成的filter对象,如果指定函数为None,则返回序列中等价于True的元素>>>seq=['foo','x41','?!','***']>>>deffunc(x): returnx.isalnum() #测试是否为字母或数字>>>list(filter(func,seq)) #把filter对象转换为列表['foo','x41']2.常用内置函数累计函数reduce()可以将一个【接收2个参数的函数】以迭代累积的方式从左到右依次作用到一个序列或迭代器对象的所有元素上,并且允许指定一个初始值调用格式:reduce(function,sequence[,initial])->value>>>fromfunctoolsimportreduce>>>seq=range(1,5)#包含1,2,3,4可迭代对象>>>reduce(lambdax,y:x+y,seq)3.常用模块函数math模块提供了众多功能强大的数学函数,可以有效提高编程效率使用这些函数时,需要使用“importmath”语句导入math模块3.常用模块函数编写程序时,经常需要提供一些随机数据。大多数编程语言提供了生成伪随机数的函数,这类函数被封装在random模块中3.常用模块函数fromrandomimportchoice,randint,choicesfirst_name=("张","王","李","赵","孙")final_name=("原悦","梓轩","晨曦","皓天","永康","舒梦","一诺")#模拟产生最多35个学生姓名和成绩name={choice(first_name)+choice(final_name)foriinrange(35)} scores=[[randint(30,100)foriinrange(5)]forjinrange(35)] name_scores=list(zip(name,scores)) #组合姓名和成绩name_scores=sorted(name_scores,key=lambdaitem:sum(item[1]))#按照总成绩升序排列3.常用模块函数fmy_list=[1,2,3,4,5]weights=[0.1,0.2,0.3,0.4,0.0]#指定每个元素的权重,最后一个元素几乎不会被选择chosen_elements_with_weights=random.choices(my_list,weights=weights,k=3)print(chosen_elements_with_weights)#输出[3,2,3],每次运行结果不同6.8变量作用域1.变量作用域概述变量起作用的代码范围称为变量的作用域不同作用域内变量名可以相同,但互不影响一个变量在函数外部定义和在函数内部定义,其作用域是不同的在函数内部定义的变量只在函数内部起作用,称为局部变量。当函数执行结束后,局部变量自动删除,不再可以使用局部变量的引用比全局变量速度快,应优先考虑使用函数之外定义的变量称为全局变量,它可以被所有的函数访问2.使用规则局部变量分为两种情况:函数外定义的变量,如果函数内需要为这个变量赋值,并要将这个赋值结果反映到函数外,那么可以在函数内使用global将其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论