版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Python3基础教程第3版慕课版单元5程序控制结构任务5-1:计算个人综合所得税【任务目标】【任务实施】演示过程……5.1.1
程序的基本控制结构程序的三种基本结构为:顺序结构、分支结构和循环结构。顺序结构的程序按语句的先后顺序依次执行各条语句。通常,程序默认为顺序结构Python总是从程序的第一条语句开始,按顺序依次执行语句。典型的顺序结构。#输入两个整数,用不同的转换方法a=eval(input('请输入第1个整数:'))b=int(input('请输入第2个整数:'))#将a转换为浮点数输出print('float(%s)='%a,float(a))print('格式化为浮点数:%e,%f'%(a,b))#创建复数输出print('complex(%s,%s)='%(a,b),complex(a,b))分支结构指程序根据条件执行不同的代码块。分支结构又可分为单分支结构、双分支结构和多分支结构,示例代码如下。ifx>0:print('%s是正数'%x) #条件x>0成立时执行该语句else:print('%s小于等于0'%x) #条件x>0不成立时执行该语句循环结构指程序根据条件重复执行同一个代码块示例代码如下。forxinrange(5): #x依次取0、1、2、3、4print(x) #重复执行该语句5次5.1.2分支结构--if语句if语句可实现程序的分支结构包括单分支结构、双分支结构和多分支结构分别可通过单分支if语句、双分支if语句、多分支if语句实现。1.
单分支if语句单分支if语句的基本结构如下。if条件表达式:
语句块当条件表达式计算结果为True时,执行语句块中的代码否则,不执行语句块中的代码。单分支if语句的执行流程如图所示示例代码如下。>>>x=5>>>ifx>0:...print(x,'是正数')...5是正数2.双分支if语句双分支if语句的基本结构如下。if条件表达式:
语句块1else:
语句块2当条件表达式计算结果为True时,执行语句块1中的代码;否则,执行语句块2中的代码。双分支if语句的执行流程如图所示示例代码如下。>>>x=-5>>>ifx>0:...print(x,'是正数')...else:...print(x,'不是正数')...-5不是正数3.多分支if语句多分支if语句的基本结构如下。if条件表达式1:
语句块1elif条件表达式2:
语句块2……elif条件表达式n:
语句块nelse:
语句块n+1else部分可以省略。多分支if语句的执行流程如图所示示例代码如下。>>>x=85>>>ifx<60:...print('不及格')...elifx<70:...print('及格')...elifx<90:...print('中等')...else:...print('优秀')...中等4.if…else三元表达式if…else三元表达式是简化版的if…else语句,其基本格式如下。表达式1if条件表达式else表达式2当条件表达式计算结果为True时,将表达式1的值作为三元表达式的结果;否则,将表达式2的值作为三元表达式的结果。示例代码如下。>>>a=2>>>b=3>>>x=aifa<belseb #a<b结果为True,将a的值2赋值给x>>>x2>>>x=aifa>belseb #a>b结果为False,将b的值3赋值给x>>>x35.列表三元表达式基本格式如下。[表达式1,表达式2][条件表达式]当条件表达式计算结果为False时,将表达式1的值作为三元表达式的值;否则,将表达式2的值作为三元表达式的值示例代码如下。>>>x=5>>>y=10>>>[x,y][x<y] #x<y结果为True,返回y的值10>>>[x,y][x>y] #x>y结果为False,返回x的值55.1.3分支结构语句——match语句match语句与C语言、Java语言中的switch语句类似,用于实现多分支结构,其基本结构如下。match表达式:case模式1:分支1case模式2:分支2……case_:分支nmatch语句将表达式的值依次与case语句中的模式进行匹配,如果匹配成功,则执行对应的分支。如果没有匹配成功,则不执行任何分支。“_”为通配符,可匹配任意值,即必定会匹配成功。1.匹配字面值match语句最简单的形式是将一个目标值与一个或多个字面值进行匹配,示例代码如下。#test5_10.py:判断三原色x=input('请输入一个表示颜色的字符:')matchx:case'r':print(x,'表示红色')case'g':print(x,'表示绿色')case'b':print(x,'表示蓝色')case_:print(x,'是无效字符')可以使用“|”符号在模式中组合多个字面值,示例代码如下。#test5_11.py:根据成绩输出分级评语x=int(input('请输入一个成绩(在[0,100]中的整数):'))matchx//10:#取x除以10的整数case9|10:print(x,'优秀')case7|8:print(x,'中等')case6:print(x,'及格')case_:print(x,'差或无效')2.在模式中使用变量match语句允许使用类似解包的模式,并可绑定变量,示例代码如下。#test5_12.py:判断二元组表示点的位置p=eval('('+input('请输入点坐标(逗号分隔):')+')')#将输入的点坐标转换为元组matchp:case(0,0):print(p,'为坐标原点')case(0,y):#匹配第1个值为0的任意二元组print(p,'为Y轴上的点')case(x,0):#匹配第2个值为0的任意二元组print(p,'为X轴上的点')case(x,y):#匹配任意二元组print(p,'不是坐标轴上的点')case_:#匹配非二元组print(p,'不是二元组')3.使用嵌套模式match语句允许使用嵌套模式,如包含二元组的列表,示例代码如下。#test5_13.py:使用嵌套模式匹配点列表p=[(2,0),(-2,0)]#预设二元组点列表matchp:case[]:print('点列表为空')case[(0,0)]:print('点列表只包含坐标原点')case[(x,y)]:print('点列表包含一个不是坐标原点的:(%s,%s)'%(x,y))case[(x1,0),(x2,0)]:print('点列表包含X轴上的两个点:(%s,0),(%s,0)'%(x1,x2))case_:print('其他列表:',p)4.为模式添加匹配条件可以使用if子句为模式添加匹配条件,示例代码如下。#test5_14.py:为模式添加匹配条件p=(2,0)#预设二元组matchp:case(x,y)ifx==y:print(p,'是直线y=x上的点')case(x,y):print(p,'不是直线y=x上的点')任务5-2:从文件中检索指定唐诗【任务目标】文件中按下面的格式保存了若干首唐诗。《春晓》作者:孟浩然春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少。……编写一个程序,输入唐诗名称,从文件中检索唐诗并输出,程序运行结果如下。输入唐诗名称:登鹳雀楼《登鹳雀楼》作者:王之涣白日依山尽,黄河入海流。欲穷千里目,更上一层楼。【任务实施】演示过程……5.2循环结构本节主要内容:for循环while循环循环控制:continue、break5.2.1遍历循环:forfor语句实现遍历循环,其基本格式如下。forvarinobject:
循环体else:
语句块2else部分可以省略。object是一个可迭代对象。for语句执行时,依次将object中的数据赋值给变量var——该操作称为迭代。var每赋值一次,则执行一次循环体。循环执行结束时,如果有else部分,则执行对应的语句块。else部分只在正常结束循环时执行。如果用break跳出循环,则不会执行else部分。在for语句中,用n表示object中数据的位置索引,for语句循环的执行流程如图所示示例代码如下。#用x迭代元组中的对象,其中包含了一个嵌套的子元组>>>forxin(1,2,3,(4,5)): ...print(x)...123(4,5)>>>forxin'book’:#用x迭代字符串中的每个字符...print(x)...book>>>forxin(1,2,3): ...print(x*2)...else: #else部分在循环正常结束时执行...print('loopover')...246loopover2.使用range()函数可以使用range()函数来生成包含连续多个整数的range对象,其基本格式为:range(end)range(start,end[,step])只指定一个参数(end)时,生成整数范围为0~end-1。指定两个参数(start和end)时,生成整数范围为start~end-1。整数之间的差值为step,step默认为1。示例代码如下。>>>forxinrange(3):...print(x)...012>>>forxinrange(-2,2):...print(x)...-2-101>>>forxinrange(-2,2,2):...print(x)...-20可在for循环中用多个变量来迭代序列对象,示例代码如下。>>>for(a,b)in((1,2),(3,4),(5,6)):...print(a,b)...123456#等价于fora,bin((1,2),(3,4),(5,6)):与赋值语句类似,可以用“*”表示给变量赋值一个列表,示例代码如下。>>>for(a,*b)in((1,2,'abc'),(3,4,5)):...print(a,b)...1[2,'abc']3[4,5]4.嵌套的for循环Python允许嵌套使用for循环,即在for循环内部使用for循环。例如,下面的代码输出100以内的素数——除了1和它本身之外不能被其他数整除的数是素数。print(1,2,3,end="") #1、2、3是素数,直接输出,end=""使后续输出不换行forxinrange(4,100):forninrange(2,x):ifx%n==0: #若余数为0,说明x不是素数,结束当前for循环breakelse:print(x,end='') #正常结束for循环,说明x是素数,输出else:print('over')5.2.2无限循环:while1.while语句循环的基本结构while语句基本结构如下。while条件表达式:
循环体else:
语句块2,else部分语句可以省略。while语句循环的执行流程如图所示。如果条件表达式始终为True,则构造无限循环——也称“死循环”。计算1+2+……+100。s=0n=1whilen<=100:s=s+nn=n+1print('1+2+...+100=',s)用while循环来输出100以内的素数。x=1whilex<100:n=2whilen<x-1:ifx%n==0:break #若余数为0,说明x不是素数,结束当前循环
n+=1else:print(x,end='') #正常结束循环,说明x没有被任何数整除,是素数,输出
x+=1else:print('over')2.嵌套使用while循环Python允许在while循环的内部使用while循环。例如,下面的代码输出九九乘法表。a=1whilea<10:b=1whileb<=a:print('%d*%d=%2d'%(a,b,a*b),end='')b+=1print()a+=15.2.3循环控制:break和continue在for循环和while循环中可以使用break和continue语句。break语句用于跳出当前循环,即提前结束循环(包括跳过else)。continue则用于跳过循环体剩余语句,回到循环开头开始下一次循环。用for循环找出100~999范围内的前10个回文数字——3位数中个位和百位相同的数字为回文数字。a=[]n=0forxinrange(100,999):s=str(x)ifs[0]!=s[-1]:continue #如果x不是回文数字,回到循环开头,x取下一个值开始循环
a.append(x) #x是回文数字,将其加入列表
n+=1 #累计获得的回文数字个数
ifn==10:break #找出10个回文数字时,跳出for循环print(a) #break跳出时,跳转到该处执行将上面的代码中的for循环改为while循环,可以实现相同的功能,代码如下。a=[];n=0;x=100whilex<999:s=str(x)ifs[0]!=s[-1]:x=x+1continue #x如果不是回文数字,回到循环开头,x取下一个值开始循环a.append(x) #x是回文数字,将其加入列表n+=1 #累计获得的回文数字个数x=x+1ifn==10:break #找出10个回文数字时,跳出while循环print(a) #break跳出时,跳转到该处执行任务5-3:捕捉处理程序中的异常【任务目标】修改下面的程序,为程序添加异常处理代码,在程序出错时输出异常信息。#test5_26.py:捕捉处理程序中的异常whileTrue:n=eval(input('请输入一个正整数:'))ifn==-1:break#输入-1时结束程序ifn<0:continue#计算n的阶乘s=1forxinrange(2,n+1):#当n不是整数时,会发生TypeError异常s*=xprint('%s!='%n,s)【任务实施】演示过程……5.3异常处理异常指程序在运行过程中发生的错误,异常会导致程序意外终止。异常处理可捕捉程序中发生的异常,执行相应的处理代码,避免程序意外终止。程序中的语法错误不属于异常。异常处理基本结构异常处理的基本结构如下。try:
可能引发异常的代码except异常类型名称:
异常处理代码else:
没有发生异常时执行的代码finally:
不管是否发生异常,都会执行的代码在处理异常时,将可能引发异常的代码放在try语句块中。在except语句中指明捕捉处理的异常类型名称,except语句块中为异常处理代码。程序运行时,如果try语句块中的代码发生了指定异常,则执行except语句块。else语句块中为没有发生异常时执行的代码,else语句块可以省略。finally部分的代码不管是否发生异常都会执行,可以省略finally语句块。示例代码whileTrue:n=eval(input('请输入一个正整数:'))ifn==-1:break #输入为-1时结束程序
ifn<0:continue#计算n的阶乘
s=1forxinrange(2,n+1): #当n不是整数时,会发生TypeError异常
s*=xprint('%s!='%n,s)捕捉异常whileTrue:try:n=eval(input('请输入一个正整数:'))ifn==-1:break #输入为-1时结束程序
ifn<0:continue#计算n的阶乘
s=1forxinrange(2,n+1): #当n不是整数时,会发生TypeError异常
s*=xprint('%s!='%n,s)
exceptTypeError: #异常处理
print('输入数据错误,必须是正整数!')Python内置的常见异常类型AttributeError:访问对象属性出错时引发的异常,例如访问不存在的属性或属性不支持赋值等。EOFError:使用input()函数读文件,遇到文件结束标志EOF时发生的异常。文件对象的read()和readline()方法遇到EOF时返回空字符串,不会引发异常。ImportError:导入模块出错引发的异常。IndexError:使用序列对象的下标超出范围时引发的异常。StopIteration:迭代器没有可执行迭代的迭代元素引发的异常。IndentationError:使用了不正确的缩进引发的异常。TabError:同时使用Tab键和空格导致缩进不一致引发的异常。TypeError:在运算或函数调用时,使用了不兼容的类型引发的异常。ZeroDivisionError:除数为0时引发的异常。5.3.1捕捉异常
1.捕捉多种异常使用多个except语句捕捉可能出现的多种异常如下。>>>x=[1,2]>>>try:...x[0]/0...exceptZeroDivisionError:...print('除0错误')...exceptIndexError:...print('索引下标超出范围')...else:...print('没有错误')...除0错误2.捕捉指定异常可以在except语句中同时指定要捕捉的多种异常,以便使用相同的异常处理代码进行统一处理。在except语句中可以使用as为异常类创建一个实例对象>>>x=[1,2]>>>try:...x[0]/0 #此处引发除0异常...except(ZeroDivisionError,IndexError)asexp: #处理多种异常...print('出错了:')...print('异常类型:',exp.__class__.__name__) #输出异常类名称...print('异常信息:',exp) #输出异常信息...出错了:异常类型:ZeroDivisionError异常信息:divisionbyzero3.捕捉所有异常except语句省略了异常类型,则不管发生何种类型的异常,均会执行except语句块中的异常处理代码>>>try:...2/0 #引发除0异常...except:...print('出错了') ...出错了sys.exc_info()方法sys.exc_info()方法返回一个三元组:(type,value,traceobj)type为异常类的类型,可用__name__属性获得异常类的名称。value为异常类的实例对象,直接将其输出可获得异常描述信息。traceobj是一个堆栈跟踪对象(traceback类的实例对象),使用traceback模块的print_tb()方法可获得堆栈跟踪信息示例代码>>>x=[1,2,3]>>>try:...print(x[3])...except:...importsys...x=sys.exc_info()...print('异常类型:%s'%x[0].__name__)...print('异常描述:%s'%x[1])...print('堆栈跟踪信息:')...importtraceback...traceback.print_tb(x[2])4.异常处理结构的嵌套Python允许在异常处理结构的内部嵌套另一个异常处理结构。在发生异常时,没有被内部捕捉处理的异常可以被外层捕捉。>>>x=[1,2]>>>try:...try:...5/0...exceptZeroDivisionError:...print('内部除0异常')...x[2]/2 #内部没有捕捉的异常...exceptIndexError:...print('外层下标越界异常')5.使用finally语句在异常处理结构中,可以使用finally语句定义终止行为。不管try语句块中是否发生异常,finally语句块中的代码都会执。try:print(5/0) #发生除0异常except:print('出错了!’) #发生异常后执行该语句finally:print('finally部分已执行!’) #不管是否发生异常,都会执行该语句print('over') #异常处理结构的后续代码5.3.2raise语句raise语句基本格式如下。raise异常类名 #创建异常类的实例对象,并引发异常raise异常类实例对象 #引发异常类实例对象对应的异常raise #重新引发刚发生的异常Python执行raise语句时,会引发异常并传递异常类的实例对象。1.用类名引发异常在raise语句中指定异常类名时,会创建该类的实例对象,然后引发异常,示例代码如下。>>>raiseIndexError #引发异常 Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError2.用异常类实例对象引发异常可以直接使用异常类实例对象来引发异常,示例代码如下。>>>x=IndexError() #创建异常类的实例对象>>>raisex #引发异常Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>3.传递异常不带参数的raise语句可再次引发刚发生过的异常,其作用就是向外传递异常,示例代码如下。>>>try:...raiseIndexError #引发IndexError异常...except:...print('出错了')...raise #再次引发IndexError异常4.指定异常信息在使用raise语句引发异常时,可以为异常类指定描述信息。>>>raiseIndexError('索引下标超出范围')Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError:索引下标超出范围>>>raiseTypeError('使用了不兼容类型的数据')Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:使用了不兼容类型的数据5.抛出另一个异常可以通过raise…from…语句,使用异常来引发另一个异常。>>>try:...5/0 #引发除0异常...exceptExceptionasx:...raiseIndexError('下标越界')fromx #引发另一个异常5.3.3assert语句assert语句的基本格式如下。assert条件表达式,dataassert语句在条件表达式的值为False时,引发AssertionError异常,data作为异常描述信息。>>>x=0>>>assertx!=0,'变量x的值不能为0'Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>AssertionError:变量x的值不能为0用try来捕捉assert语句引发的AssertionError异常。>>>try:...importmath...x=-5...assertx>=0,'参数x必须是非负数'...exceptExceptionasex:...print('异常类型:',ex.__class__.__name__)...print('异常信息:',ex)...异常类型:AssertionError异常信息:参数x必须是非负数综合实例:输出数字金字塔创建一个Python程序,输出数字金字塔分析:图形共9行每行前面的空格比上一行少一个第n行的数字为:n、n-1……1、2……nPython3基础教程第2版慕课版单元6函数与模块任务6-1:定义个人综合所得税计算函数【任务目标】修改任务5-1中实现的个人综合所得税计算程序,定义一个函数来完成个人综合所得税计算,将月工资及各项扣除费用作为参数传递给函数,函数返回应缴纳的个人综合所得税。调用函数,完成表6-1中3名员工的个人综合所得税计算。【任务实施】演示过程……6.1函数在实现大型项目时,程序员往往会将需要重复使用的代码提取出来,将其定义为函数,从而减轻编程工作量,也使程序结构简化。本节主要内容:定义函数调用函数函数的参数函数嵌套定义lambda函数递归函数函数列表程序设计方法简介6.1.1定义函数def语句用于定义函数,其基本格式如下。def函数名(参数表):
函数语句
return返回值参数和返回值都可省略,示例代码如下。>>>defhello(): #定义函数...print('Python你好')...>>>hello() #调用函数Python你好hello()函数没有参数和返回值,它调用print()函数输出一个字符串。为函数指定参数时,参数之间用逗号分隔。下面的例子为函数定义两个参数,并返回两个参数的和。>>>defadd(a,b): #定义函数...returna+b...>>>add(1,2) #调用函数36.1.2调用函数调用函数的基本格式如下。函数名(参数表)在Python中,所有的语句都是解释执行的,不存在如C/C++中的编译过程。def也是一条可执行语句,它完成函数的定义。Python中函数的调用必须出现在函数的定义之后。在Python中,函数也是对象(function对象)。def语句在执行时会创建一个函数对象。函数名是一个变量,它引用def语句创建的函数对象。可将函数名赋值给变量,使变量引用同一个函数>>>defadd(a,b): #定义函数...returna+b...>>>add #直接用函数名,可返回函数对象的内存地址<functionaddat0x00D41078>>>>add(10,20) #调用函数30>>>x=add #将函数名赋值给变量>>>x(1,2) #通过变量调用函数36.1.3函数的参数在函数定义的参数表中的参数称为形式参数,简称形参。调用函数时,参数表中提供的参数称为实际参数,简称实参。实参可以是常量、表达式或变量。实参是常量或表达式时,直接将常量或表达式计算结果传递给形参。在Python中,变量保存的是对象的引用,实参为变量时,参数传递会将实参对对象的引用赋值给形参。1.参数的多态性多态是面向对象的一个特点,指不同对象执行同一个行为可能会得到不同的结果。同一个函数,传递的实际参数类型不同时,可获得不同的结果,体现了多态性。>>>defadd(a,b): ...returna+b #两个参数执行加法运算...>>>add(1,2) #执行数字加法3>>>add('abc','def') #执行字符串连接'abcdef'>>>add((1,2),(3,4)) #执行元组合并(1,2,3,4)>>>add([1,2],[3,4]) #执行列表合并[1,2,3,4]2.参数赋值传递调用函数时会按参数的先后顺序,依次将实参传递给形参。例如,调用add(1,2)时,1传递给a,2传递给b。Python允许以形参赋值的方式,将实参传递给指定形参。>>>defadd(a,b):...returna+b...>>>add(a='ab',b='cd') #通过赋值来传递参数'abcd'>>>add(b='ab',a='cd') #通过赋值来传递参数'cdab'采用参数赋值传递时,因为指明了形参名称,所以参数的先后顺序已无关紧要。参数赋值传递的方式称为关键字传递,此时可将形参称为关键字。3.参数传递与共享引用>>>deff(x):...x=100...>>>a=10>>>f(a) >>>a10从结果可以看出,将实参a传递给形参x后,在函数中重新赋值x,并不会影响到实参a。这是因为Python中的赋值是建立变量到对象的引用。重新赋值时,意味着形参引用了新的对象。当实参引用的是可变对象,如列表、字典等时,若在函数中修改形参,通过共享引用,实参也引用修改后的对象,示例代码如下。>>>deff(a):...a[0]='abc' #修改对象的第一个元素值...>>>x=[1,2]>>>f(x) #调用函数,传递列表对象的引用>>>x #变量x引用的列表对象在函数中被修改['abc',2]如果不希望函数内的修改影响函数外的数据,应注意避免传递可变对象的引用。如果要避免列表在函数中被修改,可使用列表的副本作为实参,示例代码如下。>>>deff(a):...a[0]='abc' #修改对象的第一个元素值...>>>x=[1,2]>>>f(x[:]) #传递列表的副本>>>x #结果显示原列表不变[1,2]还可以在函数中对列表进行复制,调用函数时实参使用引用列表的变量,示例代码如下。>>>deff(a):...a=a[:] #复制列表...a[0]='abc' #修改列表的副本...>>>x=[1,2]>>>f(x) #调用函数>>>x #结果显示原列表不变[1,2]4.有默认值的可选参数在定义函数时,可以为参数设置默认值。调用函数时如果未提供实参,则形参取默认值,示例代码如下。>>>defadd(a,b=-100): #参数b默认值为-100...returna+b...>>>add(1,2) #传递指定参数3>>>add(1) #形参b取默认值-99应注意,带默认值的参数为可选参数,在定义函数时,应放在参数表的末尾。5.接受任意个数的参数在定义函数时,如果在参数名前面使用星号“*”,表示形参是一个元组,可接受任意个数的参数。调用函数时,可以不为带星号的形参提供数据示例代码如下。>>>defadd(a,*b):...s=a...forxinb: #用循环迭代元组b中的对象...s+=x #累加...returns #返回累加结果...>>>add(1)#不为带星号的形参提供数据,此时形参b为空元组1>>>add(1,2) #求两个数的和,此时形参b为元组(2,)3>>>add(1,2,3) #求3个数的和,此时形参b为元组(2,3)6>>>add(1,2,3,4,5) #求5个数的和,此时形参b为元组(2,3,4,5)156.必须通过赋值传递的参数Python允许使用必须通过赋值传递的参数。在定义函数时,带星号参数之后的参数必须通过赋值传递示例代码如下。>>>defadd(a,*b,c):...s=a+c...forxinb:...s+=x...returns...>>>add(1,2,3) #形参c未使用赋值传递,出错Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:add()missing1requiredkeyword-onlyargument:'c'>>>add(1,2,c=3) #形参c使用赋值传递6>>>add(1,c=3) #带星号参数可以省略4在定义函数时,也可单独使用星号,其后的参数必须通过赋值传递示例代码如下。>>>deff(a,*,b,c): #参数b和c必需通过赋值传递...returna+b+c...>>>f(1,b=2,c=3)66.1.4函数嵌套定义Python允许在函数内部定义函数,示例代码如下。>>>defadd(a,b): ...defgetsum(x): #在函数内部定义的函数,将字符串转换为Unicode码求和...s=0...forninx:...s+=ord(n)...returns...returngetsum(a)+getsum(b) #调用内部定义的函数getsum...>>>add('12','34') #调用函数202注意,内部函数只能在函数内部使用。6.1.5lambda函数lambda函数也称表达式函数,用于定义匿名函数。可将lambda函数赋值给变量,通过变量调用函数。lambda函数定义的基本格式如下。lambda参数表:表达式示例代码如下。>>>add=lambdaa,b:a+b #定义表达式函数,赋值给变量>>>add(1,2) #函数调用格式不变3>>>add('ab','ad')'abad'lambda函数非常适合定义简单的函数与def不同,lambda的函数体只能是一个表达式可在表达式中调用其他的函数,但不能使用其他的语句示例代码如下。>>>add=lambdaa,b:ord(a)+ord(b) #在lambda表达式中调用其他的函数>>>add('1','2')996.1.6递归函数递归函数是指在函数体内调用函数本身。例如,下面的函数fac()实现计算阶乘。>>>deffac(n): #定义函数...ifn==0: #递归调用的终止条件...return1...else:...returnn*fac(n-1) #递归调用函数本身...>>>fac(5)120注意,递归函数必须在函数体中设置递归调用的终止条件。如果没有设置递归调用终止条件,程序会在超过Python允许的最大递归调用深度后,产生RecursionError异常(递归调用错误)。6.1.7函数列表因为函数是一种对象,所以可将其作为列表元素使用,然后通过列表索引来调用函数示例代码如下。>>>d=[lambdaa,b:a+b,lambdaa,b:a*b] #使用lambda函数建立列表>>>d[0](1,3) #调用第一个函数4>>>d[1](1,3) #调用第二个函数3也可使用def定义的函数来创建列表,示例代码如下。>>>defadd(a,b): #定义求和函数...returna+b...>>>deffac(n): #定义求阶乘函数...ifn==0:...return1...else:...returnn*fac(n-1)>>>d=[add,fac] #建立函数列表>>>d[0](1,2) #调用求和函数3>>>d[1](5) #调用求阶乘函数120>>>d=(add,fac) #建立包含函数列表的元组对象>>>d[0](2,3) #调用求和函数5>>>d[1](5) #调用求阶乘函数120Python还允许使用字典来建立函数映射,示例如下。>>>d={'求和':add,'求阶乘':fac}#用函数add和fac建立函数映射>>>d['求和'](1,2) #调用求和函数3>>>d['求阶乘'](5) #调用求阶乘函数1206.1.8程序设计方法简介程序设计方法是思考、设计、编写程序的方法,也可称为编程范式。编程范式主要分为两大范式:命令式编程范式、声明式编程范式。这两大范式衍生出最基本的面向过程范式、面向对象范式、函数式范式和逻辑式范式4种子编程范式。面向过程范式和面向对象范式属于命令式编程范式,函数式范式和逻辑式范式属于声明式编程范式。Python支持面向过程范式、面向对象范式、函数式范式等多种子编程范式。1.面向过程范式面向过程范式也称过程式编程,是一种基于计算过程或运算流程的编程范式。过程式编程将计算任务描述为操作流程或步骤,逐步实现操作流程或步骤所要求的计算功能。面向过程程序是由多个过程组合而成的,其中包含顺序、分支和循环等程序控制结构。2.面向对象范式面向对象范式用类来表示实体,对象是类的实例。数据和操作被封装在对象中,数据是对象的数据成员,操作是对象的方法成员。执行方法时,对象根据来自方法的消息执行相应的计算,以实现交互并完成任务。3.函数式范式函数式范式是一种基于递归函数计算理论的范式,其程序由一系列函数组成,执行程序便是计算这些函数并对表达式求值。例如,Python中的list(map(lambdax:x*2,range(4))表达式通过多个函数调用生成列表[0,2,4,6]。Python还支持一种新的编程范式——生态式编程。Python通过数量庞大的第三方库,构成了一个覆盖众多应用领域的计算生态。在程序中,通过使用第三方库,只需要简单的程序代码即可实现功能复杂的应用程序。任务6-2:测试变量作用域【任务目标】运行下面的程序,关注程序中全局变量和本地变量的值。#test6_07.py:测试变量作用域a=10#赋值,创建全局变量defshow():a=100#赋值,创建本地变量print('inshow():a=',a)#输出本地变量ashow()print('全局变量:a=',a)#输出全局变量a【任务实施】演示过程……6.2变量的作用域变量的作用域是变量的可使用范围,也称为变量的命名空间。在第一次给变量赋值时,Python创建变量,变量创建的位置决定了变量的作用域。本节主要内容:作用域分类global语句nonlocal语句6.2.1作用域分类Python中变量的作用域可分为4种:本地作用域、函数嵌套作用域、文件作用域和内置作用域,如图所示本地作用域:没有内部函数时,函数体为本地作用域。函数内通过赋值创建的变量、函数参数的作用域都为本地作用域。函数嵌套作用域:包含内部函数时,函数体为函数嵌套作用域。文件作用域:程序文件(也称模块文件)的内部为文件作用域。内置作用域:Python运行时的环境为内置作用域,它包含Python的各种内置的变量和函数。内置作用域和文件作用域可称为全局作用域。根据作用域范围大小,通常将变量分为两种:全局变量和本地变量。在内置作用域和文件作用域内定义的变量都属于全局变量(函数则可称为全局函数)。在函数嵌套作用域和本地作用域内定义的变量都属于本地变量,本地变量也可称为局部变量(函数则可成为本地函数或局部函数)。考察下面的代码:#文件作用域a=10 #a是全局变量defadd(b): #参数b是函数add内的本地变量
c=a+b #c是函数add内的本地变量,a是函数外部的全局变量
returncprint(add(5)) #调用函数该程序在运行过程中,会创建4个变量:a、b、c和add,a和add是文件作用域内的全局变量,b和c是函数add内部的本地变量。另外该程序还用到了print这个内置函数,它是内置作用域中的全局变量。作用域外的变量与作用域内的变量名称相同时,以“本地”优先原则,此时外部的变量被屏蔽——称为作用域隔离原则。>>>a=10 #赋值,创建全局变量a>>>defshow():...a=100 #赋值,创建本地变量a...print('inshow():a=',a) #输出本地变量a...>>>show()inshow():a=100>>>a #输出全局变量a106.2.2global语句在函数内部给变量赋值时,默认情况下该变量为本地变量。为了在函数内部给全局变量赋值,Python提供了global语句,用于在函数内部声明全局变量示例代码如下。>>>defshow():...globala #声明a是全局变量...print('a=',a) #输出全局变量a...a=100 #给全局变量a赋值...print('a=',a)>>>a=10>>>show()a=10a=100>>>a1006.2.3nonlocal语句作用域隔离原则同样适用于嵌套函数。在嵌套函数内使用与外层函数同名的变量时,若该变量在嵌套函数内没有被赋值,则该变量就是外层函数的本地变量示例代码如下。>>>deftest():...a=10 #创建test函数的本地变量a...defshow():...print('inshow(),a=',a) #使用test函数的本地变量a...show()...print('intest(),a=',a) #使用test函数的本地变量a...>>>test()inshow(),a=10intest(),a=10修改上面的代码,在嵌套函数show()内为a赋值,代码如下。>>>deftest():...a=10 #创建test函数的本地变量a...defshow():...a=100 #创建show函数的本地变量a...print('inshow(),a=‘,a) #使用show函数的本地变量a...show()...print('intest(),a=',a) #使用test函数的本地变量a...>>>test()inshow(),a=100intest(),a=10如果要在嵌套函数内部为外层函数的本地变量赋值,Python提供了nonlocal语句。nonlocal语句与global语句类似,它声明变量是外层函数的本地变量,示例代码如下。>>>deftest():...a=10 #创建test函数的本地变量a...defshow():...nonlocala #声明a是test函数的本地变量...a=100 #为test函数的本地变量a赋值...print('inshow(),a=',a)#使用test函数的本地变量a...show()...print('intest(),a=',a) #使用test函数的本地变量a...>>>test()inshow(),a=100intest(),a=100任务6-3:调用模块中的唐诗检索函数【任务目标】参考任务5-2中的唐诗检索程序,编写一个唐诗检索函数,用文件名和唐诗名称作为参数,在文件中检索唐诗。如果检索到则返回唐诗内容,否则返回空字符串。将唐诗检索函数保存在一个程序文件中,将该文件作为模块使用,调用其中的唐诗检索函数检索指定的唐诗。【任务实施】演示过程……6.3模块模块也可称为库,是一个包含变量、函数或类的程序文件。模块中也可以包含其他各种Python语句。大型系统往往将系统功能划分为模块来实现,或者将常用功能集中在一个或多个模块文件中,然后在程序文件中导入并使用模块。Python也提供了大量内置模块,并可集成各种扩展模块。本节主要内容:导入模块导入时执行模块用import还是from重新载入模块模块搜索路径嵌套导入模块查看模块对象属性__name__属性和命令行参数隐藏模块变量6.3.1导入模块模块需要先导入,然后才能使用其中的变量、函数或者类等。可使用import或from语句导入模块,基本格式如下。import模块名称import模块名称as新名称from模块名称import导入对象名称from模块名称import导入对象名称as新名称from模块名称import*1.import语句import语句用于导入整个模块,可用as为导入的模块指定一个新名称。导入模块后,使用“模块名称.对象名称”格式来引用模块中的对象。>>>importmath #导入模块>>>math.fabs(-5) #调用模块中的函数5.0>>>math.e #使用模块中的常量2.718281828459045>>>fabs(-5) #试图直接使用模块中的函数,出错Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>NameError:name'fabs'isnotdefined>>>importmathasm #导入模块并指定新名称>>>m.fabs(-5) #通过新名称调用模块函数5.0>>>m.e #通过新名称使用模块常量2.7182818284590452.from语句from语句用于导入模块中的指定对象,导入的对象可直接使用,不需要使用模块名称作为限定符,示例代码如下。>>>frommathimportfabs #从模块导入指定函数>>>fabs(-5)5.0>>>frommathimporte #从模块导入指定常量>>>e2.718281828459045>>>frommathimportfabsasf1 #导入时指定新名称>>>f1(-10)10.03.from…import*语句使用星号时,可导入模块顶层的所有全局变量和函数示例代码如下。>>>frommathimport* #导入模块顶层的全局变量和函数>>>fabs(-5) #直接使用导入的函数5.0>>>e #直接使用导入的常量2.7182818284590456.3.2导入时执行模块import和from语句在执行导入操作时,会执行导入模块中的全部语句。只有执行了模块,模块中的变量和函数才会被创建,才能在当前模块中使用。只有在第一次执行导入操作时,才会执行模块。再次导入模块时,并不会重新执行模块。import和from语句是隐性的赋值语句,两者的区别如下。Python执行import语句时:会创建一个模块对象和一个与模块文件同名的变量,并建立变量和模块对象的引用关系。模块中的全局对象作为模块对象的属性或方法使用。再次导入模块时,不会改变模块对象属性的当前值。Python执行from语句时:会同时在当前模块和被导入模块中创建同名变量,这两个变量引用同一个对象。再次导入模块时,会重新将被导入模块中变量的引用重新赋值给当前模块的变量。再次导入时,会将被导入模块的变量的初始值赋值给前模块的变量。示例代码如下。首先,创建模块文件test.py,其代码如下。x=100 #赋值,创建变量xprint('这是模块test.py中的输出!') #输出字符串defshow(): #定义函数,执行时创建函数对象
print('这是模块test.py中的show()函数中的输出!')可将test.py放在系统D盘根目录中,然后进入系统命令提示符窗口,在D盘根目录中执行python.exe进入Python交互环境D:\>python……>>>importtest #导入模块,下面的输出说明模块在导入时被执行这是模块test.py中的输出!>>>test.x #使用模块变量100>>>test.x=200 #为模块变量赋值>>>importtest #重新导入模块>>>test.x #使用模块变量,输出结果显示重新导入未影响变量的值200>>>test.show() #调用模块函数这是模块test.py中的show()函数中的输出!>>>abc=test #将模块变量赋值给另一个变量>>>abc.x #使用模块变量200>>>abc.show() #调用模块函数这是模块test.py中的show()函数中的输出!下面的代码使用from语句导入test模块。>>>fromtestimportx,show #导入模块的变量x、show这是模块test.py中的输出!>>>x #输出模块的变量的初始值100>>>show() #调用模块函数这是模块test.py中的show()函数中的输出!>>>x=200 #这里是为当前模块的变量赋值>>>fromtestimportx,show #重新导入>>>x #x的值为模块的变量的初始值100在执行from语句时,test模块的所有语句均被执行。from语句将test模块的变量x和show赋值给当前模块的变量x和show。语句“x=200”为当前模块的变量x赋值,不会影响test模块的变量x。在重新导入时,当前模块变量x被重新赋值为test模块的变量x的值。6.3.3用import还是from在使用import语句导入模块时,模块的变量使用“模块名.”作为限定符,所以不存在歧义,即使导入模块的变量与其他模块的变量同名也没有关系。在使用from语句导入模块时,就需要注意多个模块中是否存在同名变量的情况。1.使用模块内的可修改对象使用from导入模块时,可以直接使用变量引用模块中的对象,从而避免输入“模块名.”作为限定词。这种便利有时也会遇到麻烦。在下面的模块test3.py中,变量x引用了整数对象100(100是不可修改对象),y引用了一个可修改的列表对象。x=100 #赋值,创建整数对象100和变量x,变量x引用整数对象100y=[10,20] #赋值,创建列表对象[10,20]和变量y,变量y引用列表对象下面的代码使用from导入模块test3。>>>x=10 #创建当前模块的变量x>>>y=[1,2] #创建当前模块的变量y>>>fromtest3import* #引用模块中的x和y>>>x,y #输出结果显示确实引用了模块中的对象(100,[10,20])>>>x=200 #赋值,使当前模块的变量x引用整数对象200>>>y[0]=['abc'] #修改第一个列表元素,此时会修改模块中的列表对象>>>importtest3 #再次导入模块>>>test3.x,test3.y #输出结果显示模块中的列表对象已被修改(100,[['abc'],20])2.使用from导入两个模块中的同名变量在下面的两个模块test4.py和test5.py中包含了同名的变量。#test4.pydefshow():print('outintest4.py’)#test5.pydefshow():print('outintest5.py')当两个模块存在同名变量时,使用from语句导入模块会导致变量名冲突,示例代码如下。>>>fromtest4importshow>>>fromtest5importshow>>>show()outintest5.py>>>fromtest5importshow>>>fromtest4importshow>>>show()outintest4.py当两个模块存在同名变量时,应使用import语句导入模块,示例代码如下。>>>importtest4>>>importtest5>>>test4.show()outintest4.py>>>test5.show()outintest5.py6.3.4重新载入模块再次使用import或from语句导入模块时,不会重新执行模块代码,所以不会改变模块中变量的值。Python在importlib模块中提供的reload()函数,它可重新载入模块(即执行模块代码),从而改模块中变量的值。reload()函数用模块名称作为参数,所以只能重新载入使用import语句导入的模块。如果要重新载入的模块还没有导入,执行reload()函数会出错>>>importtest #导入模块,模块代码被执行这是模块test.py中的输出!>>>test.x100>>>test.x=200>>>importtest #再次导入>>>test.x #再次导入没有改变当前值200>>>fromimpimportreload #导入reload函数>>>reload(test) #重载模块,可以看到模块代码被再次执行这是模块test.py中的输出!<module'test'from'D:\\Python35\\test.py'>>>>test.x #因为模块代码再次执行,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训部年度工作总结
- 一髋肌二大腿肌三小腿肌四足肌五下肢筋膜六下肢局部
- 中国商贸文化商道
- 《经史关系》课件
- 病案管理奖惩制度
- 可再生能源建筑应用数据监测系统技术规程(报批稿)
- 关节外科围手术期护理
- 中心静脉导管置换护理
- 数学学案:课堂导学第一讲二极坐标系
- 《员工有效激励》课件
- 河南省部分名校2024-2025学年高三上学期11月阶段性测试(三)(期中)地理 含答案
- 部编小语六上《爱的教育》整本书阅读学习任务群教学设计
- 工余安健环知识培训
- (人教版2024)七年级英语上册Unit 5 综合复习课件
- 2024年中级司泵工职业鉴定考试题库(精练500题)
- GB/T 19963.2-2024风电场接入电力系统技术规定第2部分:海上风电
- 期中 (试题) -2024-2025学年外研版(三起)英语六年级上册
- 蒂升技能等级考试复习试题及答案
- 2024新信息科技四年级《第二单元 用编码描绘世界》大单元整体教学设计
- 小学生防性侵安全教育主题班会课件
- DBT29-305-2024 天津市装配式建筑评价标准
评论
0/150
提交评论