Python程序设计教程授课教师:职务:第3章Python函数课程描述函数(function)由若干条语句组成,用于实现特定的功能。函数包含函数名、若干参数和返回值。一旦定义了函数,就可以在程序中需要实现该功能的位置调用该函数,给程序员共享代码带来了很大方便。在Python语言中,除了提供丰富的系统函数(本书前面已经介绍了一下常用的系统函数)外,还允许用户创建和使用自定义函数。本章知识点3.1声明和调用函数3.2参数和返回值3.3Python内置函数3.1声明和调用函数3.1.1自定义函数3.1.2调用函数3.1.3变量的作用域3.1.4在调试窗口中查看变量的值3.1.1自定义函数可以使用def关键字来创建Python自定义函数,其基本语法结构如下:def函数名(参数列表):函数体参数列表可以为空,即没有参数;也可以包含多个参数,参数之间使用逗号(,)分隔。函数体可以是一条语句,也可以由一组语句组成。【例3-1】创建一个非常简单的函数PrintWelcome,它的功能是打印字符串“欢迎使用Python”,代码如下:defPrintWelcome():print(欢迎使用Python);【例3-2】定义函数PrintString(),通过参数决定要打印的内容。defPrintString(str):print(str);变量str是函数的参数。在函数体中,参数可以像其他变量一样被使用。可以在函数中定义多个参数,参数之间使用逗号分隔。【例3-3】定义一个函数sum(),用于计算并打印两个参数之和。函数sum()包含两个参数。参数num1和num2,代码如下:defsum(num1,num2):print(num1+num2);3.1.2调用函数可以直接使用函数名来调用函数,无论是系统函数还是自定义函数,调用函数的方法都是一致的。【例3-4】defPrintWelcome():print(欢迎使用Python);PrintWelcome();【例3-5】defPrintString(str):print(str);PrintString(传递参数);【例3-6】defsum(num1,num2):print(num1+num2);sum(1,3);3.1.3变量的作用域在函数中也可以定义变量,在函数中定义的变量被称为局部变量。局部变量只在定义它的函数内部有效,在函数体之外,即使使用同名的变量,也会被看作是另一个变量。相应地,在函数体之外定义的变量是全局变量。全局变量在定义后的代码中都有效,包括它后面定义的函数体内。如果局部变量和全局变量同名,则在定义局部变量的函数中,只有局部变量是有效的。【例3-7】a=100;#全局变量defsetNumber():a=10;#局部变量print(a);#打印局部变量asetNumber();print(a);#打印全局变量$a3.1.4在调试窗口中查看变量的值1.设置断点2.单步调试1.设置断点断点是调试器的功能之一,可以让程序中断在需要的地方,从而方便对其进行分析。用鼠标右击要设置断点的程序行,在快捷菜单里选择SetBreakpont菜单项,会在当前行设置断点,该行代码会显示黄色背景。2.单步调试设置断点后,运行程序,可以停在断点处,然后一条语句一条语句的单步运行。单步调试可以看到程序的运行过程,同时可以查看在某一时刻某个变量的值。下面介绍在IDLE中单步调试程序的方法。例如在IDLE中打开例3-7.py,然后在菜单中选择Run/PythonShell,打开PythonShell窗口。在PythonShell的菜单中,选择Debug/Debugger,PythonShell窗口中会出现下面文字,[DEBUGON]同时打开DebugControl窗口程序停留在第1行程序停留在断点处3.2参数和返回值3.2.1在函数中传递参数3.2.2函数的返回值3.2.1在函数中传递参数1.普通参数Python实行按值传递参数。值传递指调用函数时将常量或变量的值(通常称其为实参)传递给函数的参数(通常称其为形参)。值传递的特点是实参与形参分别存储在各自的内存空间中,是两个不相关的独立变量。因此,在函数内部改变形参的值时,实参的值一般是不会改变的。6.1.2小节介绍的实例都属于按值传递参数的情况。【例3-8】在函数中按值传递参数的例子deffunc(num):num+=1;a=10func(a);print(a);【例3-9】分别打印形参和实参的地址deffunc(num):print(形参num的地址,id(num))a=10func(a);print(实参a的地址,id(a));运行结果如下:形参num的地址1557053600实参a的地址15570536002.列表和字典参数【例3-10】使用列表作为函数参数的例子。defsum(list):total=0;forxinrange(len(list)):print(list[x],+);total+=list[x];print(=,total);list=[15,25,35,65]sum(list);运行结果15+25+35+65+=140【例3-11】使用字典作为函数参数的例子defprint_dict(dict):for(k,v)indict.items():printdict[%s]=%k,vdict={a:apple,b:banana,g:grape,o:orange}print_dict(dict);运行结果dict[o]=orangedict[g]=grapedict[a]=appledict[b]=banana【例3-12】在函数中修改列表参数的例子defswap(list):temp=list[0]list[0]=list[1]list[1]=templist=[1,2]print(list)swap(list)print(list)运行结果[1,2][2,1]【例3-13】在函数中修改字典参数的例子defchangeA(dict):dict['a']=1d={'a':10,'b':20,'c':30}changeA(d)print(d)运行结果{'c':30,'a':1,'b':20}3.参数的默认值在Python中,可以为函数的参数设置默认值。可以在定义函数时,直接在参数后面使用“=”为其设置默认值。在调用函数时可以不指定拥有默认值的参数的值,此时在函数体中以默认值作为该参数【例3-14】设置参数默认值的例子defsay(message,times=1):print(message*times)say('hello')say('Python',3)函数say()有2个参数:message和times。其中times的默认值为1。运行结果如下:helloPythonPythonPython【例3-15】deffunc1(a=1,b,c=10):d=a+b*c;func(10,20,30)【例3-15】的运行结果4.可变长参数Python还支持可变长度的参数列表。可变长参数可以是元祖或字典。当参数以*开头时,表示可变长参数将被视为一个元祖,格式如下:deffunc(*t):在func()函数中t被视为一个元祖,使用t[index]获取每一个可变长参数。可以使用任意多个实参调用func()函数,例如:func(1,2,3,4)【例3-16】以元祖为可变长参数的实例deffunc1(*t):print(可变长参数数量如下:)print(len(t))print(依次为:)forxinrange(len(t)):print(t[x]);func1(1,2,3,4);运行结果如下:可变长参数数量如下:4依次为:1234【例3-17】使用可变长参数计算任意个指定数字之和defsum(*t):sum=0;forxinrange(len(t)):print(str(t[x])++);sum+=t[x];print(=+str(sum));sum(1,2);sum(1,2,3,4);sum(11,22,33,44,55);结果如下1+2+3+4+=1011+22+33+44+55+=1651+2+3+4+=10【例3-18】defsum(*t):sum=0;forxinrange(len(t)):print(str(t[x])++);sum+=t[x];iflen(t)0:print(=+str(sum));sum();【例3-19】defsum(**t):print(t);sum(a=1,b=2,c=3);运行结果如下:{'a':1,'c':3,'b':2}3.2.2函数的返回值对【例3-6】中的sum()函数进行改造,通过函数的返回值返回相加的结果,代码如下:defsum(num1,num2):returnnum1+num2;print(sum(1,3));运行结果为4。【例3-21】deffilter_even(list):list1=[];foriinrange(len(list)):iflist[i]%2==0:list1.append(list[i])i-=1;returnlist1;list=[1,2,3,4,5,6,7,8,9,10]list2=filter_even(list)print(list2);3.3Python内置函数3.3.1数学运算函数3.3.2字符串处理函数3.3.3其他常用内置函数3.3.1数学运算函数函数原型具体说明abs()abs(x)返回x的绝对值pow()pow(x,y)返回x的y次幂Round()round(x[,n])返回浮点数x的四舍五入值,参数n指定保留的小数位数divmod()divmod(a,b)返回a除以b的商和余数,返回一个元组。例如divmod(a,b)返回(a/b,a%b)【例3-22】print(abs(-1));print(round(80.23456,2))print(pow(2,3))print(divmod(8,3));运行结果如下:180.238(2,2)3.3.2字符串处理函数1.字符串中字符大小写的变换函数原型具体说明lower()str.lower()将字符串str中的字母转换为小写字母upper()str.upper()将字符串str中的字母转换为大写字母swapcase()str.swapcase()将字符串str中的字母大小写互换capitalize()str.capitalize()将字符串str中的首字母大写title()str.title()将字符串str中的首字母大写,其余为小写【例3-23】str1=helloworld;str2=HELLOWORLD;str3=Helloworld;print(str1.upper());print(str2.lower());print(str3.swapcase())print(str3.swapcase())print(str1.capitalize());print(str2.title());运行结果HELLOWORLDhelloworldhELLOWORLDhELLOWORLDHelloworldHelloWorld2.指定输出字符串时的对齐方式函数原型具体说明ljust()str.ljust(width,[fillchar])左对齐输出字符串str,总宽度为参数width,不足部分以参数fillchar指定的字符填充,默认使用空格填充rjust()str.rjust(width,[fillchar])右对齐输出字符串str,总宽度为参数width,不足部分以参数fillchar指定的字符填充,默认使用空格填充center()str.center(width,[fillchar])居中对齐输出字符串str,总宽度为参数width,不足部分以参数fillchar指定的字符填充,默认使用空格填充zfill()str.zfill(width)将字符串str变