基于python的程序设计思想与方法.ppt
程序设计思想与方法,翁惠玉Email:,教材参考教材,教材很遗憾,暂无合适的中文版教材目前使用:Python Programming:An Introduction to Computer Science.(电子版)How to Think Like a Computer ScientistLearning with Python.(电子版),什么是计算机科学?,计算机科学并非研究计算机!正如天文学不是研究天文望远镜CS要回答的基本问题:什么是可计算的?对此问题的回答有三种方式:实际设计一个解决问题的算法理论分析问题的可解性:无解的,不是能行可解的通过实验来研究问题.,3,课程主要内容,解决可计算问题需要教会计算机如何解决问题如何教计算机解决问题了解计算机有哪些基本功能因材施教,设计教学的过程一门与计算机进行交流的语言,对本课程的定位,学习计算机科学解决问题的思想方法,应用于其他专业领域不是程序设计语言课程!本课程需要编程,以加深对计算思维的理解坏消息:学习编程语言需要掌握非常繁琐的细节好消息:Python语言非常简单,易学易用也不是算法和数据结构课程!当然会学习这方面的一些基本技术,5,计算机与程序,计算机组成程序设计语言初识Python,计算机的组成,硬件:计算机的躯壳软件:计算机的灵魂,计算机,也被称之为“电脑”,是一种能够按照事先存储的程序自动、高效地对数据进行输入、处理、存储和输出的系统,计算机硬件,存储器,保存正在运行的程序代码和数据内存的最小单元是bit,一个bit存储一个二进制位。一般8个bit组成一个byte,若干个byte组成一个word在一般的机器中,内存按字节编址,内存大小也是按字节计量关机后,内存的数据全部丢失,CPU,CPU(Central Processing Unit)有两个部件组成:ALU Arithmetic-Logic Unit(运算器)Control unit(控制器),控制器,控制器控制计算机的其余部分如何完成程序的指令指挥内存和其它部件之间的信息的传送(包括信息和指令)指挥CPU和输入输出设备之间的控制信息的传送,控制器中的信息存储,控制器中有两个寄存器:指令寄存器(IR):保存当前正在执行的指令程序计数器(PC):保存下一条要执行的指令地址,控制器的工作,取下一条指令:按PC指定的地址到内存中取出下一条指令,存入IR。解码指令:将指令解码成一系列的控制信号执行指令:将控制信号发送给相关部件,执行相应的运算,运算器的组成,逻辑电路:执行控制器发出的控制信号一组存放正在运算的数据的寄存器,输入输出设备,输入设备将人能理解的符号转换成计算机能处理的符号。常用的输入设备有:键盘、鼠标、光笔等输出设备将计算机的输出转换成人能理解的输出。常用的输出设备有:显示器、打印机、音响设备等,计算机的组成,硬件:计算机的躯壳软件:计算机的灵魂,计算机,也被称之为“电脑”,是一种能够按照事先存储的程序自动、高效地对数据进行输入、处理、存储和输出的系统,计算机软件,软件决定了计算机能做什么.没有软件,计算机只是一堆废铁.软件可以分为系统软件和应用软件。系统软件居于计算机系统中最靠硬件的部分,它将计算机的用户与硬件隔离。系统软件与具体的应用无关,但其他的软件要通过系统软件才能发挥作用。常用的系统软件有操作系统、编译器、网络软件等。应用软件是为了支持某一应用而开发的软件。如字处理软件、财务软件等。,计算机与程序,计算机组成程序设计语言初识Python,程序设计语言,人与计算机进行交流的一种语言为什么不用自然语言与计算机交互?精确的语法和语义无二义性有不同层次的程序设计语言,Lu Chaojun,SJTU,19,不同层次的程序设计语言,机器语言汇编语言高级语言,机器语言,是机器的母语。每种计算机都有自己的机器语言。与计算机硬件设计有关。每个语句用一组二进制数表示用机器语言写程序是非常困难的,读机器语言写的程序也是非常困难的机器语言提供的功能非常简单,汇编语言,用缩写和助记符代替机器语言的0和1的比特串和机器语言一样,不同类的机器有不同的汇编语言汇编程序:将汇编语言写的程序翻译成机器语言的程序解决了机器语言的可读性问题,但没有解决功能简单的问题以及可移植型问题,高级语言,类似于英语的语言,适合于人理解功能比机器语言强,解决问题更加容易编译器:将过程化语言写的程序(源代码)翻译成机器语言的程序(目标代码)解释器:逐句解释源程序并执行,不保存目标代码。,编译执行,将程序全部翻译成机器语言的程序,然后再执行。,解释执行,高级语言的特点,具备了一定的机器独立性,使用户可以专注于解决问题的方法。但某些方面还是受到机器的限制为了解决移植性问题,ANSI制订了一系列的标准,高级语言,本课程采用Python语言高级程序设计语言有很多种,据说2008年网上被引用最多的10个语言是(按字母顺序):C,C+,C#,Java,JavaScript,Perl,PHP,Python,Ruby,SQL,27,计算机与程序,计算机组成程序设计语言初识Python,Python,Python采用编译/解释混合方式:先编译成字节码,再解释执行Python 软件:ftp:/用户码/密码:hyweng/public启动Python,29,初识Python,:提示符,提示你可以输入命令语句:一条命令,如print“hello”串:“hello world”数:3、10表达式:3+5赋值:x=5,30,函数,函数:将完成某一功能的语句组合起来函数定义函数调用:,def area():x=5 y=6 print x*y,area()30,带参数的函数,函数定义 函数的调用,def area(x,y):print x*y,area(3,4)12area(2,4)8,模块,如果一段程序需要反复执行,可以把它以文件形式保存在外存储器中。保存在外存储器中的程序称为一个模块,也称为脚本文件或源文件。PYTHON的源文件的后缀名为py程序模拟物理现象:chaos程序,#File:chaos.py#A simple program illustrating chaotic behavior.def main():print This program illustrates a chaotic function x=input(Enter a number between 0 and 1:)for i in range(10):x=3.9*x*(1-x)print x input(Enter 0 to quit)main(),main函数:标志程序的开始,也可以省略注释变量与赋值程序的执行:一个个语句顺序执行,但也可以重复执行某个语句,for循环,将一段语句重复执行多次语法for in:是一个值的序列,如1,3,5,7,9或range(10)(即0,1,9).可以是任何语句序列,用左缩进标识.,36,程序的控制流,程序的诸语句通常是顺序执行的,但循环语句改变了控制流,表示一种控制结构.控制流可以用流程图直观表达,37,保存文件,用任何一个文本编辑器,保存成纯文本格式在IDLE中的file菜单中选择new window,输入程序的内容。输入结束后再在file菜单中选择save或save as保存到文件中,模块的执行,在IDLE中执行程序打开文件:在file菜单下选open或直接用右键点击文件,并选择用IDLE打开,或先打开IDLE,再在file菜单下选择open执行:在run菜单下选run module或直接按f5Cmd界面中执行程序import文件,添加python的路径,Import时,系统必须知道到哪里去找那个文件这是通过PYTHONPATH指定的安装PYTHON时,系统会指定缺省path。缺省的路径是:Python26Libsite-packages添加搜索路径右键单击我的电脑,然后单击属性。单击高级选项卡。单击环境变量。单击新建添加一个新变量名和值。,END,写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,程序设计需要系统化的方法,程序设计是用精确的语言告诉计算机该做什么,要精确到最细节处.计算机只会做很简单的事情,只能刻板地执行程序.一方面要写大型程序,一方面要精确到细枝末节,这极具挑战性.细节上的微小差错可带来巨大灾难.例如1996年阿丽亚娜5火箭首次鉴定发射失败的原因是将一个浮点数转换为整数的代码有问题.,43,软件开发过程,需求分析:问题是什么?制定程序规格:程序要做什么?对简单程序描述输入输出即可.设计:程序怎么做?主要任务是设计出满足规格的算法一般用伪代码给出总体结构,不纠缠细节.实现:用某种程序设计语言翻译设计.测试与排错:测试程序是否如预期,排除bug.维护:运行中还会不断有问题.,44,写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,温度转换,需求:预报摄氏度,想知道对应华氏度.规格:输入摄氏度,显示输出华氏度.两者对应关系是F=(9/5)C+32.设计算法:简单的IPO实现:翻译成Python程序测试:常用边界数据.如输入0,100,46,算法设计,将完成任务的步骤分解成计算机能完成的动作伪代码写的算法:输入摄氏度:celsius计算华氏度:fahrenheit=9/5 celsius+32显示输出:fahrenheit,47,Python程序,#convert.py#convert Celsius temps to Fahrenheitdef main():celsius=input(What is the Celsius temperature?)fahrenheit=9.0/5.0*celsius+32print The temperature is,fahrenheit,degrees Fahrenheit.”main(),写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,程序的构成,各种名字:main、celsius等输入:celsius=input(What is the Celsius temperature?)表达式:9.0/5.0*celsius+32赋值:fahrenheit=9.0/5.0*celsius+32输出:print The temperature is,fahrenheit,degrees Fahrenheit.”,标识符,标识符:值,变量,函数,模块等的名字.标识符命名规则字母下划线开头,后接字母数字下划线大小写敏感标识符不能是保留词良好编程风格选择有意义的名字:变量名一般是名词短语,函数名一般是动词短语风格统一.,51,表达式,表达式:与数学中类似。如3.9*x*(1x)参加运算的可以是常量、变量运算符:+、-、*、/、*(指数运算)可以用括号改变优先级良好编程风格:用空格、括号增加可读性.,52,输出语句,输出语句print的语法:printprint print,print,print的语义:自左向右计算表达式的值并在一行上显示,值之间以空格隔开.最后输出换行,但以逗号结尾时不换行.,53,赋值语句,语法=语义:计算表达式的值,存入变量.一个变量可被多次赋值,但总是持有最后一次赋值的结果.,54,输入赋值语句,输入赋值语句=input()语义计算的值(通常是字符串),显示该值等待用户输入一个表达式(以回车键结束)计算用户输入的表达式,得到input()的值把input()的值存入.良好风格用提醒用户输入以空格结束.(Why?),55,同时赋值语句,同时赋值:,.,=,.,语义:计算右边各表达式的值,分别存入左边的对应变量.应用同时赋值交换两个变量传统语言的做法:引入一临时变量Python可以:x,y=y,xinput()也可为多个变量同时赋值x,y=input(“input x,y”)执行到此语句时用户可输入:3,4,则x=3,y=4,56,写一个简单的程序,软件开发过程程序实例:温度转换程序的构件程序实例:利息计算,利息计算,需求:给定本金和利率,计算10年后的本利之和规格:明年的本金之和=今年的本金*(1+利率),算法过程,Python程序,#interest.py#coding=gbkdef main():print 这是一个计算10年后本利之和的程序 balance=input(请输入本金:)rate=input(请输入利率:)for i in range(9):balance=balance*(1+rate)print balancemain(),上机作业,修改interest.py,使它能输出每一年的本利之和。例如年份 本利之和=1 1012 102.2 104.5,END,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,数据类型,程序存储与操作的信息称为数据.数据类型不同的数据表示方式不同的操作,数值数据类型,整数类型int不带小数点可存储整数的精确值浮点数类型float带小数点计算机只能存储浮点数的近似值type()函数返回值的类型,65,整型数的内部表示,整型数在内部用补码表示正数的补码是它的二进制表示,负数的补码是它的绝对值的二进制的每一位取反后再加1。如用8位表示一个整数,那么:62补=0 0111110-62补=1 1000010在补码表示中,最高位是符号。0为正数,1为负数Python中的整数用32位表示,则int范围为 231 2311,即-2147483648 2147483647,实型数的表示,定点表示:小数点的位置固定不变浮点表示:小数点位置不固定。一个浮点数分成尾数和阶码两部分。阶码表示小数点在该数中的位数,尾数表示数的有效数值。如十进制数N=246.135,其浮点表示可为:N=246135*10-3=2461350*10-4=0.246135*103=0.0246135*104,浮点数的存储,当字长一定时,分配给阶码的位数越多,表示数的范围越大,但分配给尾数的位数将减少,从而降低数的精度。,数值运算符,69,运算数都是整数,结果为整数;至少有一个运算数是浮点数,结果为浮点数.,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,数学库,其他的数学运算都包含在一个库中库是系统或其他用户已经写好的一些有用的程序。一般一个功能表示为一个函数数学库:支持各类数学计算的函数.数学库的引入:import math数学库中函数的调用:例如求平方根math.sqrt(),求一元二次方程解,#equation1.pyimport mathdef main():a,b,c=input(Enter three coefficients:)discRoot=math.sqrt(b*b-4*a*c)r1=(-b+discRoot)/(2*a)r2=(-b-discRoot)/(2*a)print The solutions are:,r1,r2main(),72,引用数学函数库中的函数,数学库中的常用函数,pi:常数e:常数esqrt(x):平方根sin(x),cos(x),tan(x),asin(x),acos(x),atan(x):三角函数log(x),log10(x):自然对数与常用对数exp(x):e的x次方ceil(x):x的最小整数floor(x):x的最大整数,数值计算,数值数据的类型数学库的使用累积整型数的限制处理大整型类型转换,一种常用算法模式:累积,最终结果是由逐个中间结果累积起来形成的.例如6!的计算:先算6*5,再*4,再*1而得.1+2+3+4+100:先计算1+2,再加3,这种累积程序需要一个存放累积结果的变量,累积过程是一个循环:初始化累积变量循环直至得到最终结果 计算累积变量的当前累积值,累积(续),初始化:给累积变量一个合适的初值,以便进入循环后能正确计算.忘记初始化是一个常见编程错误!循环过程:将一个个值累积到累积变量中,阶乘计算程序,具体数(如6)的阶乘fact=1for f in 6,5,4,3,2,1:fact=fact*f一般情形n=input(Enter a number:)fact=1for f in range(n,1,-1):fact=fact*fprint The factorial of,n,is,fact,阶乘程序的几点注解,由于乘法结合律,累积的次序是不重要的.如按下面的循环来累积:for f in 2,3,4,5,6:for f in 2,4,6,1,3,5:for f in range(2,n+1)range()函数range(n)range(start,n)range(start,n,step)fact也可初始化为n,求1到100的和,sum=0for i in range(1,101):sum=sum+iprint sum,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,整数的限制,int型在内存占用的空间是有限的,因此能表示的数值范围也是有限的。Python中的整数用32位表示,只能表示-2147483648 2147483647浮点数同样也有这个问题,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,大数的表示,long int:不定长,可扩至任意长度(当然受限于存储器容量).如注意:5L和5有完全不同的表示有长整数参加的运算,结果为长整数.long int运算效率远低于int,因此能用int就不用long int.浮点数很大时用科学表示法:1.234e+12最大数:1e+308,求阶乘的更好的实现,n=input(Enter a number:)fact=1Lfor f in range(n,1,-1):fact=fact*fprint The factorial of,n,“is,fact,阶乘增长很快,结果很容易超出int的范围,现在的Python环境都能自动执行int到大整数的转换。当超出int范围时,自动转换为大整型,数值计算,数值数据的类型数学库的使用求阶乘整型数的限制处理大整型类型转换,类型转换,Python只会做同类型的运算,运算结果与运算数类型相同。在混合类型表达式中,Python自动转换:int long float人工转换:利用int(),long(),float()小测验:求整数的平均值时用哪个好?avg=sum/countavg=float(sum)/countavg=float(sum/count)浮点数取整时如何做到四舍五入?int(x+0.5)round(),END,字符串处理,文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理,文本数据,计算机应用从科学计算转向信息管理.信息管理中大量的数据都是文本数据.如姓名,地址,简历等等计算机中用字符串来表示文本数据.,89,字符串类型,字符串:字符序列字符串字面值:用一对引号(单或双)标明.“hello world”!#$%&*“汉字也是字符”字符串中包含引号怎么办?包含单引号:串用双引号括住包含双引号:串用单引号括住两者都有:更一般的方法是串中用转义字符print“Alice said,“Hello,Bob”,字符串处理,文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理,字符串的输入,普通变量的输入num=input(“Enter a number:“)Enter a number:5.6变量num得到值 5.6如果用同样的方法输入字符串str=input(“Enter a string:“)Enter a string:JohnPython会输出出错信息原因:input()是把输入当成表达式来计算的!,92,字符串的正确输入,输入时加上引号str=input(“Enter a string:“)Enter a string:JohnEnter a string:“John”使用raw_input()str=raw_input(“Enter a string:“)Enter a string:John,input与raw_input,x=input()x=raw_input()“John”Johnx xJohn Johnx=input()x=raw_input()3*4+2 3*4+2x x14 3*4+2,94,字符串赋值,字符串可以直接赋值Str=abcdeStrabcde,取字符,字符串是字符序列,可通过位置索引访问每个字符.对长度为n的字符串,索引可以是大于0的数:自左向右为0 n1,或者是负数:自右向左为1,2,3,n 例如:若str=“Hello Bob”,则str0或str9是Hstr5或str4是 str8或str1是bstr9或str10越界出错,取子串,切段:取一个索引范围内的字符.:所取子串:位置索引从start end1start或/和end可省略,缺省值为串的首尾例如:若str=“Hello Bob”,则str0:3是Helstr5:9是 Bobstr:5即str0:5str5:即str5,9str:即str0:9,连接,两字符串的连接+例如:“Hello”+“Bob”得到“HelloBob”一个字符串的重复例如:3*“Hi”和“Hi”*3都得到“HiHiHi”串长度函数len(),编程实例:获得每个月份的缩写,在一个数据表里查找目标def main():months=“JanFebMarAprMayJunJulAugSepOctNovDec”n=input(“Enter month number(1-12):”)pos=(n-1)*3monthAbbr=monthspos:pos+3print“The month abbreviation is”,monthAbbr+”.”这是简单查找:利用位置规律来定位.若是月份全称怎么办?,字符串处理,文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理,字符串的机内表示,与数值一样,计算机内用二进制数表示每一个字符因此操作字符串本质上仍然是数值运算.表示字符的这个数值称为字符的编码.每个字符用什么编码?对这个问题的不同回答就导致了许多不同的字符编码系统例如:字符集只包含AZ,分别用126表示.“8 5 12 12 15”是什么意思?,编码标准,不同计算机若用不同编码体系,则彼此无法沟通。标准化ASCII:单字节编码只用到7位:0-12796个可打印字符,32个控制字符利用8位可扩充ASCII:0-255GB2312:两字节(6763个汉字)GB18030:最多四字节(70244个汉字)Unicode:最多四字节.,字符与编码,求给定字符的编码:ord()ord(a)可得97求给定编码的字符:chr()chr(97)可得a可见Python 2.7支持ASCII.支持中文编码吗?print“你好”,字符串处理,文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理,编码,编码:输出一串字符对应的内码def main():message=raw_input(Enter the message to encode:)for ch in message:print ord(ch),main()执行时Enter the message to encode:abcdef97,98,99,10,11,12,解码,输出一串数字对应的字符串称为解码import stringdef main():code=raw_input(Enter the code of message:)message=for numStr in string.split(code):num=eval(numStr)message=message+chr(num)print the decoded message is:,messagemain()运行时Enter the code of message:97 98 99 100the decoded message is:abcd,几个函数,字符串与数字的相互转换eval(字符串):将字符串转换成数字。例如:eval(“500”)返回500str(表达式):将数值当作字符串。例如:str(3+4*5)string.split:string库中的函数,字符串库,Python提供的string库包含了很多有用的字符串处理函数例如split():将字符串拆分成子串string.split(“Hello string library!”)返回结果:Hello,string,library!string.split(“32,24,25,57”,”,”):按,拆分返回结果:32,24,25,57,字符串库的常用函数,capitalize(s):使字符串s的首字母大写capwords(s):使字符串s中的每个单词首字母大写center(s,width),ljust(s,width),rjust(s,width):使s变成width宽度且居中/左对齐/右对齐count(s,sub):sub在s中出现次数find(s,sub),rfind(s,sub):在s中找sub的首次/末次出现join(seq):将串序列中的串合并成一个串,分隔符默认为空格lower(s),upper(s):将串变成小写/大写lstrip(s),rstrip(s):删除打头/收尾的空格replace(s,oldsub,newsub):在s中用新子串替换旧子串,字符串与密码,字符串在机内使用一个数字序列表示。如果不知道采用什么编码,只看这个数字序列是猜不出表示的是什么字符串。这就是一种加密机制,称为替换法。字符编码都是工业标准,不是为了保密目的,从编码到密码,密码:为了保密而对信息进行编码.加密是计算机的一个重要应用,凯撒密码(Caesar cipher),a-D、b-E、c-F、d-G、e-H s-V、z-C eg.明文:access control 可变为:DFFHVV FRQWURO,字符串处理,文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理,格式化输出,格式化运算符%语法%()语义:模板串中用%标记“空位”,输出时用实际值填入.例如print“The price is$%0.2f”%(100)The price is$100.00,格式描述,%.三种类型字符:decimal,float,string宽度:用多少位置显示数值.省略或指定为0:根据值的实际长度显示.宽度超出值的长度时:右对齐显示宽度前加负号:左对齐.对浮点数用超长宽度会怎样?试试精度:指示浮点数值的小数位数.省略:按系统默认的小数位数显示.print“%f”%(math.pi),浮点数如何精确化?,浮点数的机内表示是近似值.银行应用要求精确表示金额,故不宜用浮点数及浮点运算.解决办法:以“分”为单位,用整数表示金额.设金额是x分,输出时利用x/100和x%100分别得到“元”和“角分”.print“You have%d.%02d”%(x/100,x%100)02d:不足2位用0填充:语句换行继续,字符串处理,文本数据简单的字符串处理字符串的机内表示字符串和密码格式化输出文件处理,文件处理,文件:存储在磁盘上的数据序列.典型的文件结构:基本数据项:可为任何类型若干数据项构成记录若干记录构成文件例如:学生基本数据项:学号,姓名,年龄一个学生记录:学号,姓名,年龄文件:全体学生记录,118,文本文件,文件中是文本数据文本文件可视为存储在磁盘上的字符串.单行字符串多行字符串行尾(EOL):用特殊字符,如新行(newline)字符.Python用n表示新行字符,该字符在显示时被解释成新行字符.例:print“first linensecond line”,文件处理:打开文件,程序不能直接与外存储器交互信息,必须通过内存进行交流打开文件:将磁盘文件与一个程序变量关联,做好读写准备.=open(,):“r”或“w”例如infile=open(“myfile”,“r”)outfile=open(“myfile”,“w”)写打开时小心文件名!因为可能破坏现有文件,文件处理:读写文件,读文件:读出文件内容.read():将整个文件作为一个字符串读入.readline():读入一行.readlines():读入所有行点表示法:文件是对象!写文件:将新内容写入文件.write()若想写多行内容,需写入n,文件处理:关闭文件,关闭文件:取消文件变量与磁盘文件的关联.close()关闭文件时,系统会将内存中文件内容输出到磁盘.,将整个文件作为一个字符串,#file0.pydef main():infile=open(encode.py,r)str=infile.read()print str infile.close()main(),读入文件的前5行,#file1.pydef main():infile=open(encode.py,r)for i in range(5):str=infile.readline()print str infile.close()main(),读入某个文件的所有行,#file3.pydef main():infile=open(encode.py,r)for line in infile.readlines():print line infile.close()main(),125,END,面向对象与图形编程,面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍,数据与操作:传统观点,数据类型某种值的集合运算(操作)的集合计算就是对数据进行操作数据与操作分离数据是被动的,操作是主动的例如:string类型的值是abc等,对串的操作有+,*,len()等,数据与操作:面向对象观点,对象(Object):集数据与操作于一身.对象知道一些信息对象能对那些信息进行处理计算:向对象发出请求操作的消息.主动的数据类型面向对象(Object-Oriented):软件系统由各种对象组成,对象之间通过消息进行交互.现代软件系统几乎都是OO设计和实现.,OO基本概念,类(class):描述同类对象的共性包含的数据:任何类型的数据,甚至可以是对其他对象的引用.能执行的操作(方法)对象(object):类的实例(instance)同类的不同对象可有不同的数据值(实例变量),但能执行的操作是一样的创建对象:使用类的构造器(constructor)初始化对象(,,)消息:请求对象执行它的方法.(,,),对象的方法,不同类型的对象当然提供不同的操作对象一般都提供读取它的实例变量值的方法,统称为accessor。例如Point对象的getX()和getY(),Line对象的getP1()和getP2()。对象一般也提供修改其实例变量的方法,统称为mutator。例如所有图形对象都有move(dx,dy)方法。,面向对象与图形编程,面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍,图形界面,命令行界面通过输入一个个命令名字让计算机去做某项特定的工作。如DOS系统。使用复杂,需要记住一个个命令。图形用户界面(GUI)利用窗口、图标、按钮和菜单等方式驱动程序的执行。如window系统。使用方便,图形编程框架,现代编程语言大都提供图形化变成的工具Python有自带的Tkinter本书作者写的图形库:graphics.py放入文件夹:Python26Libsite_packagesimport graphics或 from graphics import*后者可使引用库函数更方便,面向对象与图形编程,面向对象的思想图形化编程图形对象的使用未知值的图形化处理坐标系的选择图形交互图形模块介绍,创建和关闭窗口,图形窗口:画图的地方创建一个窗口对象用import graphicswin=graphics.GraphWin()win=graphics.GraphWin(窗口的名字,行像素数,列像素数)用from graphics import*win=GraphWin()win=GraphWin(窗口的名字,行像素数,列像素数)关闭窗口:win.close(),图的内部表示,数字图像的表示:用像素(pixel)表示,像素越多,质量越好。黑白图像的像素需要一个bit表示。如1表示白,0表示黑。如需要表示灰度和彩色,则需要多于1个bit。每个像素占用的bit越多,图像质量越好。分辨率:图象中的像素数。图形库创建的窗口默认的分辨率是200*200,图形对象的操作,小测验:窗口中有哪几类对象?创建一个对象各类对象的公共操作将对象显示在窗口中:draw移动对象:move设置对象的填充颜色:setFill设置对象的边界颜色:setOutline,点,点:图形窗口的一个像素,位置用坐标(x,y)表示。坐标系统原点(0,0):左上角x轴:自左向右y轴:自顶向下小测试:默认大小的图形窗口,右下角坐标是?,点(续),创建Point类的对象Point(,)例:p=Point(50,60)对Point对象的操作求坐标:p.getX(),p.getY()在窗口中画自己:p.draw(win)设置点的颜色:p.setOutline(red)移动点:p.move(dx,dy),线段,创建 Line 类的对象Line(,)例如l=Line(Point(0,0),Point(100,100)对 Line 对象的操作在窗口中画自己l.draw(win),圆形,创建Circle类的对象Circle(,)例如c=Circle(Point(50,50),40)对Circle对象的操作填充颜色c.setFill(red)在窗口中画自己c.draw(win),椭圆,给定一个矩形框,创建一个内切Oval类的对象Oval(,)例如o=Oval(Point(20,150),Point(180,199)对Oval对象的操作在窗口中画自己o.draw(win),矩形,创建Rectangle类的对象Rectangle(,)例如r=Rectangle(Point(5,8),Point(30,40)对Rectangle对象的操作在窗口中画自己r.draw(win),多边形,创建Polygon类的对象Polygon(,)例如p=Polygon(Point(10,10),Point(30,30),Point(10,30)对Polygon对象的操作在窗口中画自己p.draw(win),文本,创建Text类的对象t=Text(,)例如t=Text(Point(99,99),”text here”)对Text对象的操作在窗口中画自己t.draw(win)重设字符串t.setText(“new text”),实例:画两只眼睛,方法一:直接创建两个对象leftEye=Circle(Point(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye=Circle(Point(20,50),5)rightEye.setFill(yellow)rightEye.setOutline(red),利用对象复制,错误代码leftEye=Circle(Point(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye=leftEyerightEye.move(20,50)Python中图像对象的赋值是为对象取一个别名,而不是创建一个新对象!,正确代码,leftEye=Circle(Point(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye=Circle(Point(100,50),5)rightEye.setFill(yellow)rightEye.setOutline(red),更美观的代码,使用clo