Python程序设计基础_第1页
Python程序设计基础_第2页
Python程序设计基础_第3页
Python程序设计基础_第4页
Python程序设计基础_第5页
已阅读5页,还剩299页未读, 继续免费阅读

下载本文档

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

文档简介

第1章Python语言

及其编程环境本章教学目标:

了解Python语言的特点。

学会Python编程环境的安装。

逐步熟悉使用一种第三方Python编辑器。1.1Python语言概述Python是一种面向对象、解释型计算机程序设计语言,由GuidovanRossum于1989年底发明,第一个公开发行版发行于1991年,Python源代码同样遵循GPL(GNUGeneralPublicLicense)协议。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。正因为Python语言的简洁、优雅、开发效率高,它常被用于网站开发,网络编程,图形处理,黑客编程等等。TIOBE2016年8月编程语言排行榜是一种面向对象、解释型计算机程序设计语言纯粹的自由软件Python语法简洁清晰,用空格(space)作为语句缩进Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。Python快速生成程序的原型封装Python可以调用的扩展类库跨平台,程序无需修改在Windows、Linux、Unix、Mac等操作系统上使用Web开发,基于python的优秀web框架如Django网络编程,网页解析,如爬虫程序开发科学计算,各种实验数据的处理以及相关实验模拟等,机器学习等高性能服务器后端(高并发,高吞吐率服务)开源库开发需要什么应用就能找到什么库TheZenofPython,byTimPetersBeautifulisbetterthanugly.Explicitisbetterthanimplicit.Simpleisbetterthancomplex.Complexisbetterthancomplicated.Flatisbetterthannested.Sparseisbetterthandense.Readabilitycounts.Specialcasesaren'tspecialenoughtobreaktherules.Althoughpracticalitybeatspurity.Errorsshouldneverpasssilently.Unlessexplicitlysilenced.Inthefaceofambiguity,refusethetemptationtoguess.Thereshouldbeone--andpreferablyonlyone--obviouswaytodoit.Althoughthatwaymaynotbeobviousatfirstunlessyou'reDutch.Nowisbetterthannever.Althoughneverisoftenbetterthanrightnow.Iftheimplementationishardtoexplain,it'sabadidea.Iftheimplementationiseasytoexplain,itmaybeagoodidea.Namespacesareonehonkinggreatidea--let'sdomoreofthose!Python之禅byTimPeters优美胜于丑陋,显式优于隐式简洁胜于复合,复合胜于复杂扁平胜于嵌套,稀疏胜于密集可读性很重要虽然语言的实用性胜于其纯粹性,也不可因此而打破规则不要以沉默对待错误,除非明显需要忽略错误面对模棱两可,拒绝猜测的诱惑应该有一种(最好只有这一种)显而易见的解决之道虽然这个解决之道一开始并不一定显而易见,除非你是那个荷兰人(Guido)

马上做胜于永远不做,但盲目动手做有时还不如不做如果某个实现难以阐释,那么这通常是个糟糕的方案如果某个实现容易解释,那么它可能是个好主意命名空间是个绝妙的发明——我们应该多做尝试优雅、明确、简单1.2Python的安装Python语言经历了一个重要且痛苦的版本更迭过程,即从Python2.x升级到Python3.x3.x版本与2.x版本并不完全兼容,大批用Python2.x版本编写的库函数无法在3.x下使用但至2015年初,绝大多数Python语言编写的库函数都可以稳定高效地在Python3.x版本下运行企业和专业的Python程序员已在使用Python3.x版本Python3.x以后的版本升级将是Python语言的未来选择哪个版本1.3Python语言程序设计步骤Python的源程序以.py为扩展名。当运行.py源程序时,系统会自动生成一个对应的.pyc字节编译文件,用于跨平台运行和提高运行速度。另外,还有一种扩展名为.pyo的文件,是Python编译优化后的字节编译文件。Python使用缩进来表示代码块,习惯上缩进4个半角空格,同一个代码块的语句必须包含相同的缩进空格数,不建议随意变化缩进空格数或使用制表位键。Python通常是一行写完一条语句,但如果语句很长,可以使用反斜杠“\”来实现多行语句。Python可以在同一行中放置多条语句,语句之间使用分号“;”分割,但为可读起见,不建议在同一行中放置多条语句。Python中单行注释以“#”开头。在程序调试时临时需要不执行某些行时,建议在不执行的行前加“#”,可避免大量删改。1.4常用的Python第三方编辑器Python程序员通常选用第三方集成开发环境(IDE,IntegratedDevelopmentEnvironment)进行程序设计。常用的IDE有Notepad++,PyScripter,PyCharm,EclipsewithPyDev,Komodo,WingIDE等,它们通常具有一些自动代码完成、参数提示、代码错误检查等功能PyScript2.6

绿色软件,支持python3.4,支持64bit,良好代码提示,支持中文,免费PyScript使用中文编码的设置PyCharm5

支持python3.x,良好代码提示,中文编码不需设置,免费版Python功能齐全但菜单为英文第2章Python程序的

基本语法本章教学目标:

熟悉Python语言的基本语法。

理解数字数据类型的特点及其操作方法。

掌握字符串数据类型的特点及其操作方法。

逐步熟悉Python的基本运算、表达式和优先级。2.1Python语言源程序的书写格式与基本规则2.1.1Python语言源程序模块结构初识2.1.2基本词法单位、标识符/常量/运算符等构成规则与关键字合法的标识符必须遵守以下规则:

由一串字符组成,字符可以是任意字母、数字、下画线、汉字,但这串字符中的开头字符不能是数字;

不能与关键字同名。关键字也称为“保留字”,是被语言保留起来具有特殊含义的词,不能再用于起名字。【例2-1】查看Python语言的所有关键字。

>>>importkeyword>>>keyword.kwlist['False','None','True','and','as','assert','break','class','continue','def','del','elif','else','except','finally','for','from','global','if','import','in','is','lambda','nonlocal','not','or','pass','raise','return','try','while','with','yield']变量是指在运行过程中值可以被修改的量。变量的名称除必须符合标识符的构成规则外,要尽量遵循一些约定俗成的规范:

除了循环控制变量可以使用i或者x这样的简单名字外,其他变量最好使用有意义的名字,以提高程序的可读性。例如,表示平均分的变量应使用average_score或者avg_score,而不建议用as或者pjf。直接用汉字命名也是可以的,但限于输入烦琐和编程环境对汉字兼容等因素,习惯上很少使用。

用英文名字时,多个单词之间为表示区隔,可以用下画线来连接不同单词,或者把每个单词的首字母大写。

用于表示固定不变值的变量名称一般用全大写英文字母,例如:PI,MAX_SIZE。变量一般使用大小写混合的方式。

因为以下画线开头的变量在Python中有特殊含义,所以,自定义名称时,一般不用下画线作为开头字符。此外,还要注意Python标识符是严格区分大小字母的。2.1.3程序的书写格式与基本规则缩进分号长语句行括号空行空格注释文档字符串文档字符串可以通过对象的__doc__成员被自动提取书写文档字符串时,在其前、后使用三重双引号"""或三重单引号'''2.2Python的基本数据类型2.2.1数字Python的数字有4种数据类型:整数(int)、浮点数(float)、布尔值(bool)、复数(complex)type(object)返回object的数据类型isinstance(obj,class)测试对象obj是否为指定类型class的实例2.2.2字符串1.字符串的组成(1)字符串(String)字符串是由字符组成的序列字符串和数字一样,都是不可变对象。(2)字符串界定符①单引号②双引号③三引号(3)转义符反斜杠(\)为转义字符2.字符串操作的相关方法(1)字符串长度

len()函数(2)字符串连接利用加法运算符“+”可以让两个字符串首尾相连(3)字符串重复利用乘法运算符“*”可以让一个字符串自身多次重复并拼接在一起(4)字符串索引利用方括号运算符[]可以通过索引值得到相应位置(下标)的字符:①从前往后的正向索引,n个字符的字符串,其索引值从0至n-1;②从后向前的负数索引,n个字符的字符串,其索引值从-1

至-n(5)字符串切片在Python程序中,可使用切片(slice)从字符串中提取子串。切片的参数是用两个冒号分隔的三个数字:第一个数字表示切片开始位置(默认为0)第二个数字表示切片截止位置(但不包含这个位置,默认为字符串长度)第三个数字表示切片的步长(默认为1),当步长省略时,可以顺便省略最后一个冒号>>>a='Python'>>>a[1:4]#切片实际包含索引位置为1~3的字符'yth'>>>a#切片返回的是字符串的一个副本,原字符串没有发生变化'Python'>>>a[:4]#省略第一个数字,表示切片从位置0开始'Pyth'>>>a[1:]#省略第二个数字,表示切片至字符串末尾结束'ython'>>>a[::]'Python'>>>a[::2]#步长为2'Pto'>>>a[::-1]#步长为-1,得到倒序字符串'nohtyP'>>>a[:100]#截止位置越界,切片到末尾结束'Python'>>>a[100:]#起始位置越界,返回空字符串

''2.3Python的基本运算和表达式2.3.1变量1.变量的赋值和存储(1)变量定义在Python中没有专门的变量定义语句,变量定义是通过对变量第一次进行赋值来实现(2)删除变量使用del命令可以删除一个对象(包括变量、函数等),删除之后就不能再访问这个对象了,因为它已经不存在了。当然,也可以通过再次赋值重新定义x变量(3)变量引用Python的变量实质是引用(4)变量修改赋值Python变量可以通过赋值来修改变量的“值”,但并不是原地址修改id()函数可以确切地知道变量引用的内存地址

使用运算符is可以判断两个变量是否引用同一个对象2.变量类型的转换(1)float()函数。将其他类型数据转换为浮点数(2)str()函数。将其他类型数据转换为字符串(3)int()函数。将其他类型数据转换为整型(4)round()函数。将浮点型数值圆整为整型(5)bool()函数。将其他类型数据转换为布尔类型(6)chr()和ord()函数。进行整数和字符之间的相互转换2.3.2运算符Python支持算术运算符、赋值运算符、关系运算符、逻辑运算符等基本运算符。按照运算所需要的操作数数目,可以分为单目、双目、三目运算符。

单目运算符只需要一个操作数。例如:单目减(-)、逻辑非(not)。

双目运算符需要两个操作数。Python大多数运算符是双目运算符。三目运算符需要三个操作数。条件运算是三目运算符,例如:b

if

a

else

c运算符的结合性:左结合或右结合

左结合就是自左至右依次计算。Python运算符大多是左结合的。

右结合就是自右至左依次计算。所有的单目运算符和圆括号()是右结合的。实际上圆括号是自右向左依次运算的,即内层的圆括号更优先,从内向外运算2.3.3算术运算算术运算符的优先级,按照从低到高排列常用的Python数学运算类的内置函数math模块中的函数2.3.4输入、输出1.输入x=input(<提示字符串>)2.输出print(<输出值1>[,<输出值项2>,…,<输出值n>,sep=',',end='\n'])字符串格式化的一般形式是:

format_string%obj

把对象obj按格式要求转换为字符串格式化字符串的函数str.format()进行字符串格式化。在形式上相当于通过{}来代替%,例如:

"{0}的年龄是{1}".format("张三",20)

可将字符串格式化输出为"张三的年龄是20"2.3.5赋值、关系和逻辑运算1.赋值运算符赋值运算符用“=”表示,一般形式为:

变量=表达式

2.关系运算符关系运算符也称为比较运算符,可以对两个数值型或字符串型数据进行大小比较,返回一个“真”或“假”的布尔值2.3.6表达式表达式由运算符和参与运算的数(操作数)组成。操作数可以是常量、变量,可以是函数的返回值。按照运算符的种类,表达式可以分成:算数表达式、关系表达式、逻辑表达式、测试表达式等表达式结果类型由操作数和运算符共同决定。

关系、逻辑和测试运算的结果一定是逻辑值。

字符串进行连接(+)和重复(*)的结果还是字符串。

两个整型操作数进行算术运算的结果大多还是整型的。浮点除法(/)的结果是浮点型的。幂运算的结果可能是整型的也可能是浮点型的,例如,5**-2返回0.04。

浮点型操作数进行算术运算的结果还是浮点型的第3章Python程序的

基本流程控制本章教学目标:

理解并掌握程序设计的三种基本结构。

熟练运用三种结构解决各种顺序、选择及重复执行的问题。3.1基本语句及顺序结构3.1.1基本语句1.赋值语句2.复合赋值语句(1)序列赋值

x,y=1,1.5(2)多目标赋值

first=second=third="welcome“(3)复合赋值

age+=33.1.2顺序结构程序工作的一般流程为:数据输入、运算处理、结果输出。顺序结构是指为了解决某些实际问题,自上而下依次执行各条语句【例3-1】编写程序,从键盘输入语文、数学、英语三门功课的成绩,计算并输出平均成绩,要求平均成绩小数点后保留1位。chinese=float(input("请输入您的语文成绩:"))math=float(input("请输入您的数学成绩:"))english=float(input("请输入您的英语成绩:"))average=(chinese+math+english)/3print("您的平均成绩为:%.1f"%average)【例3-2】编写程序,从键盘输入圆的半径,计算并输出圆的周长和面积importmathradius=float(input("请输入圆的半径:"))circumference=2*math.pi*radiusarea=math.pi*radius*radiusprint("圆的周长为:%.2f"%circumference)print("圆的面积为:%.2f"%area)【例3-3】编写程序,从键盘输入年份,输出当年的年历。importcalendaryear=int(input("请输入年份:"))table=calendar.calendar(year)print(table)3.2分支结构3.2.1if语句if表达式:

语句块name=input("请输入您的姓名:")age=int(input("请输入您的年龄:"))ifage>=18:print(name,"已经成年")print("符合驾照考试规定")3.2.2if-elif-else语句if表达式1:

语句块Aelif表达式2:

语句块Belif表达式3:

语句块Celse:

语句块Dname=input("请输入您的姓名:")chinese=float(input("请输入语文成绩:"))math=float(input("请输入数学成绩:"))english=float(input("请输入英语成绩:"))average=(chinese+math+english)/3ifaverage>=85:print(name,"获一等奖")elifaverage>=75:print(name,"获二等奖")elifaverage>=60:print(name,"获三等奖")else:print(name,"没有获奖")在使用分支结构时,需要注意以下事项:

表达式可以是任意类型,如5>3,x==y,xandy>z,3,0等。其中,3表示恒真(即True),而0表示恒假(即False)。

可以仅有if子句构成单分支结构,但是else子句必须与if子句配对,不能出现仅有else子句没有if子句的情况。

各语句块可以是一条或多条语句,如果是多条语句,则所有语句必须左对齐。【例3-4】编写程序,从键盘输入一个整型数字,判断该数字是否为偶数。

number=int(input("请输入一个整型数据:"))ifnumber%2==0:print(number,"是一个偶数")【例3-5】编写程序,从键盘输入三条边,判断是否能够构成一个三角形。如果能,则提示可以构成三角形;如果不能,则提示不能构成三角形。

side1=float(input("请输入三角形第一条边:"))side2=float(input("请输入三角形第二条边:"))side3=float(input("请输入三角形第三条边:"))if(side1+side2>side3)and(side2+side3>side1)and(side1+side3>side2):print(side1,side2,side3,"可以构成三角形")else:print(side1,side2,side3,"不能构成三角形")

【例3-6】编写程序,调用随机函数生成一个1~100之间的随机整数,从键盘输入数字进行猜谜,给出猜测结果(太大、太小、成功)的提示。importrandomrandnumber=random.randint(1,100)guess=int(input("请输入您的猜测:"))ifguess>randnumber:print("您的猜测太大")elifguess<randnumber:print("您的猜测太小")else:print("恭喜您猜对了")3.2.3分支语句嵌套当有多个条件需要满足并且条件之间有递进关系时,可以使用分支语句的嵌套。其中,if子句、elif子句以及else子句中都可以嵌套if语句或者if-elif-else子句。我国的婚姻法规定,男性22岁为合法结婚年龄,女性20岁为合法结婚年龄。因此如果要判断一个人是否到了合法结婚年龄,首先需要使用双分支结构判断性别,再用递进的双分支结构判断年龄,并输出判断结果。

sex=input("请输入您的性别(M或者F):")age=int(input("请输入您的年龄(1-120):"))ifsex=='M':ifage>=22:print("到达合法结婚年龄")else:print("未到合法结婚年龄")else:ifage>=20:print("到达合法结婚年龄")else:print("未到合法结婚年龄")【例3-7】编写程序,从键盘输入用户名和密码,要求先判断用户名再判断密码,如果用户名不正确,则直接提示用户名输入有误;如果用户名正确,则进一步判断密码,并给出判断结果的提示。username=input("请输入您的用户名:")password=input("请输入您的密码:")ifusername=="admin":ifpassword=="123456":print("输入正确,恭喜进入!")else:print("密码有误,请重试!")else:print("用户名有误,请重试!")【例3-8】编写程序,开发一个小型计算器,从键盘输入两个数字和一个运算符,根据运算符(+、-、*、/)进行相应的数学运算,如果不是这4种运算符,则给出错误提示。first=float(input("请输入第一个数字:"))second=float(input("请输入第二个数字:"))sign=input("请输入运算符号:")ifsign=='+':print("两数之和为:",first+second)elifsign=='-':print("两数之差为:",first-second)elifsign=='*':print("两数之积为:",first*second)elifsign=='/':ifsecond!=0:print("两数之商为:",first/second)else:print("除数为0错误!")else:print("符号输入有误!")3.3循环结构3.3.1while语句while语句用于在满足循环条件时重复执行某件事情。当表达式的值为真时,执行相应的语句块(循环体),然后再判断表达式的值,如果为真,则继续执行语句块……当表达式的值为假时,检查其后面是否有else子句(因为可选,所以流程图未画出),如果有,则执行else子句;如果没有,则直接跳出while语句,执行其下面的语句。初始值while表达式:#表达式的值为真语句块A #符合条件时执行的语句else: #可选项语句块B使用while语句时,需要注意以下事项:①与if语句类似,while语句的表达式可以是任意类型,如x!=y,x>3orx<5,-5等。②循环体中的语句块有可能一次也不执行,上例中若初始值time=13,则语句块不会执行。③语句块可以是一条或多条语句,上例中while子句中的语句块为两条语句,else子句中的语句块为一条语句。④while循环中的else子句可以省略,上例中若没有else子句,则当计次等于12时,while语句结束,程序继续执行while循环后面的语句。⑤程序中需要包含使循环结束的语句,上例中若缺少语句time=time+1,则程序无法终止。死循环:在while循环中,如果表达式的值恒真,循环将一直执行下去,无法靠自身终止,从而产生死循环。例如:

while1:print("Python是一门编程语言")

书写程序时,有时要尽量避免死循环,但是在某些特定场合中死循环却具有十分重要的作用,如嵌入式编程、网络编程中等等。【例3-10】编写程序,用下列公式计算π的近似值,直到最后一项的绝对值小于10-6为止。

importmathn=1#变量自增值t=1#每项值total=0#1/4π的值flag=1#标记位whilemath.fabs(t)>=1e-6:#当每项值的绝对值大于1e-6时进行计算total=total+tflag=-flagn=n+2t=flag*1.0/nprint("π=%f"%(total*4))

3.3.2for循环和range()内建函数for循环变量in对象:

语句块Aelse:#可选

语句块B

例如:

word='山羊上山山碰山羊角'sum=0forletterinword:ifletter=='山':sum+=1print(sum)

程序运行结果为“4”,即以遍历方式计算出“山”在字符串中出现的次数内建函数range()用于生成整数序列,通常的写法是:range(start,end,step)。其中,start决定序列的起始值(起始值可以省略,省略时该值为0)、end代表序列的终值(半开区间,不包括end的值),step代表序列的步长(可以省略,默认值是1)。例如:foriNuminrange(4,10,2):print(iNum,end="")程序运行结果为“468”,因为是半开区间,所以不包括数字10。【例3-11】编写程序,使用for语句计算1~10000的自然数之和。total=0foriNuminrange(1,10001,1):total=total+iNumprint("1~10000的总和为:",total)

【例3-12】编写程序,解决以下问题。4个人中有一人做了好事,已知有三个人说了真话,根据下面对话判断是谁做的好事。A说:不是我;B说:是C;C说:是D;D说:C胡说。foriNumin['A','B','C','D']:if(iNum!='A')+(iNum=='C')+(iNum=='D')+(iNum!='D')==3:print(iNum,"做了好事!")

3.3.3循环语句嵌套为了解决复杂的问题,可以使用循环语句的嵌套,嵌套层数不限,但是循环的内外层之间不能交叉。其中,双层循环是一种常用的循环嵌套,循环的总次数等于内外层次数之积。例如:

foriinrange(1,3):forjinrange(1,4):print(i*j,end="")【例3-13】编写程序,使用双重循环输出九九乘法表。

foriinrange(1,10):forjinrange(1,10):print("%s*%s=%2s"%(i,j,i*j),end="\t")print("\n")

【例3-14】编写程序,使用双重循环输出所示三角形图案。foriinrange(1,6):forjinrange(5-i):print("",end="")forjinrange(1,2*i):print("*",end="")print("\n")3.4转移和中断语句3.4.1break语句break语句用于中断当前循环的执行,跳出循环结构。对于包含else子句的while循环和for循环而言,在while或for子句中一旦执行break语句,else子句将没有机会执行。【例3-15】编写程序,随机产生色子的一面(数字1~6),给用户三次猜测机会,程序给出猜测提示(偏大或偏小)。如果某次猜测正确,则提示正确并中断循环;如果三次均猜错,则提示机会用完。

importrandompoint=random.randint(1,6)count=1whilecount<=3:guess=int(input("请输入您的猜测:"))ifguess>point:print("您的猜测偏大")elifguess<point:print("您的猜测偏小")else:print("恭喜您猜对了")breakcount=count+1else:print("很遗憾,三次全猜错了!")半路循环:前面介绍过死循环的概念,在死循环程序中,通过添加break语句终止程序的执行,称为半路循环。例如:

number=1while1:print("Python是一门编程语言")ifnumber>=5:breaknumber=number+13.4.2continue语句与break语句不同,continue语句用于中断本次循环的执行,进入下一轮循环条件是否满足的判断。【例3-16】编写程序,从键盘输入一段文字,如果其中包括“密”字(可能出现0次、1次或者多次),则输出时过滤掉该字,其他内容原样输出。

sentence=input("请输入一段文字:")forwordinsentence:ifword=="密":continueprint(word,end="")【例3-17】编写程序,从键盘输入密码,如果密码长度小于6,则要求重新输入。如果长度等于6,则判断密码是否正确,如果正确则中断循环,否则提示错误并要求继续输入。

while1:password=input("请输入密码:")iflen(password)<6:print("长度为6位,请重试!")continueifpassword=="123456":print("恭喜您,密码正确!")breakelse:print("密码有误,请重试!")第4章Python的

特征数据类型本章教学目标:

理解列表、元组、字典的概念和特点。

掌握对列表、元组、字典操作的相关方法。

了解集合的概念、特点和对集合操作的相关方法。4.1列表列表(list)数据类型可存储由多个值组成的序列。在列表中,值可以是任何数据类型,称为元素(element)或项(item)。Python的列表是有序的Python的列表是动态的4.1.1创建列表将逗号分隔的不同的数据项使用方括号“[]”括起来即可创建列表。例如:

>>>list1=['physics','chemistry',1997,2000]>>>list2=[1,2,3,4,5]>>>list3=["a","b","c","d"]

列表允许嵌套,也就是说列表中的成员同样可以是列表,例如:

>>>olist=[1,'str',['name','goofy'],…]>>>nlist=[]#定义一个空的list:4.1.2列表的基本操作【例4-1】列表切片举例。>>>list2=[1,2,3,4,5,6,7]>>>print("list2[1:5]:",list2[1:5])list2[1:5]:[2,3,4,5]>>>l1=[1,2,3,4,5,6,7,8,9,10,11]>>>l1[0:2]#取区间[i,j),左闭右开[1,2]>>>l1[:2]#同上,可省略第一位[1,2]>>>l1[2:][3,4,5,6,7,8,9,10,11]>>>l1[2:-1][3,4,5,6,7,8,9,10]>>>l1[:]#相当于l1[1,2,3,4,5,6,7,8,9,10,11]>>>l1[::2]#步长2[1,3,5,7,9,11]>>>l1[0:7:2][1,3,5,7]>>>l1[7:0:-2]#注意步长为负值,就从7到1倒序,步长为2[8,6,4,2]列表的成员检查示例如下:>>>lst=[1,2,3,4]>>>3inlstTrue>>>5inlstFalse注意:列表与字符串的重要区别是,列表中的元素可被更改,因此可以使用赋值语句改变列表中任意元素的值。【例4-2】列表元素的更改举例。

>>>lst=[1,2,3,4]>>>lst[3]4>>>lst[3]="Hello">>>lst[1,2,3,'Hello']>>>lst[2]=7>>>lst[1,2,7,'Hello']>>>lst[1:3]=["Slice","Assignment"]>>>lst[1,'Slice','Assignment','Hello']使用运算符“*”和“+”可分别对列表中的元素进行复制或拼接,例如:

>>>zeroes=[0]*6>>>print(zeroes)[0,0,0,0,0,0]>>>len(zeroes)6>>>print(2*[a]+[c]*3)[a,a,c,c,c]

用对列表中元素循环操作可实现列表元素求和。【例4-3】列表元素求和举例。

>>>s=[1,2,3,4,5,6,7,8,9]>>>sum=0>>>foriins:sum=sum+i>>>print("sumis",sum)sumis454.1.3更多列表操作

list.append(x):在列表的末尾添加元素x,等价于a[len(a):]=[x]。

list.extend(L):在列表末尾加入指定列表L中的所有元素,等价于a[len(a):]=L或a+L。

list.insert(i,x):在给定位置插入元素,即在位置i处插入x,其余元素依次向后退。因此,a.insert(0,x)意味着在列表的首部插入元素,而a.insert(len(a),x)等价于a.append(x)。

list.remove(x):删除列表中第一个值为x的元素,若该元素不存在则出错。

list.pop([i]):删除列表中给定位置i处的元素,并返回该元素。若不指定索引值(list.pop),则移除并返回列表中的最后一个元素。

list.clear():删除列表中的所有元素,等价于:dela[:]。

list.index(x):返回列表中值为x的元素的位置索引,若不存在则出错。

list.count(x):返回x在列表中出现的次数。

list.sort(key=None,reverse=False):对列表中的元素排序,默认为升序。

list.reverse():将列表中元素的顺序反转。

list.copy():返回列表的浅复制,等价于a[:]。4.1.4删除列表中的元素Python提供的del操作可以通过元素的位置索引来将其从列表中删除。注意:del不是一个列表对象的操作方法,而是可用于列表元素的Python内置操作命令。del与pop()不同,pop()会返回被删除的元素。此外,del还可以用来删除子列表或整个列表变量。例如:>>>a=[-1,1,66.25,333,333,1234.5]>>>dela[0]>>>a[1,66.25,333,333,1234.5]>>>dela[2:4]>>>a[1,66.25,1234.5]>>>dela[:]>>>a[]4.1.5列表解析列表解析(listcomprehension)常用于从集合对象中有选择地获取并计算元素。【例4-5】创建平方数列表的方法比较。>>>squares=[]>>>forxinrange(10):squares.append(x**2)>>>squares[0,1,4,9,16,25,36,49,64,81]列表解析语句可更加简便快捷地实现上述功能:squares=[x**2forxinrange(10)]4.2元组元组(tuple)是Python中另一种内置的存储有序数据的结构元组是不可改变的4.2.1创建元组创建元组的语法很简单:如果用逗号分隔了一些值,那么将自动创建元组,元组通常用圆括号()括起来。换句话说,任意类型的对象,如果以逗号隔开,则默认为元组。例如:>>>1,2,3(1,2,3)>>>t="a","b","c","d"#元组打包(tuplepacking)>>>t('a','b','c','d')【例4-6】元组创建举例。>>>tup1=(1,2,3)(1,2,3)>>>tup2=('physics','chemistry',1997,2000)('physics','chemistry',1997,2000)>>>u=t,(1,2,3,4,5)#元组允许嵌套>>>u((12345,54321,'hello!'),(1,2,3,4,5))>>>v=([1,2,3],[3,2,1])#元组中可包含可修改数据类型的元素>>>v([1,2,3],[3,2,1])注意,创建仅包括一个值的元组必须加个逗号,例如:>>>42,(42,)>>>(42,)(42,)>>>(42)42>>>empty=()#创建空元组4.2.2元组的基本操作元组的元素与列表一样按定义的次序进行排序。因为元组的索引与列表一样是从0开始的,所以一个非空元组的第一个元素总是t[0]。负数索引也与列表一样,从元组的尾部开始计数。与列表一样,切片(slice)也可以使用。注意:当分割一个列表时,会得到一个新的列表;当分割一个元组时,会得到一个新的元组。与列表相同,元组也可以通过下标索引来访问元组中的值,例如:>>>tup1=('physics','chemistry',1997,2000)>>>tup2=(1,2,3,4,5,6,7)>>>print"tup1[0]:",tup1[0]tup1[0]:physics>>>print"tup2[1:5]:",tup2[1:5]tup2[1:5]:(2,3,4,5)元组可以连接。与字符串一样,元组之间可以使用“+”号和“*”号进行运算,生成一个新的元组。例如:

>>>tup1=(12,34.56)>>>tup2=('abc','xyz')>>>print(tup1+tup2)(12,34.56,'abc','xyz')

由于元组是不可修改的,因此,不能向元组增加元素,元组没有append或extend方法。不能从元组删除元素,元组没有remove或pop方法。不能在元组中查找元素,元组没有index方法。可以使用in关键字查看一个元素是否存在于元组中,使用max和min方法查看元组中的最大值、最小值,例如:>>>t=(2,23,41,3,7,1,10,48,5)>>>2intTrue>>>4intFalse>>>max(t)48>>>min(t)14.2.3元组与列表的相互转换元组与列表可以互相转换,Python内置的tuple()函数接收一个列表,可返回一个包含相同元素的元组。而list()函数接收一个元组并返回一个列表。从元组与列表的性质来看,tuple()相当于冻结一个列表,而list()相当于解冻一个元组。【例4-7】分别从两个列表中取不相等的两个元素组合成元组类型元素的新列表。>>>[(x,y)forxin[1,2,3]foryin[3,1,4]ifx!=y][(1,3),(1,4),(2,3),(2,1),(2,4),(3,1),(3,4)]上述代码等价于:>>>combs=[]>>>forxin[1,2,3]:foryin[3,1,4]:ifx!=y:combs.append((x,y))>>>combs[(1,3),(1,4),(2,3),(2,1),(2,4),(3,1),(3,4)]4.2.4元组解包在讲解创建元组的例子中,声明t="a","b","c","d"被称为元组打包。其实也可以进行反向操作——元组解包(unpacking),即将等号右侧元组中的元素按顺序依次赋给等号左边的变量。例如:>>>t=(1,2,3)>>>a,b,c=t #解包>>>a1>>>b2>>>c3在实际应用时,使用元组比使用列表的优势在于:首先,元组比列表的运算速度快。如果定义了一个常量集对象,并且需要在程序中不断地遍历它,则建议使用元组而不是列表。其次,使用元组相当于为不需要修改的数据进行了“写保护”,使得数据更安全。4.3字典4.3.1创建字典字典包含了一个索引的集合,称为键(key)和值(value)的集合。一个键对应一个值。这种一一对应的关联称为键值对(key-valuepair),或称为项(item)。简单地说,字典就是用花括号包裹的键值对的集合。每个键值对用冒号“:”分隔,每对之间用逗号“,”分隔d={key1:value1,key2:value2}用{}创建字典是最简单的方法,方法如下:>>>dict1={'jack':4098,'sape':4139}>>>dict2={(1,2):['a','b'],(3,4):['c','d'],(5,6):['e','f']}>>>dict2{(1,2):['a','b'],(5,6):['e','f'],(3,4):['c','d']}>>>type(dict2)<class'dict'>>>>dict1={}#创建空字典注意,键必须是唯一的,必须是不可变数据类型的,例如,字符串、数字或元组。值可以是任何数据类型。4.3.2访问字典中的值要得到字典中某个元素的值,可用字典键加上方括号来得到,即dict[key]形式返回键key对应的值value,如果key不在字典中,则会引发KeyError。例如:>>>dict={'name':'earth','port':80}>>>dict{'name':'earth','port':80}>>>dict['port']80>>>dict['a']Traceback(mostrecentcalllast):File"<pyshell#4>",line1,in<module>dict['a']KeyError:'a'若要检查字典dict中是否含有键key,可以使用in。例如:>>>d={'name','alice'}>>>'name'indTrue4.3.3更新字典可添加、删除或更新字典中的一个键值对,例如:>>>adict={'name':'earth','port':80}>>>adict['age']=18 #添加新键值对('age':18)>>>adict{'name':'earth','port':80,'age':18}>>>adict['name']='moon' #更新键'name'的值>>>adict{'name':'moon','port':80,'age':18}>>>deladict['port'] #删除键键值对('port':80)>>>adict{'name':'moon','age':18}4.3.4字典的操作1.返回字典所有的键、值和项dict.keys()、dict.values()、dict.items()这三个方法分别返回包含原字典中每项的键、值和项(键,值)的列表,例如:>>>d={'name':'alice','age':19,'sex':'F'}>>>d.keys()dict_keys(['age','sex','name'])>>>d.items()dict_items([('age',19),('sex','F'),('name','alice')])>>>d.values()dict_values([19,'F','alice'])要遍历一个字典,只需要遍历它的键即可,例如:>>>forkeyind.keys():print('key=%s,value=%s.'%(key,d[key]))

key=age,value=19.key=sex,value=F.key=name,value=alice.>>>x={}>>>y=x>>>x['key']='value'>>>y{'key':'value'}>>>x={}>>>y{'key':'value'}>>>x={}>>>y=x>>>x['key']='value'>>>y{'key':'value'}>>>x.clear()>>>y{}2.字典清空用dict.clear()可清空原始字典中所有的元素。有趣的是,对于两个相关联的字典对象x,y,若将x赋值为空字典,将不对y产生影响;而用clear方法清空x,也将清空字典y中所有元素。例如:

3.字典的浅复制dict.copy()方法返回一个具有相同键值对的新字典。但在原始字典中,如果修改某个值,副本字典也会相应改变,故称为浅复制(shallowcopy,仅复制字典对象直接包含的引用,不复制嵌套的对象)。如果要避免该问题,可使用深复制(deepcopy,不仅复制字典对象,还要复制这个字典对象所引用的对象)方法dict.deepcopy()。例如:>>>x={'a':1,'b':[2,3,4]}>>>y=x.copy()>>>z=x.deepcopy()>>>x['a'].append(5)>>>y{'a':1,5,'b':[2,3.4]}>>>z{'a':1,'b':[2,3,4]}4.以键查值dict.get(key,default=None)方法可访问字典项的对应值。若使用get访问一个不存在的key,会得到None值。还可以自定义默认值,替换None值。例如:>>>d={}>>>print(d.get('name'))None>>>d.get("name",'N/A')'N/A'>>>d[''name'']='Eric'>>>d.get('name')'Eric'5.移除键值对dict.pop(key[,defalut])方法用来获得并返回对应给定键的值,然后将这个键值对从字典中移除。例如:

>>>d={'name':'alice','age':19,'sex':'F'}>>>d.pop('name')'alice'>>>d{'age':19,'sex':'F'}6.字典更新dict.update(adict)方法可以利用一个字典更新另一个字典。提供的字典中的所有键值对均会被添加到旧字典中,若有相同的键则会进行覆盖。例如:>>>d={'name':'alice','age':19,'sex':'F'}>>>d={'name':'alice','age':19,'sex':'F'}>>>x={'name':'bob','phone':'12345678'}>>>d.update(x)>>>d{'age':19,'phone':'12345678','sex':'F','name':'bob'}【例4-9】输入两个数字,并输入加减乘除运算符号,输出运算结果。若输入其他符号,则退出程序。

whileTrue:a=float(input('请输入第一个数字'))b=float(input('请输入第二个数字'))t=input('请输入运算符号,其他符号为退出程序')tup=('+','-','*','/')iftnotintup:breakdic={'+':a+b,'-':a-b,'*':a*b,'/':a/b}print('%s%s%s=%0.1f'%(a,t,b,dic.get(t)))

运行结果:

>>>请输入第一个数字2.3请输入第二个数字3.4请输入运算符号,其他符号为退出程序/2.3/3.4=0.7

【例4-10】引入内置模块calendar,输入年、月、日,根据weekday(year,month,day)的返回值,输出该日期是星期几。函数weekday()返回0~6分别对应星期一至星期日。fromcalendarimport*y=input('请输入年')m=input('请输入月')d=input('请输入日')dic={0:'星期一',1:'星期二',2:'星期三',3:'星期四',4:'星期五',\5:'星期六',6:'星期日'}ify.isdigit()andm.isdigit()\andd.isdigit()and1<=int(m)<=12\and1<=int(d)<=31:w=weekday(int(y),int(m),int(d))print('您输入的%s年%s月%s日是%s'%(y,m,d,dic[w]))else:print('输入日期有误')运行结果:>>>请输入年1949请输入月10请输入日1您输入的1949年10月1日是星期六4.4集合集合(set)是不重复元素的无序集,它兼具了列表和字典的一些性质。集合有类似字典的特点:用花括号“{}”来定义,其元素是非序列类型的数据,也就是没有顺序,并且集合中的元素不可重复,也必须是不变对象,类似于字典中的键。集合的内部结构与字典很相似,区别是“只有键没有值”。另一方面,集合也具有一些列表的特点:持有一系列元素,并且可原处修改。由于集合是无序的,不记录元素位置或者插入点,因此不支持索引、切片或其他类序列(sequence-like)的操作。4.4.1集合的创建1.直接使用“{}”创建【例4-11】集合创建举例。>>>s3={1,2,3,4,5}>>>s3{1,2,3,4,5}>>>s4=set()#注意创建空集合要用set()而非{},若用{},将创建空字典>>>s4set()>>>type(s4)<class'set'>>>>s5={}>>>type(s5)<class'dict'>>>>s5={'Python',(1,2,3)}>>>s5{'Python',(1,2,3)}>>>s6={"Python",[1,2,3]}Traceback(mostrecentcalllast):File"<pyshell#69>",line1,in<module>s6={"Python",[1,2,3]}TypeError:unhashabletype:'list'>>>s7={"Python",{'name':'alice'}}Traceback(mostrecentcalllast):File"<pyshell#70>",line1,in<module>s7={"Python",{'name':'alice'}}TypeError:unhashabletype:'dict'从上面例子可以看出,通过“{}”无法创建含有列表或字典元素的集合。2.由字符串创建用函数set(str)将str中的字符拆开以形成集合。例如:>>>s1=set('helloPython')>>>s1{'o','l','t','y','h','e','p','n'}注意:'helloPython'中包含两个'i'、两个'o'和两个'h',但在s1中,'i'、'o'和'h'分别只有一个,即集合创建时自动去除了重复字符。3.由列表或元组创建用函数set(seq)创建集合,参数可以是列表或元组。在下面例子中,调用set()并传入list,将list的元素作为集合的元素:>>>s2=set([1,'name',2,'age','hobby'])>>>s2{'age',1,2,'hobby','name'}>>>s2=set((1,2,3))>>>s2{1,2,3}4.4.2集合的修改4.4.3集合的数学运算集合支持联合(Union)、交(Intersection)、差(Difference)和对称差集(SymmetricDifference)等数学运算【例4-12】集合运算举例。>>>s1={'a','e','i','o','u'}>>>s2={'a','b','c','d','e'}>>>s1{'a','o','e','i','u'}>>>s2{'d','e','a','c','b'}>>>s1&s2{'e','a'}>>>s1|s2{'o','a','c','i','d','u','e','b'}>>>s3={'a','e'}>>>s3.issubset(s1)True>>>s1.issuperset(s3)True>>>s1.difference(s2){'o','i','u'}>>>s1.symmetric_difference(s2){'o','c','i','d','u','b'}>>>'a'ins1True>>>'a'notins1False第5章文件本章教学目标:

理解文件与目录的基本概念。

初步理解文件的编码方式。

理解文本文件和二进制文件的概念和处理方法。

掌握文件的打开和关闭操作。

理解文件的定位和随机存取。

学会文件的读取、写入和追加操作。5.1基本概念操作系统对数据进行管理是以文件为单位的,当访问磁盘等外存上的数据时,必须先按文件名找到指定的文件,然后再从该文件中读取数据;如果要向外部介质上存储数据,也必须先建立一个文件,才能向其输出数据。5.1.1文件和目录文件是存储在外部介质上的数据集合,通常可以长久保存,也称为磁盘文件文件是通过目录来组织和管理的,目录提供了指向对应磁盘空间的路径地址目录一般采用树状结构,在这种结构中,每个磁盘有一个根目录,它包含若干文件和子目录。【例5-1】绝对路径示例。假定文件file.txt保存在D:盘lecture5目录的ex子目录下,那么包含绝对路径的文件名是由磁盘驱动器、目录层次和文件名三部分组成的,即D:\lecture5\ex\file.txt,在Python中用字符串表示为:"D:\\lecture5\\ex\\file.txt"或"D:/lecture5/ex/file.txt"【例5-2】相对路径示例。假定文件file.txt保存在D:盘的lecture5目录的ex子目录下,源程序保存在D:盘的lecture5目录下,那么包含相对路径的文件名表示为ex\file.txt,在Python语言中用字符串表示为:"ex\\file.txt"或"ex/file.txt"5.1.2文件的编码按照文件的编码方式,可将文件分为文本文件和二进制文件Python3.x版本中,文件的默认编码格式是UTF-8,字符串使用的是Unicode编码。所有的文本类型,都使用Unicode编码,可以直接使用str.encode()进行编码,encode()后可看到字符的UTF-8编码,再使用bytes.decode()可解码为文本5.2文件操作程序中对文件的操作一般包括:打开文件读取文件对文件数据进行处理写入文件关闭文件5.2.1文件的打开和关闭<文件对象>=open(<文件名>[,<模式>])【例5-4】以读/写二进制模式打开当前目录下的文件示例。

>>>importos>>>os.chdir('D:\\python')>>>f=open('workfile.txt','rb+')

5.2.2定位文件定位语句seek(),可以帮助我们实现文件的随机读/写。f.seek(<偏移值>[,<起始位置>])

其中,起始位置为0表示自文件起始处开始(默认值,可省略),1表示从当前文件指针位置开始,2表示从文件末尾开始。【例5-5】随机访问二进制文件示例。

>>>importos>>>os.chdir('d:\\python')>>>f=open('workfile.txt','rb+')>>>f.write(b'Beatwarwithyourvices')25>>>f.seek(6)6>>>f.read(3)b'war'>>>f.seek(-5,2)20>>>f.read(4)b'vice'>>>f.close()

【例5-6】随机访问文本文件示例。

>>>importos>>>os.chdir('d:\\python')>>>f=open('workfile.txt','r+')>>>f.write('微风送来淡淡花香')8>>>f.seek(8)8>>>f.read(4)'淡淡花香'>>>f.seek(-8,2)Traceback(mostrecentcalllast):File"<pyshell#19>",line1,in<module>f.seek(-8,2)

温馨提示

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

最新文档

评论

0/150

提交评论