




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Python程序設(shè)計基礎(chǔ)課程講稿PAGE0第頁,共111頁目錄TOC\o"1-3"\h\u第1章PYTHON簡介 21.1什么是Python 21.2Python的優(yōu)點和特性 21.3搭建Python3的編程環(huán)境 41.4運(yùn)行Python的3種方式 41.5Python是怎樣運(yùn)行的 5第2章序列 72.1標(biāo)識符和保留字 72.2變量 72.3數(shù)據(jù)類型 8第3章控制結(jié)構(gòu) 123.13種基本邏輯結(jié)構(gòu) 123.2輸入輸出 123.3順序結(jié)構(gòu) 123.4選擇結(jié)構(gòu) 12第4章函數(shù)和模塊 164.1函數(shù):封裝邏輯 164.2函數(shù):返回數(shù)據(jù) 184.3模塊:簡化代碼重用 204.4模塊庫 20第5章海龜繪圖 235.1第一個海龜程序 235.2旋轉(zhuǎn)的海龜 255.3海龜畫圓 265.4添加顏色 275.5一個變量搞定一切 315.6本章小結(jié) 325.7編程挑戰(zhàn) 32第6章交互界面庫 336.1tinkter簡介 336.2tinkter常見控件 336.2.1標(biāo)簽控件 346.2.2文本框控件 366.2.3菜單控件 386.2.4列表框控件 406.2.5按鈕控件 436.2.6對話框 456.3EasyGUI庫簡介 456.4PyQt庫簡介綜合案例——計算器 46第7章類和對象 507.1基本概念 507.2創(chuàng)建類 507.3創(chuàng)建實例對象 517.4類繼承 557.5彈球游戲 587.6射擊類游戲開發(fā) 597.7動畫類游戲開發(fā) 103第9章爬蟲的應(yīng)用 1229.1網(wǎng)絡(luò)爬蟲基本概念 1229.2爬取單頁數(shù)據(jù) 1259.3爬取多頁數(shù)據(jù) 1289.4案例精選 133第10章機(jī)器學(xué)習(xí) 13610.1K近鄰算法及應(yīng)用 13610.2線性回歸算法及應(yīng)用 13810.3決策樹算法及應(yīng)用 139第11章自然語言處理 14311.1概述 14311.2分詞 14811.3詞云 154第12章微信好友數(shù)據(jù)分析 15812.1微信數(shù)據(jù)分析介紹 15812.2好友性別數(shù)據(jù)分析 15812.3好友簽名數(shù)據(jù)分析 16012.4好友地點數(shù)據(jù)分析 16112.5好友頭像數(shù)據(jù)分析 162
第1章PYTHON簡介[引入]同學(xué)們好!這學(xué)期的python程序設(shè)計基礎(chǔ)課程由我向大家講授,我叫吳迪。上課之前呢,先給大家說一說考核要求:課程考核方式:1.總成績=平時成績(50分)+考試成績(50分)2.考試形式:開卷,筆試,百分制平時成績評定方法:1.由作業(yè)、出勤、課堂表現(xiàn)三方面構(gòu)成。2.采用扣分和獎勵分機(jī)制。3.無故缺席4次及以上,平時成績記0分。1.1什么是PythonPython是一種面向?qū)ο蟮慕忉屝陀嬎銠C(jī)程序設(shè)計語言,由荷蘭人GuidovanRossum于1989年發(fā)明,第一個公開發(fā)行版發(fā)行于1991年。Python是純粹的自由軟件,語法簡潔清晰,特色之一是強(qiáng)制用空白符作為語句縮進(jìn)。Python具有豐富和強(qiáng)大的庫。它常被稱為“膠水語言”,能夠把用其他語言制作的各種模塊很輕松地聯(lián)結(jié)在一起。通常情況下,程序員使用Python快速生成程序的原型,然后對其中有特別要求的部分,用更合適的語言改寫。比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,然后封裝為Python可以調(diào)用的擴(kuò)展類庫。當(dāng)然,在調(diào)用這些擴(kuò)展庫時,程序員需要考慮跨平臺的問題。Python不僅有完整的面向?qū)ο筇匦裕铱梢栽诙喾N操作系統(tǒng)下運(yùn)行,如MicrosoftWindows、Linux、MacOS等。Python的程序代碼簡潔,而且提供大量的程序模塊,這些程序模塊可以幫助用戶快速創(chuàng)建網(wǎng)絡(luò)程序。與其他語言相比,Python往往只需要數(shù)行程序代碼,就可以做到其他語言需要數(shù)十行程序代碼的工作。Python的解釋器是使用C語言所寫成的,程序模塊大部分也是使用C語言寫成。Python的程序代碼是完全公開的,無論是作為商業(yè)用途還是個人使用,用戶都可以任意地復(fù)制、修改或是傳播這些程序代碼。由于Python是一種解釋執(zhí)行的計算機(jī)語言,所以它的應(yīng)用程序運(yùn)行起來會比編譯式的計算機(jī)語言慢一些。1.2Python的優(yōu)點和特性1.2.1Python的優(yōu)點與C++、Java、Perl等語言比較起來,Python的優(yōu)點如下。1.易讀性Python的語法簡潔易讀,無論是初學(xué)者還是已經(jīng)有數(shù)年經(jīng)驗的專家,都可以快速地學(xué)會Python,并且創(chuàng)建高效率的Python應(yīng)用程序。2.高支持性Python的程序代碼是公開的,全世界有無數(shù)的人在搜索Python的漏洞并且修改它。而且源源不斷的新增功能,讓Python成為更有效的計算機(jī)語言。3.快速創(chuàng)建程序代碼Python提供內(nèi)置的解釋器,用戶可以直接在解釋器內(nèi)編寫、測試與運(yùn)行程序代碼而不需要額外的編輯器,也不需要經(jīng)過編譯的步驟。用戶也不需要完整的程序模塊進(jìn)行測試,只需要在解釋器內(nèi)編寫測試的部分就可以。Python解釋器非常有彈性,它允許用戶嵌入C++程序代碼來作為擴(kuò)展模塊。4.重復(fù)使用性Python將大部分函數(shù)以模塊(module)和類庫(package)的形式來存儲。大量的模塊以標(biāo)準(zhǔn)Python函數(shù)庫的形式與Python解釋器一起傳輸。用戶可以將程序分割成數(shù)個模塊,然后在不同的程序中使用。5.高移植性除了可以在多種操作系統(tǒng)中運(yùn)行之外,不同種類的操作系統(tǒng)使用的程序接口也是一樣的。用戶可以在MacOS上編寫Python程序代碼,在Linux上測試,然后加載到WindowsNT上運(yùn)行。當(dāng)然這只是對大部分Python模塊而言的,還有少部分Python模塊是針對特殊的操作系統(tǒng)而設(shè)計的。1.2.2Python的特點Python的特性如下。1.異常(Exception)的處理Python提供異常的處理可讓用戶正確地捕獲程序代碼所發(fā)生的錯誤。2.內(nèi)置的數(shù)據(jù)結(jié)構(gòu)類似于Java中集合類的功能。Python的數(shù)據(jù)結(jié)構(gòu)包括元組、列表、字典等。同時Python還內(nèi)置了操作這些數(shù)據(jù)結(jié)構(gòu)的方法。3.豐富的第三方庫許多協(xié)作廠商、軟件工作人員為Python編寫了大量的第三方庫,這些第三方庫都是標(biāo)準(zhǔn)Python函數(shù)庫的一部分。Python有許多關(guān)于HTTP、FTP、SMTP、Telnet、POP等網(wǎng)絡(luò)的第三方庫,用戶可以利用這些第三方庫快速地創(chuàng)建網(wǎng)絡(luò)程序。4.數(shù)據(jù)的處理Python允許用戶在不同的作業(yè)環(huán)境中編寫CGI程序代碼。Python還有許多內(nèi)置的類(class)與正則表達(dá)式(regularexpression)等方法,可以解析XML、HTML、SGML及其他文本文件。5.自動內(nèi)存管理Python將不再需要的對象自動收集變成垃圾,并且自動處理這些垃圾。6.嵌入與擴(kuò)展Python的程序代碼可以嵌入到許多計算機(jī)語言中,包括腳本語言。用戶隨時可以在這些計算機(jī)語言中調(diào)用Python寫成的模塊。除此之外,Python還允許用戶在Python解釋器內(nèi)加入低級的模塊,這些低級的模塊可以用C或C++編寫。用戶也可以將用C++寫成的模塊加Python的類中。7.面向?qū)ο驪ython有很好的面向?qū)ο筇匦浴?1)運(yùn)算符重載:相同的運(yùn)算符可以有多種含義。(2)動態(tài)數(shù)據(jù)類型:用戶不必為變量設(shè)置數(shù)據(jù)類型,Python會根據(jù)情況自動設(shè)置。用戶甚至可以在程序中動態(tài)改變變量的數(shù)據(jù)類型。(3)命名空間:每一個結(jié)構(gòu)(模塊、類等)都有它自己的命名空間。8.GUI應(yīng)用程序用戶可以使用Python設(shè)計GUI應(yīng)用程序,并且可以同時應(yīng)用在多種操作系統(tǒng)(如WindowsMFC、MacOS、Motif及UNIX’sXWindowSystem等)中。Python安裝程序內(nèi)包括了Tkinter——TkGUIAPI的標(biāo)準(zhǔn)面向?qū)ο蠼涌凇?.數(shù)據(jù)庫Python有連接到各種商業(yè)數(shù)據(jù)庫系統(tǒng)的接口,而且此接口可以同時使用在不同的數(shù)據(jù)庫系統(tǒng)上。10.集成的開發(fā)環(huán)境Python有集成的開發(fā)環(huán)境(IntegratedDevelopmentEnvironment,IDLE),可以讓用戶編輯與調(diào)試程序代碼。1.3搭建Python3的編程環(huán)境目前Python的最新版本是3.5,本書將使用該最新版本。下面將介紹Windows下Python的安裝和運(yùn)行方法。在瀏覽器地址欄中輸入網(wǎng)址/downloads/,按Enter鍵確認(rèn),進(jìn)入Python下載頁面,選擇DownloadPython3.5.2下載鏈接,如圖1-1所示。運(yùn)行Python-3.5.2.exe,彈出如圖1-2所示的安裝界面。Python提供了兩種安裝方式,即InstallNow(立即安裝)和Customizeinstallation(自定義安裝)。這里選擇Customizeinstallation選項,并勾選AddPython3.5toPATH復(fù)選框。1.4運(yùn)行Python的3種方式Python安裝完成后,即可運(yùn)行Python。常見方法有以下3種。1.使用IDLEIDLE(PythonGUI)是在Windows內(nèi)運(yùn)行的Python3.5解釋器(包括調(diào)試功能)。單擊開始按鈕,在彈出的菜單中選擇【所有程序】→IDLE(Python3.532-bit)命令,用戶也可以在搜索框中直接輸入IDLE快速查找。啟動Python3.5.2Shell窗口,用戶在該窗口中可以直接輸入Python命令,然后按Enter鍵運(yùn)行,例如這里輸入“print("我要開始學(xué)習(xí)Python語言啦")”,運(yùn)行結(jié)果如圖所示2.使用Windows命令提示符在搜索框中輸入cmd,選擇【命令提示符】選項,如圖1-9所示。進(jìn)入【命令提示符】窗口,輸入python并按Enter鍵確認(rèn),然后輸入“print("我要開始學(xué)習(xí)Python語言啦")”并按Enter鍵確認(rèn),運(yùn)行結(jié)果如圖1-10所示。3.使用Python自帶命令行Python自帶命令行是在MS-DOS模式下運(yùn)行的Python3.5解釋器。單擊開始按鈕,在彈出的菜單中選擇【所有程序】→Python3.5(32-bit)命令,如圖1-11所示。用戶也可以在搜索框中直接輸入Python快速查找。啟動Python3.5.2(32-bit)窗口,用戶在該窗口中可以直接輸入“print("我要開始學(xué)習(xí)Python語言啦")”,然后按Enter鍵運(yùn)行,結(jié)果如圖1-12所示1.5Python是怎樣運(yùn)行的Python是一種解釋執(zhí)行的語言,所以它運(yùn)行時首先需要一個解釋器,然后就是需要程序運(yùn)行時支持的庫,該庫包含一些已經(jīng)編寫好的組件、算法、數(shù)據(jù)結(jié)構(gòu)等。那么Python是怎么運(yùn)行的呢?整個運(yùn)行過程大致分為以下3個步驟。首先由開發(fā)人員編寫程序代碼,也就是編碼階段。其次,解釋器將程序代碼編譯為字節(jié)碼,字節(jié)碼是以后綴為.pyc文件的形式存在,默認(rèn)放置在Python安裝目錄的_pycache_文件夾下,主要作用是提高程序的運(yùn)行速度,如圖1-18所示。最后,解釋器將編譯好的字節(jié)碼載入一個Python虛擬機(jī)(PythonVirtualMachine)中運(yùn)行。
第2章序列2.1標(biāo)識符和保留字標(biāo)識符用來識別變量、函數(shù)、類、模塊以及對象的名稱。Python的標(biāo)識符可以包含英文字母(A~Z,a~z)、數(shù)字(0~9)及下劃線符號(_),但是它有以下幾個方面的限制。(1)標(biāo)識符的第1個字符必須是字母表中字母或下劃線符號,并且變量的名稱之間不能有空格。(2)Python的標(biāo)識符有大小寫之分,因此Data與data是不同的標(biāo)識符。(3)在Python3中,非ASCII標(biāo)識符也被允許使用。(4)保留字不可以當(dāng)作標(biāo)識符。保留字也叫關(guān)鍵字,不能把它們用作任何標(biāo)識符名稱。讀者可以使用以下命令查看Python的保留字:>>>importkeyword>>>keyword.kwlist。2.2變量確定對系統(tǒng)的綜合要求雖然功能需求是對軟件系統(tǒng)的一項基本需求,但卻并不是唯一的需求。通常對軟件系統(tǒng)有下述幾方面的綜合要求。在Python解釋器內(nèi)可以直接聲明變量的名稱,不必聲明變量的類型,Python會自動判別變量的類型。例如,聲明一個變量x,并且賦值為1:>>>x=1>>>x1例如,聲明一個變量y,并且賦值為100:>>>y=100>>>print(y)100Python中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創(chuàng)建。如果創(chuàng)建變量時沒有賦值,會提示錯誤。例如,下面語句在沒有給變量m賦值的情況下,就開始調(diào)用該變量:>>>mTraceback(mostrecentcalllast):File"<pyshell#0>",line1,in<module>mNameError:name'm'isnotdefined此時錯誤信息會顯示變量m沒有被定義。在Python中,變量就是變量,它沒有類型,這里所說的“類型”是變量所指的內(nèi)存中對象的類型。等號用來給變量賦值。等號運(yùn)算符(=)左邊是一個變量名,等號運(yùn)算符右邊是存儲在變量中的值。Python允許用戶同時為多個變量賦值。例如,下面同時為變量a、b和c賦值為1:>>>a=b=c=1>>>print(a,b,c)111在上述案例中,創(chuàng)建一個整型對象,值為1,三個變量被分配到相同的內(nèi)存空間上。用戶還可以同時為多個對象指定不同的變量值。例如,下面語句同時為變量a、b和c賦不同的變量值:>>>a,b,c=1,2,"山雨欲來風(fēng)滿樓">>>print(a,b,c)12山雨欲來風(fēng)滿樓在該案例中,兩個整型對象1和2分別分配給變量a和b,字符串對象"山雨欲來風(fēng)滿樓"分配給變量c。2.3數(shù)據(jù)類型Python3中有6個標(biāo)準(zhǔn)的數(shù)據(jù)類型,即Number(數(shù)字)、String(字符串)、Sets(集合)、List(列表)、Tuple(元組)和Dictionary(字典)。下面分別介紹這6種數(shù)據(jù)類型的使用方法。Number(數(shù)字)Python3支持int(整數(shù))、float(浮點數(shù))、bool(布爾值)、complex(復(fù)數(shù))四種數(shù)字類型。在Python2中是沒有bool(布爾值)的,它用數(shù)字0表示False,用1表示True。在Python3中,把True和False定義成了關(guān)鍵字,但它們的值還是1和0,而且可以和數(shù)字相加。1.int(整數(shù))下列是整數(shù)的案例:>>>a=2147483647>>>a2147483647可以使用十六進(jìn)制數(shù)值來表示整數(shù),十六進(jìn)制整數(shù)的表示法是在數(shù)字之前加上0x,例如0x80000000、0x100000000L。如下例所示:>>>a=0x7FFFFFFF>>>a21474836472.float(浮點數(shù))浮點數(shù)的表示法可以使用小數(shù)點形式,也可以使用指數(shù)形式。指數(shù)符號可以使用字母e或是E,指數(shù)前可以使用+/-符號,也可以在指數(shù)數(shù)值前加上數(shù)值0;在整數(shù)前也可以加上數(shù)值0。下面舉例說明:3.bool(布爾值)Python的布爾值包括True和False,它只和整數(shù)中的1和0有著對應(yīng)的關(guān)系。例如:>>>True==1True>>>True==2False>>>False==0True>>>False==-1False這里是利用==號判斷左右兩邊是否絕對相等。4.complex(復(fù)數(shù))復(fù)數(shù)的表示法是使用雙精度浮點數(shù)來表示實數(shù)與虛數(shù)的部分,復(fù)數(shù)的符號可以使用字母j或是J。例如,下面是復(fù)數(shù)表示:1.5+0.5j1J2+1e100j3.14e-10j可以使用real與imag屬性分別取出復(fù)數(shù)的實數(shù)與虛數(shù)部分。例如:String(字符串)字符串屬于序列類型(sequencetype)。Python將字符串視為一連串的字符組合,例如字符串“Parrot”,在Python內(nèi)部則是視為"P""a""r""r""o""t"6個字符的組合。第1個字符的索引值永遠(yuǎn)是0,因此存取字符串“Parrot”的第1個字符“P”時使用"Parrot"[0],如下例所示:>>>"Parrot"[0]'P'>>>"Parrot"[1]'a'Sets(集合)Sets(集合)是一個無序不重復(fù)元素的集。它的主要功能是刪除重復(fù)元素和進(jìn)行關(guān)系測試。創(chuàng)建集合時用大括號({})。例如:>>>student={'王平','楊華','王平','李玉','劉天怡'}>>>print(student)#刪除重復(fù)的{'王平','楊華','李玉','劉天怡'}>>>'李玉'instudent#檢測成員True>>>'楊平'instudentFalse如果要創(chuàng)建一個空集合,必須用set()。例如:>>>student=set()List(列表)List(列表)是Python中使用最頻繁的數(shù)據(jù)類型。列表可以實現(xiàn)大多數(shù)集合類的數(shù)據(jù)結(jié)構(gòu)。列表中元素的類型可以不相同,它支持?jǐn)?shù)字、字符串甚至可以包含列表(所謂嵌套)。列表是寫在方括號([])之間、用逗號分隔開的元素列表。要創(chuàng)建一個列表對象,使用中括號[]來包含其元素。例如:>>>s=[1,2,3,4]列表對象s共有4個元素,可以使用s[0]返回第1個元素,s[1]返回第2個元素,以此類推。如果索引值超出范圍,Python會拋出一個IndexError異常。例如:>>>s=[1,2,3,4]>>>s[0]1>>>s[1]2>>>s[2]3>>>s[3]4>>>s[4]Traceback(mostrecentcalllast):File"<pyshell#3>",line1,in<module>s[4]IndexError:listindexoutofrangePython為訪問最后一個列表元素提供了一種特殊語法。通過將索引指定為-1,可以讓Python返回倒數(shù)第一個列表元素。例如:>>>s=[1,2,3,4]>>>s[-1]4在不知道列表長度情況下,上述方法很實用。依次類推,索引-2表示倒數(shù)第二個列表元素Tuple(元組)Tuple(元組)對象屬于序數(shù)對象,它是一群有序?qū)ο蟮募?,并且可以使用?shù)字來做索引。元組對象與列表對象非常類似,其差別在于元組對象不可以新增、修改與刪除。要創(chuàng)建一個元組對象,使用小括號()來包含其元素。其語法為:variable=(element1,element2,...)也可以省略小括號(),直接將元素列出。下面的例子創(chuàng)建一個元組對象,此元組對象有3個元素:1,2,3。>>>t=(1,2,3)>>>t(1,2,3)>>>t=1,2,3>>>t(1,2,3)與列表的索引一樣,元組索引也從0開始。例如:>>>t=(1,2,3)>>>t[0]1Dictionary(字典)Dictionary(字典)是Python內(nèi)非常有用的數(shù)據(jù)類型。字典使用大括號{}將元素列出。元素由鍵值(key)與數(shù)值(value)所組成,中間以冒號(:)隔開。鍵值必須是字符串、數(shù)字或是元組,這些對象是不可變動的。數(shù)值則可以是任何數(shù)據(jù)類型。字典的元素排列并沒有一定的順序,可以使用鍵值來取得該元素。創(chuàng)建字典的語法格式如下:字典變量={關(guān)鍵字1:值1,關(guān)鍵字2:值2,…}在同一個字典之內(nèi),關(guān)鍵字必須是互不相同的。例如:>>>cla={'一班':'李平','二班':'黃玉'}>>>cla['一班']'李平'>>>cla['二班']'黃玉'>>>cla{'二班':'黃玉','一班':'李平'}
第3章控制結(jié)構(gòu)3.13種基本邏輯結(jié)構(gòu)3.2輸入輸出3.3順序結(jié)構(gòu)3.4選擇結(jié)構(gòu)
第4章函數(shù)和模塊本文以這些概念為基礎(chǔ),構(gòu)造一個完整的Python程序。引入了Python函數(shù)和模塊,并展示了構(gòu)建一個Python程序、將其存儲在文件中以及通過命令行運(yùn)行該程序的方法。返璞歸真許多流行的玩具都以這樣一個概念為基礎(chǔ):簡單的積木。這些簡單的積木可通過多種方式組合在一起構(gòu)造出全新的作品——有時甚至完全令人出乎意料。這一概念同樣適用于現(xiàn)實生活中的建筑領(lǐng)域,將基本原材料組合在一起,形成有用的建筑物。平凡無奇的材料、技術(shù)和工具簡化了新建筑物的建造過程,同樣也簡化了對新踏入此領(lǐng)域的人員的培訓(xùn)。相同的基本概念也適用于計算機(jī)程序開發(fā)技術(shù),包括以Python編程語言編寫的程序。本文介紹了使用Python創(chuàng)建基本構(gòu)件(buildingblock)的方法,可用于解決更為復(fù)雜的問題。這些基本構(gòu)件可能小而簡單,也可能龐大而復(fù)雜。無論采用哪種形式,我們這場游戲的目的就是定義基本構(gòu)件,然后使用它們來創(chuàng)建專屬于您的杰作。4.1函數(shù):封裝邏輯在本系列的前幾篇文章中,您通常不得不重復(fù)輸入所有代碼,即便它與上一行代碼完全相同。此要求的惟一特例就是變量的使用:一旦初始化了變量的內(nèi)容,之后就可以隨時重用。顯而易見,這一用法的普及對我們大有好處。描述杰出程序員的最流行的箴言之一就是他們很懶惰。這并不表示杰出的程序員不努力工作——而是說他們喜歡靈活的工作方法,除非絕對必要,否則從不反復(fù)做任何相同的事情。這也就意味著在您需要編寫代碼之前,首先考慮如何實現(xiàn)重用。Python中有多種可實現(xiàn)重用的途徑,但最簡單的技術(shù)莫過于使用函數(shù),也稱為方法或子例程。與絕大多數(shù)現(xiàn)代編程語言類似,Python支持使用方法將一組語句封裝在一起,從而可在必要時重復(fù)使用。清單1給出了一段簡單的偽代碼,為您展示如何在Python中編寫方法。清單1.定義函數(shù)的偽代碼defmyFunction(optionalinputdata):
initializeanylocaldata
actualstatementsthatdothework
optionallyreturnanyresults如您所見,在Python中,函數(shù)的基本組成部分是包裝器代碼,指明將被重用的一系列Python語句。函數(shù)可接受輸入?yún)?shù),輸入?yún)?shù)在緊接著函數(shù)名(在本例中為myFunction)之后的圓括號內(nèi)提供。函數(shù)還可返回值(更為正式的說法是:對象),包括像tuple這樣的Python容器。在真正著手構(gòu)建函數(shù)之前,讓我們先來看看關(guān)于偽代碼的一些簡單卻重要的要點:請注意函數(shù)名中所用的字符大小寫:大多數(shù)字符都是小寫的,但在使用多個單詞連接成一個函數(shù)名時,后接的各單詞首字母應(yīng)大寫(例如,myFunction中的F)。這就是所謂的駝峰式大小寫風(fēng)格(camelcasing),是Python和其他編程語言中廣泛采用的一種技術(shù),可使函數(shù)的名稱更易閱讀。函數(shù)定義中的程序語句采用了縮進(jìn)式排版,函數(shù)體由Python語句塊構(gòu)成,它們也必須像循環(huán)或條件語句那樣縮進(jìn)。函數(shù)定義的第一行也稱為方法簽名(methodsignature),以def開頭(def是define這個單詞的縮寫)。方法簽名以冒號結(jié)尾,表示下面的代碼行是函數(shù)體。至此,您或許已認(rèn)可了使用方法的好處。那么讓我們投入進(jìn)去,開始編寫函數(shù)吧。“DiscoverPython,Part6:ProgramminginPython,Forthefunofit”中使用了一個for循環(huán)來創(chuàng)建乘法表。清單2展示了同樣的概念,但本例中創(chuàng)建的是一個函數(shù),用于封裝乘法表計算背后的邏輯。清單2.第一個函數(shù)>>>deftimesTable():
...forrowinrange(1,6):
...forcolinrange(1,6):
...print"%3d"%(row*col),
>>>timesTable()
12345
246810
3691215
48121620
510152025
>>>t=timesTable
>>>type(t)
<type'function'>
>>>t
<functiontimesTableat0x64c30>
>>>t()
12345
246810
3691215
48121620
510152025timesTable函數(shù)定義起來非常簡單,它不接受任何輸入?yún)?shù),也不返回任何結(jié)果。函數(shù)體幾乎與“DiscoverPython,Part6”中的語句完全相同(但該文章中的乘法表為從1到10)。為了調(diào)用方法,并使其發(fā)揮作用,只需輸入函數(shù)名后接圓括號即可。本例中還輸出了乘法表。在Python中,函數(shù)是一類對象,與整型變量和容器對象相同。因而,您可以將函數(shù)指派給一個變量(切記,在Python中變量是動態(tài)類型化的)。在清單2中,我們將timesTable函數(shù)指派給變量t。接下來的兩行代碼表示變量t確實指向函數(shù)。最后,我們使用變量t調(diào)用timesTable函數(shù)。函數(shù):動態(tài)更改邏輯清單2中的timesTable函數(shù)不復(fù)雜,但也不是特別有用。更有用的示例允許您指定用于生成乘法表的行數(shù)和列數(shù)——換言之,允許您在調(diào)用函數(shù)時動態(tài)地更改函數(shù)的操作方式。在函數(shù)定義中使用兩個輸入?yún)?shù)即可實現(xiàn)這一功能,如清單3所示。清單3.更好的乘法表函數(shù)>>>deftimesTable2(nrows=5,ncols=5):
...forrowinrange(1,nrows+1):
...forcolsinrange(1,ncols+1):
...print"%3d"%(row*cols),
...
>>>timesTable2(4,6)
123456
24681012
369121518
4812162024
>>>timesTable2()
12345
246810
3691215
48121620
510152025
>>>timesTable2(ncols=3)
123
246
369
4812
51015兩個乘法表函數(shù)的定義非常相近,但清單3中的函數(shù)有用得多(通過清單3中的3次調(diào)用即可看出這一點)。為函數(shù)添加此附加功能的方法非常簡單:提供名為nrows和ncols的兩個輸入?yún)?shù),允許在調(diào)用函數(shù)時更改乘法表的大小。這兩個參數(shù)隨后會被提供給生成乘法表的兩個for循環(huán)。關(guān)于timesTable2函數(shù)的另一要點就是兩個輸入?yún)?shù)有默認(rèn)值。在函數(shù)簽名中為參數(shù)提供默認(rèn)值,方法是在參數(shù)名后添加等號和值,例如nrows=5。默認(rèn)參數(shù)使程序獲得了更高的靈活性,因為在您調(diào)用函數(shù)時,可以包含兩個輸入?yún)?shù),也可以僅包含一個輸入?yún)?shù),甚至可以一個參數(shù)都不包含。但這種方法可能會導(dǎo)致某些問題。如果您在函數(shù)調(diào)用期間未指定全部參數(shù),則必須顯式地寫出您所指定的參數(shù)的名稱,以使Python解釋器能夠正確地調(diào)用函數(shù)。最后一個函數(shù)調(diào)用正體現(xiàn)了這一點,它顯式地調(diào)用了帶有ncols=3的timesTable2函數(shù),函數(shù)創(chuàng)建了一個5行(默認(rèn)值)3列(所提供的值)的乘法表。4.2函數(shù):返回數(shù)據(jù)使用方法時,人們最希望獲得的結(jié)果并非總是乘法表。您可能希望完成一次計算,并將計算結(jié)果值返回給調(diào)用代碼。有時要實現(xiàn)這兩個目的,需要分別調(diào)用不返回任何數(shù)據(jù)的調(diào)用方法(子例程)和返回值的方法(函數(shù))。但在Python中,您無需擔(dān)心這些語義問題,因為通過使用return語句,幾乎可以相同的方式實現(xiàn)這兩個目的(參見清單4)。清單4.在函數(shù)中返回一個值>>>defstats(data):
...sum=0.0
...forvalueindata:
...sum+=value
...return(sum/len(data))
...
>>>stats([1,2,3,4,5])#Findthemeanvaluefromalist
3.0
>>>stats((1,2,3,4,5))#Findthemeanvaluefromatuple
3.0
>>>stats()
Traceback(mostrecentcalllast):
File"<stdin>",line1,in?
TypeError:stats()takesexactly1argument(0given)
>>>stats("12345")
Traceback(mostrecentcalllast):
File"<stdin>",line1,in?
File"<stdin>",line4,instats
TypeError:unsupportedoperandtype(s)for+=:'float'and'str'這個簡單的函數(shù)遍歷data(假設(shè)data為一個容納有數(shù)字?jǐn)?shù)據(jù)的Python容器),計算一組數(shù)據(jù)的平均值,然后返回值。函數(shù)定義接受一個輸入?yún)?shù)。平均值通過return語句傳回。當(dāng)您調(diào)用帶有包含數(shù)字1到5的list或tuple的函數(shù)時,返回值會顯示在屏幕上。如果調(diào)用不帶任何參數(shù)的函數(shù)、帶非容器數(shù)據(jù)類型的函數(shù)或帶內(nèi)含非數(shù)字?jǐn)?shù)據(jù)的容器的函數(shù),就會導(dǎo)致出錯。(在此類情況下拋出錯誤是很有意義的。更高級的處理方法應(yīng)包含恰當(dāng)?shù)腻e誤檢查和處理,以應(yīng)對這些情況,但這不在本文討論范圍內(nèi)。)此示例已經(jīng)非常有用,但還可使它更強(qiáng)大,如清單5所示。在Python中,函數(shù)可返回任何有效的對象類型,包括容器類型在內(nèi)。因此,您可以計算多個數(shù)量,并輕松地將多個結(jié)果返回給調(diào)用語句。清單5.返回復(fù)合值>>>defstats(data):
...sum=0.0
...forvalueindata:
...sum+=value
...mean=sum/len(data)
...sum=0.0
...forvalueindata:
...sum+=(value-mean)**2
...variance=sum/(len(data)-1)
...return(mean,variance)
...
>>>stats([1,2,3,4,5])
(3.0,2.5)
>>>(m,v)=stats([1,2,3,4,5,6,7,8,9])
>>>printm,v
5.07.5為了從一個函數(shù)中返回多個值,要將其括在一個括號中并以逗號分隔——換句話說,創(chuàng)建并返回一個tuple。新stats函數(shù)的函數(shù)體要略加修改,以計算數(shù)字序列的樣本方差。最后,正如stats函數(shù)的兩次調(diào)用所示,tuple值可作為一個tuple存取,也可將其解包為各自的分量。4.3模塊:簡化代碼重用至此,您或許已相信了代碼重用的價值。但即便是使用函數(shù),您依然需要在打算使用函數(shù)時重新輸入函數(shù)體。例如,當(dāng)您打開一個新的Python解釋器時,必須鍵入之前所創(chuàng)建的所有函數(shù)。幸運(yùn)的是,您可以使用模塊將相關(guān)函數(shù)(和其他Python對象)封裝在一起,將其保存在一個文件中,然后將這些已定義好的函數(shù)導(dǎo)入到新Python代碼內(nèi),包含于Python解釋器之中。為介紹在Python中使用模塊的方法,我們將重用清單5中的stats方法。有兩個選擇:您可以從與本文相關(guān)的壓縮文件中提取名為test.py的文件,也可以在編輯器中鍵入函數(shù),然后將文件保存為test.py。完成上一步后,在您保存test.py的目錄中啟動一個新的Python解釋器,然后輸入如清單6所示的語句。清單6.使用模塊>>>importtest
>>>test.stats([1,2,3,4,5,6,7,8,9])
(5.0,7.5)
>>>fromtestimportstats
>>>(m,v)=stats([1,2,3,4,5,6,7,8,9])
>>>printm,v
5.07.5第一行importtest打開文件test.py并處理文件中的各條語句。這里僅定義了stats函數(shù),但若需要,您還可定義更多的函數(shù)。調(diào)用stats函數(shù)時,應(yīng)以模塊名test作為函數(shù)前綴。之所以使用這種復(fù)雜的名稱,是出于作用域方面的考慮,作用域表示一個程序內(nèi)名稱的有效范圍。為告知Python您要調(diào)用的是哪個stats方法,就必須提供完整的名稱。這一點非常重要,因為您可能擁有多個名稱相同的對象。作用域規(guī)則可幫助Python判斷您想使用的對象。第三行fromtestimportstats也打開了文件test.py,但它隱式地將stats方法置入當(dāng)前文件的作用域內(nèi),以使您能夠直接調(diào)用stats函數(shù)(無需使用模塊名)。明智地使用from...import...語法可使您的程序更簡潔,但過度的使用也會導(dǎo)致混淆,甚至出現(xiàn)更糟糕的作用域沖突錯誤。不要濫用您的新武器!4.4模塊庫使用Python編程語言的一個主要好處就是大型的內(nèi)置式標(biāo)準(zhǔn)庫,可作為Python模塊訪問。常用模塊示例如下:math包含有用的數(shù)學(xué)函數(shù)。sys包含用于與Python解釋器交互的數(shù)據(jù)和方法。array包含數(shù)組數(shù)據(jù)類型和相關(guān)函數(shù)。datetime包含有用的日期和時間處理函數(shù)。由于這些都是內(nèi)置模塊,因此您可以通過幫助解釋器來了解更多相關(guān)內(nèi)容,如清單7所示。清單7.獲得關(guān)于math模塊的幫助信息>>>help(math)
Traceback(mostrecentcalllast):
File"<stdin>",line1,in?
NameError:name'math'isnotdefined
>>>importmath#Needtoimportmathmoduleinordertouseit
>>>help(math)
Helponmodulemath:
NAME
math
FILE
/System/Library/Frameworks/Python.framework/Versions/2.4/lib/
python2.4/lib-dynload/math.so
DESCRIPTION
Thismoduleisalwaysavailable.Itprovidesaccesstothe
mathematicalfunctionsdefinedbytheCstandard.
FUNCTIONS
acos(...)
acos(x)
Returnthearccosine(measuredinradians)ofx.
asin(...)
asin(x)
Returnthearcsine(measuredinradians)ofx.math模塊的幫助輸出展示了所支持的大量數(shù)學(xué)函數(shù),包括sqrt函數(shù)在內(nèi)。您可以利用此函數(shù)將您的樣本方差計算轉(zhuǎn)換為樣本標(biāo)準(zhǔn)差計算,如清單8所示。清單8.使用多個模塊>>>frommathimportsqrt
>>>fromtestimportstats
>>>(m,v)=stats([1,2,3,4,5,6,7,8,9])
>>>printm,sqrt(v)
5.02.73861278753如您所見,您可以將多個模塊導(dǎo)入到一個Python程序中。在大型、內(nèi)置的模塊庫與更大量的公用庫(其中許多都是開放源碼的)的共同協(xié)助下,您很快也會成為一名懶惰——也就是杰出——的程序員??蓤?zhí)行文件導(dǎo)入一個模塊時,Python解釋器會處理模塊文件內(nèi)的各行。實際上,您可以調(diào)用Python解釋器使其僅處理包含于一個文件中的一個Python程序。在基于UNIX?的操作系統(tǒng)中,您可以輕松創(chuàng)建可執(zhí)行的文件,如清單9所示。清單9.一個完整的Python程序#!/usr/bin/envpython
defstats(data):
sum=0.0
forvalueindata:
sum+=value
mean=sum/len(data)
sum=0
forvalueindata:
sum+=(value-mean)**2
variance=sum/(len(data)-1)
return(mean,variance)
(m,v)=stats([1,2,3,4,5,6,7,8,9])
print"Themeanandvarianceofthevalues"
"from1to9inclusiveare",m,v觀察上例,您應(yīng)該會產(chǎn)生幾分好感,將Python程序置于文件內(nèi),并使其運(yùn)行是如此簡單。本例與test.py文件中的代碼之間惟一的差異就是包含了第一行。在基于UNIX的操作系統(tǒng)中,本行會使Python解釋器自動啟動,并在終止前處理文件中的語句。本示例中的其他行定義了stats函數(shù)、調(diào)用了函數(shù),并輸出了結(jié)果。要運(yùn)行本文件中的語句,您需要啟動一個Python解釋器,并讓它去讀取和處理文件的內(nèi)容。為實現(xiàn)這一目的,您必須首先將清單9中的示例輸入到一個名為mystats.py的文件中,也可從與本文相關(guān)的壓縮文件中提取文件。進(jìn)入包含此文件的目錄,然后按清單10中所示命令執(zhí)行。注意對于Microsoft?Windows?操作系統(tǒng)而言,僅應(yīng)使用第一條命令;其他命令是供UNIX系統(tǒng)(如Linux?或MacOSX)使用的。清單10.執(zhí)行Python程序rb%pythonmystats.py
Themeanandvarianceofthevaluesfrom1to9inclusiveare5.07.5
rb%chmod+xmystats.py
rb%./mystats.py
Themeanandvarianceofthevaluesfrom1to9inclusiveare5.07.5清單10中的命令展示了運(yùn)行一個包含于文件之中的Python程序的方法。第一條命令以文件名調(diào)用Python解釋器,無論使用哪種系統(tǒng)安裝Python、Python解釋器位于哪個目錄下,這種方法都有效。第二條命令chmod使包含Python程序的文件成為可執(zhí)行文件。第三條命令告訴操作系統(tǒng)運(yùn)行程序。這是通過使用env程序?qū)崿F(xiàn)的,這是一種獨(dú)立于操作系統(tǒng)的技術(shù),用于定位和運(yùn)行程序——本例中是Python解釋器。重用與縮減本文介紹了如何在Python中編寫可重用代碼。討論了如何在Python程序中使用方法或可重用塊。方法可接受輸入?yún)?shù),也可返回數(shù)據(jù),包括容器數(shù)據(jù)類型在內(nèi)。這種功能使方法成為一種可處理大量問題的強(qiáng)大途徑。本文還介紹了模塊,模塊可使您將相關(guān)方法及數(shù)據(jù)合并入一個有組織的層次結(jié)構(gòu)中,而此結(jié)構(gòu)可方便地在其他Python程序中重用。最后還介紹了如何將所有這些內(nèi)容組合在一起以創(chuàng)建一個功能完整、獨(dú)立的Python程序。您已經(jīng)看到,代碼的重用也就意味著您的工作量縮減。對于程序員而言,懶惰是一種優(yōu)勢而非陋習(xí)。第5章海龜繪圖在本章中,我們將編寫簡短的、簡單的程序來創(chuàng)建漂亮的、復(fù)雜的視覺效果。為了做到這一點,我們可以使用海龜作圖軟件。在海龜作圖中,我們可以編寫指令讓一個虛擬的(想象中的)海龜在屏幕上來回移動。這個海龜帶著一只鋼筆,我們可以讓海龜無論移動到哪都使用這只鋼筆來繪制線條。通過編寫代碼,以各種很酷的模式移動海龜,我們可以繪制出令人驚奇的圖片。使用海龜作圖,我們不僅能夠只用幾行代碼就創(chuàng)建出令人印象深刻的視覺效果,而且還可以跟隨海龜看看每行代碼如何影響到它的移動。這能夠幫助我們理解代碼的邏輯。5.1第一個海龜程序讓我們使用海龜作圖來編寫第一個程序。在一個新的IDLE窗口中輸入如下的代碼并將其保存為SquareSpiral1.py(你也可以通過http://www.nostarch.com/teachkids/下載該程序以及本書中的所有其他的程序)。SquareSpiral1.py#SquareSpiral1.py-Drawsasquarespiralimportturtlet=turtle.Pen()forxinrange(100):t.forward(x)t.left(90)當(dāng)運(yùn)行這段代碼的時候,我們會得到一幅漂亮整齊的圖片(如圖1所示)。5.1.1讓我們一行一行地分析這個程序,看看它是如何工作的。SquareSpiral1.py的第1行是注釋。正如我們在第1章中所學(xué)過的,注釋以一個井號(#)開頭。注釋允許我們在程序中寫入給自己或以后可能閱讀該程序的其他人一些提示。計算機(jī)不會閱讀或試圖理解井號之后的任何內(nèi)容;注釋只是讓我們寫出關(guān)于程序是做什么的一些說明。在這個例子中,我們將程序的名稱以及針對其做什么的一個簡單說明放入到注釋之中。第2行導(dǎo)入(import)了繪制海龜圖形的功能。導(dǎo)入已經(jīng)編寫過的代碼,這是編程工作的最酷的事情之一。如果我們編寫了一些有趣并有用的程序,可以將其與其他的人分享,同時也可以自己重用它。盡管海龜作圖最初源自20世紀(jì)60年代的Logo編程語言,但一些很酷的Python程序員構(gòu)建了一個庫(library,庫就是可以重用的代碼的一個集合),來幫助其他程序員在Python中使用海龜作圖。當(dāng)我們輸入了importturtle,就表示我們的程序能夠使用那些Python程序員所編寫的代碼。圖1中的小的黑色箭頭表示海龜,它在屏幕上移動的時候會使用鋼筆繪圖。程序的第3行是t=turtle.Pen(),它告訴計算機(jī),我們將使用字母t表示海龜?shù)匿摴P。這使得我們只需要錄入t.forward(),而不是turtle.Pen().forward(),就可以讓海龜在屏幕上移動的時候用海龜?shù)匿摴P進(jìn)行繪制。字母t是告訴海龜做什么的一種快捷方式。第4行最為復(fù)雜。在這里,我們創(chuàng)建了一個循環(huán)(loop),它重復(fù)一組指令很多次(一次又一次地循環(huán)這些代碼行)。這個特定的循環(huán)設(shè)置了一個范圍(range,或列表),其中擁有從0~99的100個數(shù)字(計算機(jī)幾乎總是從0開始計數(shù),而不是像我們通常那樣從1開始)。在該循環(huán)中,字母x遍歷了范圍中的每一個數(shù)字。因此,x從0開始,然后變?yōu)?,然后是2,依次類推,直到99,一共100個步驟。x叫作變量(variable)變量存儲了在程序進(jìn)行的過程中可以修改(變化)的一個值。我們在所編寫的幾乎每一個程序中,都要使用變量,因此,早點認(rèn)識變量為好。接下來的兩行代碼縮進(jìn)了,或者說,在左邊留出了空格。這意味著,它們位于該循環(huán)之中(intheloop)并且和上面的那一行代碼一起,每次x從0~99的范圍中獲取一個新的數(shù)字的時候,這些代碼行都會重復(fù),直到達(dá)到100次。5.1.2發(fā)生了什么讓我們看看Python初次讀取這一組指令的時候發(fā)生了什么。命令t.forward(x)讓海龜?shù)匿摴P在屏幕上向前移動x個點。因為x是0,鋼筆根本不會移動。最后一行代碼t.left(90)讓海龜向左轉(zhuǎn)90°,或者說轉(zhuǎn)四分之一個圈。由于這個for循環(huán),程序繼續(xù)運(yùn)行并且回到了循環(huán)的開始位置。計算機(jī)加1后將x移動到范圍中的下一個值,因為1仍然位于從0~99的范圍中,循環(huán)繼續(xù)?,F(xiàn)在x是1,因此,鋼筆向前移動1個點。然后,鋼筆向左移動90個點,因為代碼是t.left(90)。這樣一次一次地繼續(xù)執(zhí)行,當(dāng)x到達(dá)99,即循環(huán)的最后一次迭代,鋼筆圍繞著正方形螺旋線的外圍畫了一條長長的線條。下面我們隨著x從0增加到100,將循環(huán)的每一步可視化地表示出來。forxinrange(100):t.forward(x)t.left(90)循環(huán)0到4:繪制了前4條線(在x=4之后)。循環(huán)5到8:繪制了另外4條線;正方形出現(xiàn)了。循環(huán)9到12:正方形螺旋線變?yōu)榱?2條線(3個正方形)。計算機(jī)屏幕上的點或像素可能太小了,以至于我們無法很好地看到它們。但是,隨著x變得越來越接近100,海龜繪制的線條包含了越來越多的像素。換句話說,當(dāng)x變得越來越大,t.forward(x)繪制的線條越來越長。屏幕上的海龜箭頭,繪制一會兒,然后向左轉(zhuǎn),再繪制一會兒,再向左轉(zhuǎn),這樣一次又一次地繪制,每次線條都變得越來越長。最后,我們有了一個炫目的正方形形狀。連續(xù)4次向左轉(zhuǎn)90°,就可以得到一個正方形,就像是圍繞一棟建筑連續(xù)4次左轉(zhuǎn)的話,將會帶著我們繞建筑轉(zhuǎn)一圈并且回到起點一樣。在這個示例中,我們之所以得到一個螺旋線,是因為每次左轉(zhuǎn)的時候,都走得更遠(yuǎn)一點。繪制的第一個線條只是1步長(x=1的時候),然后是2(循環(huán)的下一次迭代),然后是3,然后是4,以此類推,直到達(dá)到100步長,這時候,線條的長度為99像素。再一次強(qiáng)調(diào)下,屏幕上的像素可能太小了,以至于我們無法很容易地看到單個的點,但是,它們是存在的,而且我們會看到隨著程序包含更多的像素,線條會變得越來越長。通過完成所有的90°角的旋轉(zhuǎn),我們得到了完美的正方形。5.2旋轉(zhuǎn)的海龜讓我們看看當(dāng)修改了程序中某一個數(shù)值的時候,會發(fā)生什么?學(xué)習(xí)和程序相關(guān)的新知識的一種方法是,當(dāng)我們修改其某一個部分的時候,看看發(fā)生了什么。我們不會總是得到一個很好的結(jié)果,但是,即使是某些地方出錯的時候,我們也能學(xué)到東西。我們只是將程序的最后一行修改為t.left(91),將其保存為SquareSpiral2.py。SquareSpiral2.pyimportturtlet=turtle.Pen()forxinrange(100):t.forward(x)t.left(91)我們提到了向左轉(zhuǎn)90°會創(chuàng)建一個完美的正方形。每次向左轉(zhuǎn)的比90°多一點點的話(在這個例子中,是91°),會將正方形略微向外拋出一點點。由于我們進(jìn)行下一次旋轉(zhuǎn)的時候,已經(jīng)偏離了一點點,隨著程序繼續(xù)進(jìn)行,新的圖形越來越不像是一個正方形。實際上,它創(chuàng)建了一個開始向左旋轉(zhuǎn)的、漂亮的螺旋形,就像是樓梯一樣,如圖2所示。這也是一個漂亮的圖形,可以幫助我們理解如何只略微修改一個數(shù)字,就顯著地改變程序的結(jié)果。1°似乎并不是一個很大的偏差,除非我們偏離1°100次(這加起來就是100°),或者1000次,或者,如果我們使用的是飛機(jī)著陸程序……如果還不知道度是如何工作的,現(xiàn)在先不要擔(dān)心,我們只要嘗試修改數(shù)字,看看發(fā)生了什么就好了。我們通過修改range后面的圓括號中的值,讓程序繪制的線條數(shù)達(dá)到200或500,或者50。我們再嘗試將最后一行的角度修改為91、46、61或121等。記住每次都保存程序,然后,我們運(yùn)行它,看看所做的修改會如何影響到程序的繪制。年齡大一點的讀者了解一些幾何知識,可能會根據(jù)不同的角度看到一些熟悉的形狀,甚至能夠在程序運(yùn)行之前根據(jù)角度來預(yù)測出形狀。較小的讀者則只能夠感受修改帶來的變化,等他們某一天上了幾何課之后,可以再回頭來看這個練習(xí)。5.3海龜畫圓說到幾何,海龜作圖可以繪制很多有趣的形狀,而不只是直線。我們將在5.4節(jié)中再次回到正方形,但現(xiàn)在,讓我們來更多地了解一下PythonTurtle庫。我們再來修改一行代碼:t.forward(x)。我們在前面看到了這條命令或函數(shù),它將海龜?shù)匿摴P向前移動x個像素并且繪制一條筆直的線段;然后,海龜轉(zhuǎn)向并且再次繪制。如果我們修改這行代碼來繪制更為復(fù)雜一點的圖形,例如圓,那會怎么樣呢?好在,繪制一個固定大小(或半徑)的圓的命令,和繪制一條直線的命令一樣簡單。我們將t.forward(x)修改為t.circle(x),如下面的代碼所示。CircleSpiral1.pyimportturtlet=turtle.Pen()forxinrange(100):t.circle(x)t.left(91)哦,將一條命令從t.forward修改為t.circle,會得到一個復(fù)雜得多的形狀,如圖2-3所示。t.circle(x)函數(shù)讓程序在當(dāng)前位置繪制了一個半徑為x的圓。注意,這個繪制和簡單的正方形螺旋線有一些相同點:它也有4組圓形的螺旋線,就像是正方形的螺旋線有4個邊一樣。這是因為我們使用t.left(91)命令,每次向左旋轉(zhuǎn)都將超過90°一點點。如果我們學(xué)習(xí)過幾何就知道,圍繞一個點轉(zhuǎn)一圈有360°,就像是一個正方形有4個90°的角(4×90=360)。海龜通過每次圍繞圖形旋轉(zhuǎn)的比90°多一點點,從而繪制出這個螺旋線的形狀。圖3只需在改動一點就得到一組漂亮的4個螺旋線的圓我們將會看到的一個區(qū)別是,圓形螺旋線比正方形螺旋線要大一些,實際上,大約是前者兩倍那么大。這是因為t.circle(x)使用x作為圓的半徑,而這是從圓心到邊緣的距離,大概是圓的寬度的一半。半徑為x意味著,圓的直徑,也就是說總的寬度是x的兩倍。換句話說,t.circle(x)繪制的圓,當(dāng)x等于1的時候,總寬度為2個像素;當(dāng)x為2的時候總寬度為4個像素;按照這種方式,直到x等于99的時候,其寬度為198個像素。這幾乎是200個像素寬了,或者說是正方形邊最大的時候的兩倍,因此,圓螺旋線看上去是正方形螺旋線的兩倍的大小,當(dāng)然,也會加倍的酷!5.4添加顏色這些螺旋線的形狀不錯,但是,如果它們能夠更多彩一些,是不是更酷呢?讓我們回到正方形螺旋線代碼,在t=turtle.Pen()這一行的后面再添加一行代碼,從而將鋼筆顏色設(shè)置為紅色。SquareSpiral3.pyimportturtlet=turtle.Pen()t.pencolor(“red”)forxinrange(100):t.forward(x)t.left(91)運(yùn)行該程序,我們將會看到正方形螺旋線的一個更多色彩的版本,如圖4所示。我們嘗試用另一種常用的顏色(如“blue”或“green”)來替換掉“red”或“green”并且再次運(yùn)行該程序。我們可以通過Turtle庫使用數(shù)百種不同的顏色,包括一些奇怪的顏色,如“salmon”和“l(fā)emonchiffon”(訪問http://www.tcl.tk/man/tcl8.4/TkCmd/colors.htm可以查看完整的列表)。讓整個螺旋線呈現(xiàn)一種不同的顏色是很不錯的一步,但是,如果想要讓每一邊都顯示一種不同的顏色,我們該怎么辦呢?這需要對程序做一些更多的修改。5.4.1一個四色螺旋線讓我們來考慮一下算法(algorithm)。算法就是一系列的步驟,它可以將單色的螺旋線變?yōu)?色的螺旋線。大多數(shù)的步驟和之前的螺旋線程序中相同,但是,這里還增加了一些調(diào)整:(1)導(dǎo)入turtle模塊并且設(shè)置一個海龜;(2)告訴計算機(jī)應(yīng)該使用何種顏色;(3)設(shè)置一個循環(huán),繪制螺旋線中的100條線段;(4)為螺旋線的每一邊選取一種不同的鋼筆顏色;(5)向前移動海龜以繪制每一邊;(6)將海龜向左轉(zhuǎn),以準(zhǔn)備好繪制下一邊。首先,我們需要顏色名稱的一個列表,而不是單個的顏色,因此,我們要創(chuàng)建一個名為colors的列表變量并且在列表中放置4種顏色,如下所示。colors=[“red”,“yellow”,“blue”,“green”]這個4種顏色的列表,將會針對正方形的每一邊給出一種顏色。注意,我們將顏色的列表放在了方括號“[”和“]”之間。這里要確保引號中的每一種顏色名都像我們在第1章中打印出來的單詞一樣,因為這些顏色名都是字符串(string)或文本值,這是我們稍后要傳遞給pencolor函數(shù)的值。正如前面所提到的,我們使用一個名為colors的變量來存儲4種顏色的列表。因此,任何時候,當(dāng)想要從列表中獲取顏色的時候,我們都要使用colors變量來表示鋼筆的顏色。記住,變量存儲的值是變化的,這正如同其名稱一樣,變量嘛。我們需要做的下一件事情是,每次遍歷繪制循環(huán)的時候修改鋼筆顏色。為了做到這一點,我們需要將t.pencolor()函數(shù)移入到for循環(huán)下的一組指令之中,還需要告訴pencolor函數(shù),我們想要使用列表中的哪一種顏色。我們輸入如下的代碼并運(yùn)行它。ColorSquareSpiral.pyimportturtlet=turtle.Pen()colors=[“red”,“yellow”,“blue”,“green”]forxinrange(100):t.pencolor(colors[x%4])t.forward(x)t.left(91)4種顏色的列表起作用了,我們在這個運(yùn)行的示例中看到了它們(如圖2-5所示)。到目前為止,一切還不錯。圖5正方形螺旋線程序的一個更加多彩的版本pencolor函數(shù)中唯一的新增部分是(colors[x%4])。這條語句中的x和我們在程序中其他地方所使用的x是同一個變量,因此,x將持續(xù)從0~99增加,就像我們前面所見到的那樣。圓括號中的colors變量名告訴Python,從我們在程序前面所添加的、名為colors的顏色名稱列表中選取一種顏色。[x%4]告訴Python我們將使用colors列表中的前4種顏色,即編號從0~3的顏色并且每當(dāng)x變化的時候就遍歷它們。在這個例子中,我們的顏色列表只有4種顏色,因此,我們需要一次又一次地遍歷這4種顏色。colors=[“red”,“yellow”,“blue”,“green”]0123[x%4]中的“%”叫作模除操作符(modulooperator),表示一次除法運(yùn)算中的余數(shù)(remainder)(5÷4商1余1,因此,5可以包含4一次并且還剩下1;6÷4余2,以此類推)。當(dāng)我們想要遍歷列表中一定數(shù)目的項時,例如我們對4種顏色列表所做的操作,模除操作符很有用。在100步中,colors[x%4]將遍歷4種顏色(0、1、2和3,分別表示紅色、黃色、藍(lán)色和綠色)整整25次。如果我們有時間(并且有一個放大鏡),可以數(shù)一數(shù)圖2-5中有25條紅色的、25條黃色的、25條藍(lán)色的和25條綠色的線段。第1次遍歷繪制循環(huán)的時候,Python使用列表中的第一種顏色,紅色;第2次遍歷的時候,它使用黃色,以此類推。第15次遍歷循環(huán)的時候,Python又回過頭來使用紅色,然后是黃色,等等;每通過循環(huán)4次之后,總是又回過頭來使用紅色。5.4.2修改背景顏色讓我們再次加入一點內(nèi)容,創(chuàng)造出比圖2-5更漂亮一些的內(nèi)容。正如我5歲的兒子Alex所指出來的那樣,黃色部分太難以識別出來了。這就像是在白色的繪畫紙上使用黃色的蠟筆一樣,屏幕上的黃色像素?zé)o法在白色背景上明顯地顯示出來。讓我們把背景顏色修改為黑色,來修正這個問題。我們在程序中的import行之后的任何位置,輸入如下的代碼行。turtle.bgcolor(“black”)添加這一行之后,圖片更加漂亮,所有的顏色現(xiàn)在都處在一個黑色的背景之上。注意,海龜鋼筆(在程序中由變量t表示)沒有任何變化。相反,我們修改了海龜屏幕的一些內(nèi)容,也就是背景顏色。turtle.bgcolor()命令允許我們將整個繪制屏幕修改為Python中指定的任何顏色。在turtle.bgcolor(“black”)這一行中,我們選擇了黑色作為屏幕顏色,因此,紅色、黃色、藍(lán)色和綠色都顯示得很好。此外,我們可以將循環(huán)中的range()修改為200甚至更大,以使得螺旋線中的正方形更大。在黑色背景上顯示200個線段的新版本的圖片,如圖6所示。圖6螺旋線程序的路還很長(這是一個簡單的開始)Alex總是想幫助我的程序變得更為驚人,他要求再做一項修改:如果現(xiàn)在把線段替換為圓,那會怎么樣呢?那會不會是最酷的圖片呢?好吧,我必須承認(rèn),這甚至?xí)?。完整的代碼如下所示。ColorCircleSpiral.pyimportturtlet=turtle.Pen()turtle.bgcolor(“black”)colors=[“red”,“yellow”,“blue”,“green”]forxinrange(100):t.pencolor(colors[x%4])t.circle(x)t.left(91)我們可以在圖5-7中看到結(jié)果。圖5-7Alex的驚人的圓螺旋線—一共8行代碼,簡單而優(yōu)雅5.5一個變量搞定一切到目前為止,我們已經(jīng)使用變量來修改顏色、大小以及螺旋線形狀的旋轉(zhuǎn)角度。讓我們再添加一個sides變量,來表示形狀的邊數(shù)。這個新的變量如何改變我們的螺旋線呢?如果要搞清楚這一點,我們嘗試這個新的程序ColorSpiral.py。ColorSpiral.pyimportturtlet=turtle.Pen()turtle.bgcolor(“black”)#Youcanchoosebetween2and6sidesforsomecoolshapes!sides=6colors=[“red”,“yellow”,“blue”,“orange”,“green”,“purple”]forxinrange(360):t.pencolor(colors[x%sides])t.forward(x*3/sides+x)t.left(360/sides+1)t.width(x*sides/200)我們可以將sides的值從6改為2(1個邊并不是很有趣,也不能使用太大的數(shù)字,除非我們在程序的第6行中的列表中,添加更多的顏色),然后保存該程序并且可以運(yùn)行任意多次。圖2-8展示了用sides=6、sides=5,一直到sides=2所創(chuàng)建的圖像,其中sides=2的圖像很奇怪,這就是圖2-8(e)所顯示的扁平的螺旋線。我們可以改變列表中的顏色的順序,也可以在繪制循環(huán)之中的任意函數(shù)中,使用較大一些或較小一點的數(shù)字。如果把程序給搞亂了,我們只需要返回到最初的ColorSpiral.py程序重新來玩就好了。ColorSpiral.py程序使用了一條新的命令t.width(),它修改了海龜鋼筆的寬度。在我們的程序中,隨著鋼筆繪制的形狀越來越大,鋼筆變得越來越寬(其線條變得更粗)。在第3章和第4章,我們學(xué)習(xí)創(chuàng)建程序所需的其他技能的時候,還會再次遇到這個程序以及其他類似的程序。5.6本章小結(jié)在本章中,我們使用Turtle庫的工具繪制了令人印象深刻的彩色形狀。我們使用import命令把這個庫導(dǎo)入到自己的程序中,同時了解到,以這種方式來重用代碼是編程的最強(qiáng)大的功能之一。一旦編寫了有用的內(nèi)容,或者借用某些人慷慨分享的代碼,我們不僅能夠節(jié)省時間,而且能夠使用這些導(dǎo)入的代碼做全新的事情。我們還介紹了程序中像x和sides這樣的變量。這些變量存儲或記住一個數(shù)字或值,以便我們能夠在程序中多次使用它,甚至修改其值。在第3章中,我們將學(xué)習(xí)變量的作用以及Python如何能夠幫助你完成數(shù)學(xué)作業(yè)?,F(xiàn)在,我們應(yīng)該能夠做如下這些事情:用Turtle庫繪制簡單的圖形;使用變量來存儲簡單的數(shù)值和字符串;在IDLE中修改、保存和運(yùn)行程序。5.7編程挑戰(zhàn)嘗試這些挑戰(zhàn)以練習(xí)我們在本章中所學(xué)習(xí)的知識(如果遇到困難,可以訪問/teachkids/尋找示例解答)。#1:修改邊數(shù)在ColorSpiral.py程序中,我們使用了一個變量sides,但是我們并沒有改變它或修改其值,只是再次編輯、保存和運(yùn)行程序。我們嘗試將sides的值改為另一個數(shù)字,例如5,保存并運(yùn)行程序,看看這會對繪制有何影響;現(xiàn)在,試一試4、3、2甚至是1?,F(xiàn)在,我們在程序的第6行,向顏色列表中添加兩種或更多的顏色,顏色名用引號括起來,用逗號隔開。我們可以增加sides的值,來使用這些新的顏色,嘗試一下8或者10甚至更大。#2:有多少邊如果想要在程序運(yùn)行的時候由用戶來決定邊數(shù),我們該怎么做呢?使用我們在第1章中學(xué)習(xí)的內(nèi)容,可以讓用戶輸入邊數(shù)并且將其存儲到sides變量中。唯一額外的步驟是,計算(evaluate)用戶所輸入的數(shù)字。我們可以使用eval()函數(shù)得到用戶輸入的數(shù)字,如下所示。sides=eval(input(“Enteranumberofsidesbetween2and6:“))我們使用前面這一行,替換掉ColorSpiral.py中的sides=6這一行。新的程序?qū)栍脩粝胍吹接卸嗌賯€邊。然后,程序?qū)⒗L制用戶所要求的形狀。嘗試一下!#3:橡皮筋球體我們嘗試將ColorSpiral.py程序修改為一個更大的角度,而且通過在繪制循環(huán)的末尾添加一個額外的轉(zhuǎn)向來扭曲形狀。我們在for循環(huán)的末尾添加諸如t.left(90)的一行,使得角度更加尖銳(記住縮進(jìn),或者說留下空格,以保證該語句位于循環(huán)之中)。
第6章交互界面庫6.1tinkter簡介Tkinter(即tkinterface)是Python標(biāo)準(zhǔn)圖形用戶界面庫,簡稱“Tk”。Tk是一個輕量級的跨平臺圖形用戶界面(GUI)開發(fā)工具。它可以運(yùn)行在大多數(shù)的UNIX平臺、Windows、和Macintosh系統(tǒng)。由于Tkinter是Python自帶的標(biāo)準(zhǔn)庫,因此無須另行安裝,想要使用的時候,只需直接導(dǎo)入即可。Tkinter編寫的程序,也稱為GUI程序,GUI(GraphicalUserInterface)指的是“圖形用戶界面”,它是計算機(jī)圖形學(xué)(CG)的一門分支,主要研究如何在計算機(jī)中表示圖形,以及利用計算機(jī)進(jìn)行圖形的計算、處理和顯示等相關(guān)工作。一個GUI程序一般由窗口、下拉菜單或者對話框等圖形化組件構(gòu)成,通過鼠標(biāo)點擊菜單欄、按鈕或者彈出對話框的形式來實現(xiàn)人機(jī)互動。6.2tinkter常見控件一個完整的GUI程序,是由有許多控件(widgets)構(gòu)成例如按鈕、文本框、輸入框、選擇框、菜單欄等等。為了開發(fā)一個界面設(shè)計優(yōu)雅,功能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高效太陽能電池板制造技術(shù)產(chǎn)業(yè)投資機(jī)會預(yù)測鑒定報告
- 人工智能導(dǎo)論 課件 第18章 專家(知識)系統(tǒng)
- 名單監(jiān)控管理辦法
- 后續(xù)運(yùn)行管理辦法
- 員工加班管理辦法
- 售后信息管理辦法
- 商業(yè)運(yùn)輸管理辦法
- 商品找回管理辦法
- 商戶停車管理辦法
- 嘉興水稻管理辦法
- 自動駕駛車輛的事故責(zé)任歸屬法律問題研究
- 銀行客戶黑名單管理辦法
- 安全應(yīng)急培訓(xùn)課件
- 餐飲廢水排放管理辦法
- 2025年信息技術(shù)基礎(chǔ)知識考試試題及答案
- 作風(fēng)負(fù)面清單管理辦法
- 小兒充血性心力衰竭護(hù)理
- 2025至2030中國西餐廳行業(yè)發(fā)展分析及發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報告
- 2025醫(yī)德醫(yī)風(fēng)培訓(xùn)
- 社?;鸨O(jiān)督培訓(xùn)課件
- 國庫科培訓(xùn)課件
評論
0/150
提交評論