程序設計思想與方法python講義(第四至五章)課件_第1頁
程序設計思想與方法python講義(第四至五章)課件_第2頁
程序設計思想與方法python講義(第四至五章)課件_第3頁
程序設計思想與方法python講義(第四至五章)課件_第4頁
程序設計思想與方法python講義(第四至五章)課件_第5頁
已閱讀5頁,還剩88頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、程序設計思想與方法45章潘理Email: panli字符串處理文本數據簡單的字符串處理字符串的機內表示字符串和密碼格式化輸出文件處理文本數據計算機應用從科學計算轉向信息管理.信息管理中大量的數據都是文本數據.如姓名,地址,簡歷等等計算機中用字符串來表示文本數據.3字符串類型字符串:字符序列字符串字面值:用一對引號(單或雙)標明.“hello world”!#$%&*“漢字也是字符”字符串中包含引號怎么辦?包含單引號:串用雙引號括住包含雙引號:串用單引號括住兩者都有:更一般的方法是串中用轉義字符print “Alice said, “Hello, Bob”Lu Chaojun, SJTU 4字符

2、串處理文本數據簡單的字符串處理字符串的機內表示字符串和密碼格式化輸出文件處理字符串的輸入普通變量的輸入num = input(“Enter a number: “)Enter a number : 5.6變量num得到值 5.6如果用同樣的方法輸入字符串str = input(“Enter a string: “)Enter a string: JohnPython會輸出出錯信息原因:input()是把輸入當成表達式來計算的!Lu Chaojun, SJTU 6字符串的正確輸入輸入時加上引號str = input(“Enter a string: “)Enter a string: JohnE

3、nter a string: “John”使用raw_input()str = raw_input(“Enter a string: “)Enter a string: Johninput與raw_inputx = input() x = raw_input()“John” Johnx xJohn Johnx = input() x = raw_input()3*4+2 3*4+2x x14 3*4+2Lu Chaojun, SJTU 8字符串賦值字符串可以直接賦值Str = abcdeStrabcde取字符字符串是字符序列,可通過位置索引訪問每個字符.對長度為n的字符串,索引可以是大于0的數

4、:自左向右為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*

5、“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+”.”這是簡單查找:利用位置規律來定位.若是月份全稱怎么辦?字符串處理文本數據簡單的字符串處理字符串的機內表示字符串和密碼格式

6、化輸出文件處理字符串的機內表示與數值一樣,計算機內用二進制數表示每一個字符因此操作字符串本質上仍然是數值運算.表示字符的這個數值稱為字符的編碼.每個字符用什么編碼?對這個問題的不同回答就導致了許多不同的字符編碼系統例如:字符集只包含AZ,分別用126表示.“8 5 12 12 15”是什么意思?編碼標準不同計算機若用不同編碼體系,則彼此無法溝通。標準化ASCII:單字節編碼只用到7位: 0 - 12796個可打印字符,32個控制字符利用8位可擴充ASCII: 0 - 255GB2312:兩字節(6763個漢字)GB18030:最多四字節(70244個漢字)Unicode:最多四字節.字符與編碼

7、求給定字符的編碼: 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 100 101 102解

8、碼輸出一串數字對應的字符串稱為解碼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幾個函數字符串與

9、數字的相互轉換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的首字母大

10、寫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中用新

11、子串替換舊子串字符串與密碼字符串在機內使用一個數字序列表示。如果不知道采用什么編碼,只看這個數字序列是猜不出表示的是什么字符串。這就是一種加密機制,稱為替換法。字符編碼都是工業標準,不是為了保密目的從編碼到密碼密碼:為了保密而對信息進行編碼.加密是計算機的一個重要應用明文密文加密解密凱撒密碼(Caesar cipher)a-D、b-E、 c-F、d-G、e-H s-V 、z-C eg. 明文:access control 可變為: DFFHVV FRQWURO 字符串處理文本數據簡單的字符串處理字符串的機內表示字符串和密碼格式化輸出文件處理格式化輸出格式化運算符%語法 % ()語義:模板串中用

12、%標記“空位”,輸出時用實際值填入.例如print “The price is $%0.2f” % (100)The price is $100.00格式描述%.三種類型字符:decimal, float, string寬度:用多少位置顯示數值.省略或指定為0:根據值的實際長度顯示.寬度超出值的長度時:右對齊顯示寬度前加負號:左對齊.對浮點數用超長寬度會怎樣?試試精度:指示浮點數值的小數位數.省略:按系統默認的小數位數顯示.print “%f” % (math.pi)浮點數如何精確化?浮點數的機內表示是近似值.銀行應用要求精確表示金額,故不宜用浮點數及浮點運算.解決辦法:以“分”為單位,用整數

13、表示金額.設金額是x分,輸出時利用x/100和x%100分別得到“元”和“角分”.print “You have %d.%02d” % (x/100, x%100)02d:不足2位用0填充:語句換行繼續字符串處理文本數據簡單的字符串處理字符串的機內表示字符串和密碼格式化輸出文件處理文件處理文件:存儲在磁盤上的數據序列.典型的文件結構:基本數據項:可為任何類型若干數據項構成記錄若干記錄構成文件例如:學生基本數據項:學號,姓名,年齡一個學生記錄:學號,姓名,年齡文件:全體學生記錄Lu Chaojun, SJTU 32文本文件文件中是文本數據文本文件可視為存儲在磁盤上的字符串.單行字符串多行字符串行

14、尾(EOL):用特殊字符,如新行(newline)字符.Python用n表示新行字符,該字符在顯示時被解釋成新行字符.例:print “first linensecond line”33文件處理:打開文件程序不能直接與外存儲器交互信息,必須通過內存進行交流打開文件:將磁盤文件與一個程序變量關聯,做好讀寫準備. = open(,): “r”或“w”例如infile = open(“myfile”, “r”)outfile = open(“myfile”, “w”)寫打開時小心文件名!因為可能破壞現有文件34文件處理:讀寫文件讀文件:讀出文件內容.read():將整個文件作為一個字符串讀入.rea

15、dline():讀入一行.readlines():讀入所有行點表示法:文件是對象!寫文件:將新內容寫入文件.write()若想寫多行內容,需寫入n35文件處理:關閉文件關閉文件:取消文件變量與磁盤文件的關聯.close()關閉文件時,系統會將內存中文件內容輸出到磁盤.Lu Chaojun, SJTU 36將整個文件作為一個字符串# file0.pydef main(): infile = open(encode.py, r) str = infile.read() print str infile.close()main()讀入文件的前5行# file1.pydef main(): infil

16、e = 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()39END面向對象與圖形編程面向對象的思想圖形化編程圖形對象的使用未知值的圖形化處理坐標系的選擇圖形交互圖形模塊介紹424242數據與操作:傳統觀點數據類型某種值

17、的集合運算(操作)的集合計算就是對數據進行操作數據與操作分離數據是被動的, 操作是主動的例如:string類型的值是abc等, 對串的操作有+, *, len()等4343數據與操作:面向對象觀點對象(Object):集數據與操作于一身.對象知道一些信息對象能對那些信息進行處理計算:向對象發出請求操作的消息.主動的數據類型面向對象(Object-Oriented):軟件系統由各種對象組成, 對象之間通過消息進行交互.現代軟件系統幾乎都是OO設計和實現.444444OO基本概念類(class):描述同類對象的共性包含的數據:任何類型的數據,甚至可以是對其他對象的引用.能執行的操作(方法)對象(o

18、bject):類的實例(instance)同類的不同對象可有不同的數據值(實例變量),但能執行的操作是一樣的創建對象:使用類的構造器(constructor)初始化對象(,,)消息:請求對象執行它的方法.(,,)對象的方法不同類型的對象當然提供不同的操作對象一般都提供讀取它的實例變量值的方法,統稱為accessor。例如Point對象的getX()和getY(),Line對象的getP1()和getP2()。對象一般也提供修改其實例變量的方法,統稱為mutator。例如所有圖形對象都有move(dx,dy)方法。45面向對象與圖形編程面向對象的思想圖形化編程圖形對象的使用未知值的圖形化處理坐標

19、系的選擇圖形交互圖形模塊介紹圖形界面命令行界面通過輸入一個個命令名字讓計算機去做某項特定的工作。如DOS系統。使用復雜,需要記住一個個命令。圖形用戶界面(GUI)利用窗口、圖標、按鈕和菜單等方式驅動程序的執行。如window系統。使用方便圖形編程框架現代編程語言大都提供圖形化變成的工具Python有自帶的Tkinter本書作者寫的圖形庫:graphics.py放入文件夾:Python26Libsite_packagesimport graphics或 from graphics import *后者可使引用庫函數更方便48面向對象與圖形編程面向對象的思想圖形化編程圖形對象的使用未知值的圖形化處

20、理坐標系的選擇圖形交互圖形模塊介紹創建和關閉窗口圖形窗口:畫圖的地方創建一個窗口對象用import graphicswin = graphics.GraphWin()win = graphics.GraphWin(窗口的名字,行像素數,列像素數)用from graphics import *win = GraphWin()win = GraphWin (窗口的名字 ,行像素數,列像素數)關閉窗口:win.close()50圖的內部表示數字圖像的表示:用像素(pixel)表示,像素越多,質量越好。黑白圖像的像素需要一個bit表示。如1表示白,0表示黑。如需要表示灰度和彩色,則需要多于1個bit。

21、每個像素占用的bit越多,圖像質量越好。分辨率:圖象中的像素數。圖形庫創建的窗口默認的分辨率是200*200圖形對象的操作小測驗:窗口中有哪幾類對象?創建一個對象各類對象的公共操作將對象顯示在窗口中:draw移動對象:move設置對象的填充顏色:setFill設置對象的邊界顏色:setOutline點點:圖形窗口的一個像素,位置用坐標(x,y)表示。坐標系統原點(0,0):左上角x軸:自左向右y軸:自頂向下小測試:默認大小的圖形窗口,右下角坐標是?53點(續)創建Point類的對象Point(,)例: p = Point(50,60)對Point對象的操作求坐標:p.getX(), p.get

22、Y()在窗口中畫自己:p.draw(win)設置點的顏色:p.setOutline(red)移動點:p.move(dx, dy)54線段創建 Line 類的對象Line(,)例如l = Line(Point(0,0),Point(100,100)對 Line 對象的操作在窗口中畫自己l.draw(win)55圓形創建Circle類的對象Circle(,)例如c = Circle(Point(50,50),40)對Circle對象的操作填充顏色c.setFill(red)在窗口中畫自己c.draw(win)56橢圓給定一個矩形框,創建一個內切Oval類的對象Oval(,)例如o = Oval(P

23、oint(20,150),Point(180,199)對Oval對象的操作在窗口中畫自己o.draw(win)57矩形創建Rectangle類的對象Rectangle(,)例如r = Rectangle(Point(5,8),Point(30,40)對Rectangle對象的操作在窗口中畫自己r.draw(win)58多邊形創建Polygon類的對象Polygon(,)例如p = Polygon(Point(10,10), Point(30,30),Point(10,30)對Polygon對象的操作在窗口中畫自己p.draw(win)59文本創建Text類的對象t = Text(,)例如t =

24、 Text(Point(99,99),”text here”)對Text對象的操作在窗口中畫自己t.draw(win)重設字符串t.setText(“new text”)60實例:畫兩只眼睛方法一:直接創建兩個對象leftEye = Circle(Point(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye = Circle(Point(20,50),5)rightEye.setFill(yellow)rightEye.setOutline(red)61利用對象復制錯誤代碼leftEye = Circle(Point

25、(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)更美觀的代碼使

26、用clone()復制對象leftEye = Circle(Point(80,50),5)leftEye.setFill(yellow)leftEye.setOutline(red)rightEye = leftEye.clone()rightEye.move(20,0)64面向對象與圖形編程面向對象的思想圖形化編程圖形對象的使用未知值的圖形化處理坐標系的選擇圖形交互圖形模塊介紹編程實例:投資收益柱狀圖用柱狀圖表示10年的投資收益.每年的收益是一個矩形。這些矩形有相同的寬度,但有不同的高度66算法輸入本金和年利率創建圖形窗口確定比例:1原先對應的高度,每一年占用的寬度窗口左邊畫上刻度0號位置畫對

27、應初始本金的矩形,高度為本金值對接下來的1到10年:高度principal = principal * (1 + apr)在相應位置畫對應本利的矩形進一步細化確定圖形窗口的尺寸:如果我們的顯示器用的分辨率是1024*768,我們希望圖形占四分之一的畫面,則可以把分辨率定為512*384創建一個相應的窗口創建512*384的圖形窗口,標題為Investment Growth ChartPython代碼win = GraphWin(Investment Growth Chart, 512, 384)68進一步細化(續)確定刻度的內容和位置內容:0.0K,2.5K,5.0K,7.5K,10.0K位置

28、:確定水平方向30像素為一年,從第80像素開始;垂直方向5個刻度($10,000)平分300像素,即70像素為一檔.算法精化Draw label 0.0K at (20, 320)Draw label 2.5K at (20, 250)Draw label 5.0K at (20, 180)Draw label 7.5K at (20, 110)Draw label 10.0K at (20, 40)用Text函數實現69進一步細化(續)確定0號柱子的位置和高度位置: 左下角坐標為(20,320)高度: principal * (280 / 10000),即右上角y坐標為320 princip

29、al * (280 / 10000).寬度: 故右上角x坐標為20 + 30 = 50算法精化0號柱:從(20,320)到(50,320- principal*0.028)畫矩形70進一步細化(續)其他柱子的位置和高度位置: 左下角為(x, 320).高度: principal*(280/10000),則右上角y坐標為320 principal*(280/10000).寬度: 30,故右上角x坐標為(左下角x坐標+30)算法精化for year 從1到10:principal = principal * (1 + apr)x = 25 * year + 40height = principal

30、 * 0.02從(x,230)到(x + 25,230-height)畫矩形71最后的程序(graph)from graphics import *def main(): win = GraphWin(Investment Growth Chart, 512, 384) Text(Point(20, 320), 0.0K).draw(win) Text(Point(20, 250), 2.5K).draw(win) Text(Point(20, 180), 5.0K).draw(win) Text(Point(20, 110), 7.5K).draw(win) Text(Point(20, 4

31、0), 10.0K).draw(win) principal = input(enter initial principal:) apr = input(enter interest rate: ) bar = Rectangle(Point(70,320), Point(100, 320- principal*0.028) bar.setFill(green) bar.draw(win) x = 100 for year in range(1, 11): principal = principal * (1 + apr) bar = Rectangle(Point(x,320), Point

32、(x+30, 320- principal*0.028) bar.setFill(green) bar.draw(win) x = x + 30 raw_input(press any key to quit: ) win.close()main()面向對象與圖形編程面向對象的思想圖形化編程圖形對象的使用未知值的圖形化處理坐標系的選擇圖形交互圖形模塊介紹自定義坐標系默認坐標系以像素為單位,編程很麻煩.坐標變換:實際數據需映射成窗口像素位置.Graphics模塊提供自定義坐標系的功能,使坐標變換自動完成.好處編程簡單直觀改變窗口像素尺寸對程序幾乎沒影響75自定義坐標系setCoords(左下角的

33、新坐標,左下角的y坐標,右上角的x坐標,右上角的y坐標)Python自動進行新坐標系和像素之間的轉換例子:坐標系變換例如win = GraphWin(“Tic-Tac-Toe”)win.setCoords(0.0, 0.0, 3.0, 3.0)Line(Point(1,0), Point(1,3).draw(win)Line(Point(2,0), Point(2,3).draw(win)Line(Point(0,1), Point(3,1).draw(win)Line(Point(0,2), Point(3,2).draw(win)新坐標系為:左下角(0,0),右上角(3,3)系統自動把新坐

34、標變換成200*200像素坐標編程實例:柱狀圖的改進(graph1)Lu Chaojun, SJTU 77graph1將x坐標分為13份,從0到13將y坐標分成6份,從0到6X坐標1-2是當年信息,2-3是一年后的信息,以此類推Y坐標1是0元,2是2.5K元,3是5K元,from graphics import *def main(): win = GraphWin(Investment Growth Chart, 512, 384) win.setCoords(0.0, 0.0, 13.0, 6.0) Text(Point(0.5,1), 0.0K).draw(win) Text(Point

35、(0.5,2), 2.5K).draw(win) Text(Point(0.5,3), 5.0K).draw(win) Text(Point(0.5,4), 7.5K).draw(win) Text(Point(0.5,5), 10.0K).draw(win) principal = input(enter initial principal:) apr = input(enter interest rate: ) bar = Rectangle(Point(1,1), Point(2, 1 + principal*0.0004) bar.setFill(green) bar.draw(win

36、) for year in range(1, 11): principal = principal * (1 + apr) bar = Rectangle(Point(year+1, 1), Point(year + 2, 1 + principal*0.0004) bar.setFill(green) bar.draw(win) raw_input(press any key to quit: ) win.close()main() 面向對象與圖形編程面向對象的思想圖形化編程圖形對象的使用未知值的圖形化處理坐標系的選擇圖形交互圖形模塊介紹圖形交互界面GUI:圖形元素用于輸入輸出事件:移動鼠標

37、,點擊按鈕,選菜單等.也是對象事件發生后,有相應事件處理程序來處理.事件驅動的編程捕獲事件處理事件:一段程序81捕獲鼠標點擊GraphWin類有一個方法getMouse():調用時等待用戶點擊,并返回點擊位置(是個Point對象).例如:win = GraphWin(Click Me!)for i in range(10):p = win.getMouse()print You clicked (%d, %d) % (p.getX(), p.getY()82編程實例:triangle.py設計一個程序,用鼠標在窗口中任意點三個點,將這三個點連成一個三角形。# Program: triangle.pyfrom graphics import *def main():win = GraphWin(Draw a Triangle)win.setCoords(0.0, 0.0, 10.0, 10.0)message = Text(Point(5, 0.5), Click on three points)message.draw(win)p1 = win.getM

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論