![Python程序設(shè)計(jì)基礎(chǔ) (第3版) 課件 【ch03】Python程序的基本流程控制_第1頁](http://file4.renrendoc.com/view/197f9759c67b9fc172c55d8ae8eeb798/197f9759c67b9fc172c55d8ae8eeb7981.gif)
![Python程序設(shè)計(jì)基礎(chǔ) (第3版) 課件 【ch03】Python程序的基本流程控制_第2頁](http://file4.renrendoc.com/view/197f9759c67b9fc172c55d8ae8eeb798/197f9759c67b9fc172c55d8ae8eeb7982.gif)
![Python程序設(shè)計(jì)基礎(chǔ) (第3版) 課件 【ch03】Python程序的基本流程控制_第3頁](http://file4.renrendoc.com/view/197f9759c67b9fc172c55d8ae8eeb798/197f9759c67b9fc172c55d8ae8eeb7983.gif)
![Python程序設(shè)計(jì)基礎(chǔ) (第3版) 課件 【ch03】Python程序的基本流程控制_第4頁](http://file4.renrendoc.com/view/197f9759c67b9fc172c55d8ae8eeb798/197f9759c67b9fc172c55d8ae8eeb7984.gif)
![Python程序設(shè)計(jì)基礎(chǔ) (第3版) 課件 【ch03】Python程序的基本流程控制_第5頁](http://file4.renrendoc.com/view/197f9759c67b9fc172c55d8ae8eeb798/197f9759c67b9fc172c55d8ae8eeb7985.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三章Python程序的基本流程控制高等學(xué)校計(jì)算機(jī)類特別教材上海市高等學(xué)校信息技術(shù)水平考試參考教材Python程序設(shè)計(jì)基礎(chǔ)了解計(jì)算思維和程序設(shè)計(jì)基本方法。理解并掌握程序設(shè)計(jì)的三種基本結(jié)構(gòu)。熟練運(yùn)用三種基本結(jié)構(gòu)解決各種順序、選擇及重復(fù)執(zhí)行的問題。本章教學(xué)目標(biāo)初步掌握程序的調(diào)試方法。第三章
Python程序的基本流程控制第2章介紹了Python的基本語法,本章將學(xué)習(xí)程序設(shè)計(jì)的三種基本結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)及循環(huán)結(jié)構(gòu),并嘗試采用這三種基本結(jié)構(gòu)來設(shè)計(jì)程序以解決問題。01計(jì)算思維和程序設(shè)計(jì)基本方法PARTONE3.1.1計(jì)算思維計(jì)算思維主要通過抽象、轉(zhuǎn)化、仿真、迭代等方法,把一個(gè)復(fù)雜困難的現(xiàn)實(shí)問題轉(zhuǎn)化為一個(gè)人類知道的、可以利用計(jì)算機(jī)自動解決的問題。與具備傳統(tǒng)的“閱讀、寫作、算術(shù)”能力一樣,計(jì)算思維能力是信息時(shí)代每個(gè)人應(yīng)該擁有的基本思維能力。計(jì)算思維(ComputationalThinking,CT)的概念由美國科學(xué)家周以真(JeannetteM.Wing)教授于2006年在計(jì)算機(jī)權(quán)威期刊CommunicationsoftheACM中提出:計(jì)算思維是運(yùn)用計(jì)算機(jī)科學(xué)的基礎(chǔ)概念進(jìn)行問題求解、系統(tǒng)設(shè)計(jì),以及人類行為理解等涵蓋計(jì)算機(jī)科學(xué)之廣度的一系列思維活動。人類的科學(xué)思維主要包括實(shí)證思維、邏輯思維和計(jì)算思維。其中,實(shí)證思維以觀察和歸納為特征,以物理學(xué)科為代表;邏輯思維以推演和演繹為特征,以數(shù)學(xué)學(xué)科為代表;計(jì)算思維以有限性、確定性和機(jī)械性為特征,以計(jì)算學(xué)科為代表。值得注意的是,計(jì)算思維是人的思想和方法,而不是計(jì)算機(jī)的思維方式。計(jì)算思維與邏輯思維的區(qū)別在于,計(jì)算思維的語義必須是確定性的,不能出現(xiàn)二義性;計(jì)算思維的結(jié)論必須是有限的,在計(jì)算機(jī)中不允許出現(xiàn)數(shù)學(xué)中趨于無窮性的解;計(jì)算思維的執(zhí)行方式必須是機(jī)械的,可以通過具體步驟來實(shí)現(xiàn)。3.1.1計(jì)算思維計(jì)算思維的影響已經(jīng)滲透到物理學(xué)、化學(xué)、生物學(xué)、醫(yī)學(xué)等各類不同學(xué)科,其中Python以其語法簡潔、類庫豐富等優(yōu)點(diǎn),成為計(jì)算思維在各學(xué)科中應(yīng)用的一種有效工具。計(jì)算思維的本質(zhì)是抽象和自動化,即在充分理解計(jì)算過程能力和限制的基礎(chǔ)上,將生活和工作中的復(fù)雜問題選擇合適的方式進(jìn)行分解和化簡(抽象),轉(zhuǎn)化為計(jì)算機(jī)所能處理的簡單問題,并通過編寫或調(diào)用程序自動解決該問題(自動化)。邏輯思維注重演繹,往往可以從原理上推演結(jié)果;而計(jì)算思維則更注重自動化實(shí)現(xiàn),往往基于機(jī)械累加等簡單重復(fù)步驟實(shí)現(xiàn)復(fù)雜的計(jì)算(可從例3-15中體會到)。3.1.1計(jì)算思維3.1.2程序設(shè)計(jì)基本方法眾所周知,現(xiàn)代計(jì)算機(jī)的基本結(jié)構(gòu)為馮·諾依曼結(jié)構(gòu),它包括五大部分:輸入設(shè)備、運(yùn)算器、控制器、存儲器及輸出設(shè)備。程序設(shè)計(jì)遵循的基本模式為IPO(Input,Process,Output),即程序通過輸入設(shè)備輸入計(jì)算機(jī)中,經(jīng)過運(yùn)算器、控制器及存儲器的相互合作完成各類算法處理工作,最后通過輸出設(shè)備輸出運(yùn)算結(jié)果。其中,輸入方式包括交互界面輸入、文件輸入、網(wǎng)絡(luò)輸入等,輸出方式包括屏幕輸出、文件輸出、網(wǎng)絡(luò)輸出等。程序設(shè)計(jì)方法主要包括面向過程的結(jié)構(gòu)化設(shè)計(jì)方法、面向?qū)ο蟮某绦蛟O(shè)計(jì)方法等。其中,結(jié)構(gòu)化設(shè)計(jì)方法是程序設(shè)計(jì)的基本方法,它包含三種基本結(jié)構(gòu):順序結(jié)構(gòu)、分支結(jié)構(gòu)及循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)指程序按照語句順序逐條執(zhí)行,分支結(jié)構(gòu)指程序根據(jù)不同的條件執(zhí)行不同的分支語句,循環(huán)結(jié)構(gòu)指程序根據(jù)特定的條件重復(fù)執(zhí)行部分語句。這三種結(jié)構(gòu)都具備只有一個(gè)入口和一個(gè)出口的共同特點(diǎn),從而使得程序結(jié)構(gòu)層次清晰、簡單易懂。3.1.2程序設(shè)計(jì)基本方法在設(shè)計(jì)一個(gè)程序解決較為復(fù)雜的問題時(shí),通常采取自上而下的設(shè)計(jì)方法,先做頂層設(shè)計(jì),然后將復(fù)雜問題進(jìn)行分解,轉(zhuǎn)化為若干個(gè)可獨(dú)立解決的簡單的子問題,“分而治之”。每個(gè)子問題均可使用順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)或它們的組合進(jìn)行描述,即基于三種基本結(jié)構(gòu)、借助于某種編程語言實(shí)現(xiàn)簡單問題的代碼編寫和自動執(zhí)行,從而得到簡單子問題的解。采用自上而下的程序設(shè)計(jì)過程,可以暫不關(guān)心過程實(shí)現(xiàn)的細(xì)節(jié),可以看作對功能算法的抽象。3.1.2程序設(shè)計(jì)基本方法而在程序編寫完成后,執(zhí)行程序所關(guān)心的是過程自動化實(shí)現(xiàn)的細(xì)節(jié)。對程序的測試通常采用自下而上的執(zhí)行方法,從測試運(yùn)行每個(gè)包含基本結(jié)構(gòu)的細(xì)節(jié)實(shí)現(xiàn)模塊開始,逐步上升到執(zhí)行整個(gè)程序。3.1.2程序設(shè)計(jì)基本方法02順序結(jié)構(gòu)PARTTWO3.2順序結(jié)構(gòu)程序工作的一般流程:數(shù)據(jù)輸入、運(yùn)算處理、結(jié)果輸出。順序結(jié)構(gòu)是指為了解決某些實(shí)際問題,自上而下地依次執(zhí)行各條語句,其流程圖如圖3-1所示。下面通過幾個(gè)例子學(xué)習(xí)如何使用順序結(jié)構(gòu)解決各種常見問題?!纠?-1】編寫程序,從鍵盤輸入語文、數(shù)學(xué)、英語三門功課的成績,計(jì)算并輸出平均成績,要求平均成績保留1位小數(shù)。程序的執(zhí)行流程:輸入三門功課的成績,計(jì)算平均成績,輸出平均成績。輸入時(shí),使用轉(zhuǎn)換函數(shù)將字符串轉(zhuǎn)換為浮點(diǎn)數(shù);輸出時(shí),采用格式輸出方式控制小數(shù)點(diǎn)的位數(shù)。代碼如下:3.2順序結(jié)構(gòu)【例3-2】編寫程序,從鍵盤輸入圓的半徑,計(jì)算并輸出圓的周長和面積。在計(jì)算圓的周長和面積時(shí)需要使用π的值,Python的math模塊中包含常量pi,通過導(dǎo)入math模塊可以直接使用該值,然后使用周長和面積公式進(jìn)行計(jì)算即可。代碼如下:3.2順序結(jié)構(gòu)3.2順序結(jié)構(gòu)【例3-3】編寫程序,從鍵盤輸入年份,輸出當(dāng)年的年歷。Python的內(nèi)置日歷模塊calendar有下列常用函數(shù)?!馽alendar.weekday(year,month,day):獲取指定日期為星期代碼整數(shù),0為星期一,1為星期二,其余類推?!馽alendar.monthcalendar(year,month):返回year年month月中以日期為一維元素列表,以每周日期列表為元素的二維列表?!馽alendar.month(year,month):以多行文本字符串格式返回year年month月的日歷?!馽alendar.calendar(year):以多行字符串形式返回year年的日歷。導(dǎo)入calendar模塊,然后調(diào)用該模塊中的函數(shù)calendar(year)即可得到該年的日歷。代碼如下:3.2順序結(jié)構(gòu)03分支結(jié)構(gòu)PARTTHREE3.3分支結(jié)構(gòu)分支結(jié)構(gòu)可以分為單分支結(jié)構(gòu)和多分支結(jié)構(gòu),用于解決生活中形形色色的選擇問題。在Python中,這兩種結(jié)構(gòu)分別用if語句和if-elif-else語句描述。3.3.1分支結(jié)構(gòu)if語句為單分支結(jié)構(gòu),僅處理?xiàng)l件成立的情況,其流程圖如圖3-2所示。從圖中可以看出,當(dāng)表達(dá)式的值為真時(shí),執(zhí)行相應(yīng)的語句塊(一條或多條語句);當(dāng)表達(dá)式的值為假時(shí),直接跳出if語句,執(zhí)行其后面的語句。書寫格式:關(guān)鍵字if與表達(dá)式之間用空格隔開,表達(dá)式后接英文冒號;語句塊中的全部語句均縮進(jìn)4個(gè)空格,如圖3-3所示。3.3.2if-elif-else語句if-elif-else語句為多分支結(jié)構(gòu),主要用于處理有多個(gè)條件的情況,從而解決現(xiàn)實(shí)生活中復(fù)雜的多重選擇問題,其流程圖如圖3-4所示。如果表達(dá)式1的值為真,則執(zhí)行相應(yīng)的語句塊A;如果表達(dá)式1的值為假,則繼續(xù)判斷表達(dá)式2的值,如果表達(dá)式2的值為真,則執(zhí)行語句塊B;如果表達(dá)式2的值也為假,則繼續(xù)判斷表達(dá)式3的值,其余類推,直到所有的表達(dá)式都不滿足(表達(dá)式的個(gè)數(shù)為1個(gè)或多個(gè))為止,然后執(zhí)行else后面的語句塊。書寫格式:關(guān)鍵字if與表達(dá)式1之間用空格隔開,表達(dá)式1后接英文冒號;所有關(guān)鍵字elif均與關(guān)鍵字if左對齊,elif與其后的表達(dá)式之間用空格隔開,表達(dá)式后接英文冒號;關(guān)鍵字else與關(guān)鍵字if左對齊,后接英文冒號;所有語句塊左對齊,即所有語句塊中的全部語句均縮進(jìn)4個(gè)空格,如圖3-5所示。3.3.2if-elif-else語句如果只考慮一種表達(dá)式成立或不成立的結(jié)果(沒有elif分支),則多分支的if結(jié)構(gòu)轉(zhuǎn)化為雙分支的if結(jié)構(gòu)。3.3.2if-elif-else語句在使用分支結(jié)構(gòu)時(shí),需要注意以下事項(xiàng):①
表達(dá)式可以是任意類型,如5>3、x==y、xandy>z、3、0等。其中,3表示恒真(True),而0表示恒假(False)。②
可以僅有if子句,構(gòu)成單分支結(jié)構(gòu),但是else子句必須與if子句配對,不能出現(xiàn)僅有else子句沒有if子句的情況。③
各語句塊可以包含一條或多條語句。如果是多條語句,則所有語句必須左對齊。3.3.2if-elif-else語句【例3-4】編寫程序,從鍵盤輸入一個(gè)整數(shù),判斷該數(shù)是否為偶數(shù)判斷一個(gè)整數(shù)是否為偶數(shù)的方法是用該數(shù)對2取余數(shù)。如果結(jié)果等于0,則該數(shù)為偶數(shù)。代碼如下:3.3.2if-elif-else語句【例3-5】編寫程序,從鍵盤輸入三條邊,判斷是否能夠構(gòu)成一個(gè)三角形。如果能,則提示可以構(gòu)成三角形;如果不能,則提示不能構(gòu)成三角形。組成三角形的條件是任意兩邊之和大于第三邊。如果條件成立,則能構(gòu)成三角形。當(dāng)表達(dá)式中的多個(gè)條件必須全部成立時(shí),條件之間使用and運(yùn)算符連接起來。代碼如下:3.3.2if-elif-else語句【例3-6】編寫程序,調(diào)用隨機(jī)函數(shù)生成一個(gè)1~100之間的隨機(jī)整數(shù),從鍵盤輸入數(shù)字進(jìn)行猜謎,給出猜測結(jié)果(太大、太小、成功)的提示。Python的內(nèi)置隨機(jī)數(shù)模塊random有下列常用函數(shù)。random.random():生成一個(gè)半開區(qū)間(0.0,1.0)內(nèi)的浮點(diǎn)數(shù)。random.randint(start,stop):生成一個(gè)閉區(qū)間[start,stop]內(nèi)的整數(shù)。3.3.2if-elif-else語句random.randrange(start,stop[,step]):隨機(jī)返回range(start,stop[stepl)中的整數(shù)。random.choice(seq):隨機(jī)從序列seq(字符串、元組、列表)中挑選并返回一個(gè)元素。random,shuffle(lst):將列表lst中的序列隨機(jī)重排(不能作用于字符串和元組)。3.3.2if-elif-else語句此例中引入random模塊,調(diào)用其中的函數(shù)randint(a,b)產(chǎn)生介于a和b之間的隨機(jī)整數(shù)(產(chǎn)生的隨機(jī)數(shù)大于或等于a且小于或等于b),然后從鍵盤輸入一個(gè)數(shù)與該隨機(jī)數(shù)進(jìn)行比較,并輸出判斷結(jié)果。代碼如下:3.3.2if-elif-else語句3.3.3分支語句嵌套當(dāng)有多個(gè)條件需要滿足并且條件之間有遞進(jìn)關(guān)系時(shí),可以使用嵌套的分支語句。其中,if語句、elif語句以及else語句中都可以嵌套if語句或者if-elif-else語句。書寫格式:嵌套的if語句要求以鋸齒形縮進(jìn)格式書寫,從而分清層次關(guān)系。例如,婚姻法規(guī)定,男性22歲為合法結(jié)婚年齡,女性20歲為合法結(jié)婚年齡。因此如果要判斷一個(gè)人是否到了合法結(jié)婚年齡,首先需要使用雙分支結(jié)構(gòu)判斷性別,再用遞進(jìn)的雙分支結(jié)構(gòu)判斷年齡,并輸出判斷結(jié)果。代碼如下:3.3.3分支語句嵌套【例3-7】編寫程序,從鍵盤輸入用戶名和密碼,要求先判斷用戶名再判斷密碼。如果用戶名不正確,則直接提示用戶名有誤;如果用戶名正確,則進(jìn)一步判斷密碼,并給出判斷結(jié)果的提示。因?yàn)橐笙扰袛嘤脩裘倥袛嗝艽a,所以本程序的一種做法是使用嵌套的if語句:外層if語句用于判斷用戶名,如果用戶名正確則進(jìn)入內(nèi)層if語句,判斷密碼并給出判斷結(jié)果;如果用戶名不正確,則直接給出錯(cuò)誤提示。代碼如下:3.3.3分支語句嵌套【例3-8】編寫程序,開發(fā)一個(gè)小型計(jì)算器,從鍵盤輸入兩個(gè)數(shù)字和一個(gè)運(yùn)算符,根據(jù)運(yùn)算符(+、一、*和/)進(jìn)行相應(yīng)的數(shù)學(xué)運(yùn)算。如果不是這4種運(yùn)算符,則給出錯(cuò)誤提示。因?yàn)樾枰鶕?jù)4種運(yùn)算符的類別執(zhí)行相應(yīng)的運(yùn)算,所以使用多分支if-elif-else語句;對于除法運(yùn)算,由于除數(shù)不能為0,因此需要使用嵌套的if語句來判斷除數(shù)是否為0,并執(zhí)行3.3.3分支語句嵌套04循環(huán)結(jié)構(gòu)PARTFOUR3.4循環(huán)結(jié)構(gòu)為了逼近所需目標(biāo)或結(jié)果重復(fù)反饋的過程稱為迭代。一次對過程的重復(fù)稱為一次迭代,而每次迭代得到的結(jié)果會作為下一次迭代的初始值,重復(fù)執(zhí)行一系列相同的運(yùn)算步驟,從前面的量依次求出后面的量。在人類實(shí)踐活動中,源自計(jì)算機(jī)程序設(shè)計(jì)的迭代思想已經(jīng)由一種算法逐步升級發(fā)展為一種方法、理念和思維模式——計(jì)算思維。迭代過程是一個(gè)創(chuàng)新的過程,充滿著量變到質(zhì)變的飛躍。例如,在產(chǎn)品設(shè)計(jì)中,在原有產(chǎn)品基礎(chǔ)上迭代構(gòu)建新產(chǎn)品,從而不斷逼近用戶需求,就體現(xiàn)了計(jì)算思維遞增式、演進(jìn)式的迭代策略應(yīng)用。循環(huán)結(jié)構(gòu)是迭代思想在程序設(shè)計(jì)中的具體體現(xiàn)。循環(huán)在日常生活中隨處可見,例如,登錄郵箱時(shí),如果輸入的用戶名或密碼不正確,系統(tǒng)將提示重新輸入,直到輸入正確或超過次數(shù)限制為止。3.4.1while語句while語句用于描述循環(huán)結(jié)構(gòu),在滿足循環(huán)條件時(shí)重復(fù)執(zhí)行某件事情,其流程圖如圖3-6所示。從圖中可以看出,當(dāng)表達(dá)式的值為真時(shí),執(zhí)行相應(yīng)的語句塊(循環(huán)體),然后再判斷表達(dá)式的值,如果為真,則繼續(xù)執(zhí)行語句塊……當(dāng)表達(dá)式的值為假時(shí),檢查其后面是否有else子句(因?yàn)榭蛇x,所以流程圖中未畫出),如果有,則執(zhí)行else子句;如果沒有,則直接跳出while語句,執(zhí)行其下面的語句。書寫格式:關(guān)鍵字while與表達(dá)式之間用空格隔開,表達(dá)式后接英文冒號,關(guān)鍵字else與關(guān)鍵字while左對齊,后接英文冒號;所有語句塊左對齊,即語句塊中的全部語句均縮進(jìn)4個(gè)空格,如圖3-7所示。3.4.1while語句本例中計(jì)次數(shù)time的初始值為8,循環(huán)條件為計(jì)次數(shù)小于12,循環(huán)體為輸出“有效次數(shù)內(nèi)”并使計(jì)次數(shù)加1。每輪循環(huán)均需判斷計(jì)次數(shù),直到計(jì)次數(shù)等于12時(shí),輸出“計(jì)次已滿”并結(jié)束循環(huán)。3.4.1while語句在使用while語句時(shí),需要注意以下事項(xiàng):①與if語句類似,while語句中的表達(dá)式可以是任意類型,如x!=y、x>3orx<5、-5等。②循環(huán)體中的語句塊有可能一次也不執(zhí)行。上例中,若初始值time=13,則語句塊不會執(zhí)行。③語句塊可以包含一條或多條語句。上例中,while子句的語句塊中為兩條語句,else子句的語句塊中為一條語句。④while語句中的else子句可以省略。上例中,若沒有else子句,則當(dāng)計(jì)次數(shù)等于12時(shí),while語句結(jié)束,程序繼續(xù)執(zhí)行while語句后面的語句。⑤程序中需要包含使循環(huán)結(jié)束的語句。上例中,若缺少語句time=time+1,則程序無法終止。3.4.1while語句死循環(huán)(endlessloop):又稱無限循環(huán)(infinitloop),是指無法靠自身的控制條件終止的循環(huán)。在while循環(huán)結(jié)構(gòu)中,如果表達(dá)式的值恒為真,循環(huán)將一直執(zhí)行下去,無法靠自身終止,從而產(chǎn)生死循環(huán)。通常,程序中要盡量避免出現(xiàn)死循環(huán),但死循環(huán)并非一無是處,在某些特定場合,添加了終止控制條件的死循環(huán)可以發(fā)揮重要的作用。3.4.1while語句【例3-9】編寫程序,統(tǒng)計(jì)并輸出1~1000中所有能夠同時(shí)被3和7整除的數(shù)字個(gè)數(shù)。循環(huán)變量的初始值為1,如果循環(huán)變量的值小于或等于1000(滿足循環(huán)進(jìn)行的條件),則進(jìn)入循環(huán)體使用if語句進(jìn)行判斷,然后循環(huán)變量自增1并進(jìn)入下一輪循環(huán),循環(huán)結(jié)束后輸出統(tǒng)計(jì)結(jié)果。代碼如下:3.4.1while語句
3.4.1while語句3.4.2for語句和內(nèi)置函數(shù)range()除while語句外,Python還提供了另外一種功能強(qiáng)大的描述循環(huán)結(jié)構(gòu)的語句——for語句。從可迭代對象(字符串、列表、元組、字典、迭代器等)的頭部開始,依次選擇每個(gè)元素并對其進(jìn)行一些操作直到結(jié)束,這種處理模式稱為遍歷(traversal)。for語句用于遍歷可迭代對象中的所有元素,遍歷結(jié)束后可執(zhí)行else子句(與while語句中的else子句類似,for語句中的else子句也是可選的)。書寫格式:關(guān)鍵字for+空格+循環(huán)變量+空格+關(guān)鍵字in+空格+對象(“+”的意思是后接),后接英文冒號,關(guān)鍵字else與關(guān)鍵字for左對齊,后接英文冒號;所有語句塊左對齊,即語句塊中的全部語句均縮進(jìn)4個(gè)空格,如圖3-8所示。3.4.2for語句和內(nèi)置函數(shù)range()程序運(yùn)行結(jié)果為“Hello”,即依次輸出字符串"Hello"中的每個(gè)字母并以空格隔開。程序運(yùn)行結(jié)果為“25hello12.8A”,即依次輸出列表中的每個(gè)元素并以空格隔開。3.4.2for語句和內(nèi)置函數(shù)range()程序運(yùn)行結(jié)果為“4”,即以遍歷方式計(jì)算出“山”在字符串中出現(xiàn)的次數(shù)。for語句經(jīng)常與內(nèi)置函數(shù)range()配合使用。range()用于生成整數(shù)序列,通常的寫法是:range(start,end,step)。其中,start決定序列的起始值(起始值可以省略,省略時(shí)該值為0),end代表序列的終值(索引范圍是半開區(qū)間,不包括end的值),step代表序列的步長(可以省略,默認(rèn)值是1)。3.4.2for語句和內(nèi)置函數(shù)range()程序運(yùn)行結(jié)果為“468”,因?yàn)樗饕秶前腴_區(qū)間,所以不包括數(shù)字10。例如:程序運(yùn)行結(jié)果為“10864”,因?yàn)椴介L為-2,所以輸出結(jié)果依次遞減。例如:程序運(yùn)行結(jié)果為“01234”,起始值省略,從0開始;步長省略,步長為1。3.4.2for語句和內(nèi)置函數(shù)range()【例3-11】編寫程序,使用for語句計(jì)算1~10000范圍內(nèi)的自然數(shù)之和。首先初始化總和的值為0,然后使用for語句將range()函數(shù)中的元素依次添加到總和中。因?yàn)閞ange()的索引范圍為開區(qū)間,所以終值設(shè)為10001。代碼如下:3.4.2for語句和內(nèi)置函數(shù)range()【例3-12】編寫程序,解決以下問題。4個(gè)人中有一個(gè)人做了好事,已知有三個(gè)人說了真話,根據(jù)下面的對話判斷是誰做的好事。A說:不是我。B說:是C。C說:是D。D說:C說得不對。做好事的人是4個(gè)人之一,因此可以將4個(gè)人的編號存入列表中,然后使用for語句依次進(jìn)行判斷;有三個(gè)人說了真話,將編號依次代入,使用if語句判斷是否滿足“有三個(gè)人說了真話”(三個(gè)邏輯表達(dá)式的值為真)的條件,如果滿足,則輸出結(jié)果。代碼如下:3.4.2for語句和內(nèi)置函數(shù)range()3.4.3循環(huán)語句嵌套為了解決復(fù)雜的問題,可以使用嵌套的循環(huán)語句,嵌套層數(shù)不限,但是循環(huán)的內(nèi)外層之間不能交叉。其中,雙層循環(huán)是一種常用的循環(huán)嵌套,循環(huán)的總次數(shù)等于內(nèi)外層數(shù)之積。當(dāng)外層循環(huán)變量i的值為1時(shí),內(nèi)層循環(huán)變量j的值從1開始,輸出i*j的值并依次遞增,因此輸出“12
3”,內(nèi)層循環(huán)執(zhí)行結(jié)束;然后回到外層循環(huán),i的值遞增為2,而j的值重新從1開始,輸出itj的值,并依次遞增,輸出“2
4
6”。因此,程序的運(yùn)行結(jié)果為“1
2
32
46”。【例3-13】編寫程序,使用雙重循環(huán)輸出九九乘法表。由于需要輸出9行9列的二維數(shù)據(jù),因此需要使用雙重循環(huán),外層循環(huán)用于控制行數(shù),內(nèi)層循環(huán)用于控制列數(shù)。為了規(guī)范輸出格式,可以使用print語句的格式控制輸出方式。其中,"t"的作用是跳到下一個(gè)制表位。代碼如下:3.4.3循環(huán)語句嵌套【例3-14】編寫程序,使用雙重循環(huán)輸出如圖3-9所示的三角形圖案。觀察可知圖形包含5行,因此外層循環(huán)執(zhí)行5次。每行內(nèi)容由三部分組成:第一部分為輸出空格,第二部分為輸出星號,第三部分為輸出回車符,分別通過兩條for語句和一條print語句實(shí)現(xiàn)。代碼如下:3.4.3循環(huán)語句嵌套【例3-15】以一道“奧數(shù)”題的解題過程,體會計(jì)算思維與邏輯思維的差別。有一個(gè)以文字代替數(shù)字的算術(shù)表達(dá)式如圖3-10所示,已知4個(gè)替代數(shù)字的文字中沒有重復(fù),編寫程序求出文字所替代的數(shù)字。按邏輯思維,如果3位數(shù)和3位數(shù)相加等于4位數(shù),則“青”只能是1;“山”+“青”大于或等于10,因此“山”只能是9,推得“龍”是0;個(gè)位的兩個(gè)“山”相加,推得“外”是8。3.4.3循環(huán)語句嵌套而按計(jì)算思維,則注重于程序的實(shí)現(xiàn),用窮舉法設(shè)計(jì)嵌套的4層循環(huán),把所有的數(shù)字都試一遍,找出滿足算術(shù)表達(dá)式條件的4個(gè)數(shù)字不相互重復(fù)的組合。代碼如下:3.4.3循環(huán)語句嵌套此例的4層嵌套循環(huán)結(jié)構(gòu)體現(xiàn)出了“自上而下”的總體設(shè)計(jì),而具體運(yùn)行卻是從最內(nèi)層循環(huán)“自下而上”地執(zhí)行,逐步上升到執(zhí)行整個(gè)程序。3.4.3循環(huán)語句嵌套3.4.4轉(zhuǎn)移和中斷語句1break語句break語句用于中斷當(dāng)前循環(huán)的執(zhí)行,并跳出循環(huán)。對于包含clse子句的while循環(huán)和for循環(huán)而言,在while或for循環(huán)中一旦執(zhí)行break語句,else子句將沒有機(jī)會執(zhí)行。【例3-16】編寫程序,隨機(jī)產(chǎn)生骰子的一面(數(shù)字1~6),給用戶三次猜測機(jī)會,程序給出猜測提示(偏大或偏小)。如果某次猜測正確,則提示正確并中斷循環(huán);如果三次均猜錯(cuò),則提示機(jī)會用完。使用隨機(jī)函數(shù)產(chǎn)生隨機(jī)整數(shù),設(shè)置循環(huán)初始值為1,循環(huán)次數(shù)為3,在循環(huán)體中輸入猜測并進(jìn)行判斷,如果正確則使用break語句中斷并跳出循環(huán)。代碼如下:3.4.4轉(zhuǎn)移和中斷語句半程循環(huán):前面介紹過死循環(huán)的概念,在死循環(huán)程序中,通過添加break語句終止程序的執(zhí)行,稱為半程循環(huán)。例如:3.4.4轉(zhuǎn)移和中斷語句2continue語句與break語句不同,continue語句用于中斷本輪循環(huán)的執(zhí)行,進(jìn)入下一輪循環(huán)條件的判斷。3.4.4轉(zhuǎn)移和中斷語句【例3-17】編寫程序,從鍵盤輸入一段文字,如果其中包括“密”字(可能出現(xiàn)0次、1次或者多次),則輸出時(shí)過濾掉該字,其他內(nèi)容原樣輸出。從鍵盤輸入的一段文字為字符串,可以使用for循環(huán)依次取出其中的每個(gè)字符,然后通過if語句進(jìn)行判斷,如果有“密”字,則使用continue語句跳出本輪循環(huán)(不輸出該字),進(jìn)入下一輪循環(huán)條件的判斷。代碼如下:3.4.4轉(zhuǎn)移和中斷語句【例3-18】編寫程序,從鍵盤輸入密碼,如果密碼長度小于6,則要求重新輸入。如果長度等于6,則判斷密碼是否正確,如果正確則中斷并跳出循環(huán),否則提示錯(cuò)誤并要求繼續(xù)輸入。因?yàn)槌绦驔]有執(zhí)行次數(shù)的規(guī)定,所以循環(huán)條件設(shè)置為恒真,首先判斷輸入長度,如果輸入長度過短,則使用continue語句中斷本輪循環(huán)并進(jìn)入下一輪輸入;如果輸入長度正確,則進(jìn)行密碼判斷,如果正確,則使用break語句中斷并跳出循環(huán),否則提示錯(cuò)誤并進(jìn)入下一輪輸入。代碼如下:3.4.4轉(zhuǎn)移和中斷語句05程序調(diào)試PARTFIVE3.5程序調(diào)試程序中出現(xiàn)錯(cuò)誤是不可避免的,程序調(diào)試就是將程序通過人工方法或使用Python解釋器進(jìn)行測試,并修改語法錯(cuò)誤和邏輯錯(cuò)誤的過程。3.5.1語法錯(cuò)誤與邏輯錯(cuò)誤
語法錯(cuò)誤指程序不符合Python解釋器語法規(guī)則,導(dǎo)致程序無法正常運(yùn)行,如關(guān)鍵字拼寫錯(cuò)誤、縮進(jìn)位置不正確、漏寫規(guī)定符號等。語法錯(cuò)誤通常可以在編寫代碼或運(yùn)行時(shí)被發(fā)現(xiàn),Python解釋器將以醒目的形式報(bào)錯(cuò)。含有語法錯(cuò)誤的語句是不能通過解釋運(yùn)行的。
Python程序錯(cuò)誤包括語法錯(cuò)誤和邏輯錯(cuò)誤。3.5.1語法錯(cuò)誤與邏輯錯(cuò)誤
邏輯錯(cuò)誤指程序符合語法規(guī)定,但是由于算法、運(yùn)行環(huán)境等存在問題不能得到預(yù)期的計(jì)算結(jié)果,如遺漏重要代碼段、算法使用錯(cuò)誤、變量作用域錯(cuò)誤、漏掉循環(huán)語句的結(jié)束條件等。邏輯錯(cuò)誤往往能夠通過語法解釋因而難以被直接發(fā)現(xiàn),需要通過人工方法或調(diào)試工具跟蹤執(zhí)行過程來排查。3.5.2常見語法錯(cuò)誤Python的內(nèi)置異常包含算術(shù)錯(cuò)誤(ArithmeticError)、斷言錯(cuò)誤(AssertionError)、屬性錯(cuò)誤(AttributeError)、緩沖錯(cuò)誤(BufferError)、結(jié)束條件錯(cuò)誤(EOFError)、模塊引入錯(cuò)誤(ImportEror)、查詢錯(cuò)誤(LookupError)、內(nèi)存溢出錯(cuò)誤(MemoryError)、對象名稱錯(cuò)誤(NamcError)、操作系統(tǒng)錯(cuò)誤(OSError)、引用對象錯(cuò)誤(ReferenceEror)、運(yùn)行時(shí)錯(cuò)誤(RuntimeError)、語法規(guī)則錯(cuò)誤(SyntaxError)、系統(tǒng)內(nèi)部錯(cuò)誤(SystemError)、類型錯(cuò)誤(TypeError)、賦值參數(shù)錯(cuò)誤(ValueError)等常規(guī)異常(Exception)類型,其中許多異常類型還包含子類型。初學(xué)者常見的語法錯(cuò)誤包括對象名稱錯(cuò)誤、語法規(guī)則錯(cuò)誤、查詢錯(cuò)誤、類型錯(cuò)誤、模塊引入錯(cuò)誤、算術(shù)錯(cuò)誤、操作系統(tǒng)錯(cuò)誤、屬性錯(cuò)誤等。下面通過實(shí)例來分析這些語法錯(cuò)誤。1對象名稱錯(cuò)誤(1)對象名稱拼寫錯(cuò)誤變量名、函數(shù)名等對象名稱的拼寫錯(cuò)誤是初學(xué)者常見的錯(cuò)誤。并且,Python對大小寫敏感,即大寫字母與小寫字母代表不同的含義,引用對象時(shí)如果未加注意可能會導(dǎo)致變量未定義錯(cuò)誤。print語句中變量名為“Name”而不是上面定義的“name”,程序無法通過語法解釋,錯(cuò)誤提示為NameError:name'Name'isnotdefined。3.5.2常見語法錯(cuò)誤(2)對象名稱未定義或賦值而直接使用初學(xué)者往往可能忘記對變量賦初始值就直接使用,例如:變量b沒有初始值,程序無法通過語法解釋,錯(cuò)誤提示為NameError:name'b'isnot
defined。3.5.2常見語法錯(cuò)誤2語法規(guī)則錯(cuò)誤(1)語法符號的錯(cuò)漏按Python的語法規(guī)則,在if、elif、while、for等子句后面需要加“:”實(shí)現(xiàn)條件對語句塊的引導(dǎo)。如果用戶未遵循此規(guī)則,將會提示如圖3-11所示的無效語法錯(cuò)誤。例如:3.5.2常見語法錯(cuò)誤for子句最后因?yàn)槿鄙佟?”,程序無法通過語法解釋,并將光標(biāo)定位在for子句的后面。在編寫代碼時(shí),由于忙亂,有時(shí)會漏掉字符串的半邊引號或函數(shù)(方法)的半邊括號,這都屬于語法規(guī)則錯(cuò)誤,錯(cuò)誤提示分別為EOLwhilescanningstringliteral和unexpectedEOF
whileparsing。3.5.2常見語法錯(cuò)誤(2)誤將關(guān)鍵字作為對象名稱與其他編程語言一樣,Python不能使用關(guān)鍵字作為變量名,否則也會提示如圖3-11所示的無效語法錯(cuò)誤。由于class
是Python
的關(guān)鍵字,語法解釋時(shí)提示錯(cuò)誤,如圖3-11所示,并將光標(biāo)定位在賦值運(yùn)算符“=”上。Python的關(guān)鍵字參見第2章的例2-1。3.5.2常見語法錯(cuò)誤(3)賦值運(yùn)算符與比較運(yùn)算符的誤用Python中,“==”為比較運(yùn)算符,用于判定左右兩邊是否相等,而“=”為賦值運(yùn)算符
,用于將右邊的值賦給左邊的變量。如果不小心用錯(cuò),則會提示如圖3-11所示的無效語法錯(cuò)誤。由于“==”錯(cuò)用為“=”,程序無法通過語法解釋,并將光標(biāo)定位在“=”上。3.5.2常見語法錯(cuò)誤(4)縮進(jìn)錯(cuò)誤(IndentationError)縮進(jìn)錯(cuò)誤是一種語法規(guī)則錯(cuò)誤。Python通過縮進(jìn)表明層次邏輯關(guān)系,如果未按照邏輯關(guān)系進(jìn)行縮進(jìn),或者縮進(jìn)空格數(shù)不一致,或者Tab縮進(jìn)和空格縮進(jìn)混用等,語法解釋時(shí)都會提示如圖3-12所示的縮進(jìn)語法規(guī)則錯(cuò)誤。由于未按語法規(guī)則進(jìn)行縮進(jìn),程序無法通過語法解釋,并將光標(biāo)定位在“print”上。3.5.2常見語法錯(cuò)誤3查詢錯(cuò)誤(1)查詢錯(cuò)誤由于name字符串索引值從下標(biāo)0開始,name[2]元素不存在,程序無法通過語法解釋,錯(cuò)誤提示為IndexError:stringindexoutofrange。Python中,字符串、元組、列表等類型中的每個(gè)元素都有相應(yīng)的索引值,如果索引值超過范圍,則會導(dǎo)致查詢錯(cuò)誤類別中的索引錯(cuò)誤。3.5.2常見語法錯(cuò)誤(2)映射錯(cuò)誤(KeyError)Python中的字典是由鍵和值組成的映射型組合數(shù)據(jù)類型(詳見第4章),當(dāng)程序映射中使用了字典中不存在的鍵時(shí),會導(dǎo)致查詢錯(cuò)誤類別中的映射錯(cuò)誤。3.5.2常見語法錯(cuò)誤4類型錯(cuò)誤(1)字符串和元組為不可變數(shù)據(jù)類型,不能直接修改字符串中元素的值,否則會產(chǎn)生類型錯(cuò)誤。因?yàn)樵噲D對test[0]賦值,程序無法通過語法解釋,錯(cuò)誤提示為TypeError:'str'objectdoesnotsupportitemassignment。3.5.2常見語法錯(cuò)誤(2)字符串與數(shù)字不能直接連接,需要先使用st()函數(shù)將數(shù)字轉(zhuǎn)化為字符串,否則會產(chǎn)生類型錯(cuò)誤。由于未將age轉(zhuǎn)化為字符串,程序無法通過語法解釋,錯(cuò)誤提示為TypeError:mustbestr,notint。3.5.2常見語法錯(cuò)誤(3)使用range()函數(shù)輸出字符串、元組、列表中指定的元素時(shí),需要先調(diào)用len()函數(shù)計(jì)算字符串中元素的個(gè)數(shù),否則會產(chǎn)生類型錯(cuò)誤。(元組、列表見第4章。)由于range()函數(shù)中未計(jì)算字符串長度,程序無法通過語法解釋,錯(cuò)誤提示為TypeError:'str'objectcannotbeinterpretedasaninteger。3.5.2常見語法錯(cuò)誤5模塊引入錯(cuò)誤在導(dǎo)入模塊時(shí),如果模塊名寫錯(cuò)或者模塊路徑設(shè)置有問題,會導(dǎo)致模塊引入錯(cuò)誤。因?yàn)閏alendar模塊名的第一個(gè)字母誤寫為大寫字母,程序無法通過語法解釋,錯(cuò)誤提示為ModuleNotFoundError:NomodulenamedCalendar’。3.5.2常見語法錯(cuò)誤6算術(shù)錯(cuò)誤這類錯(cuò)誤是指各種算術(shù)錯(cuò)誤引發(fā)的內(nèi)置異常,包括浮點(diǎn)計(jì)算錯(cuò)誤(FloatingPointError)、溢出錯(cuò)誤(OverflowError)和除零錯(cuò)誤(ZeroDivisionError)。以除零錯(cuò)誤為例,如果在計(jì)算時(shí)出現(xiàn)除數(shù)為0的情況,則會導(dǎo)致除零錯(cuò)誤。因?yàn)閚um2的值為0,程序無法通過語法解釋,錯(cuò)誤提示為ZeroDivisionError:divisionby
zero。3.5.2常見語法錯(cuò)誤7操作系統(tǒng)錯(cuò)誤Python中,操作系統(tǒng)錯(cuò)誤主要指文件打開錯(cuò)誤、讀寫錯(cuò)誤、操作權(quán)限不夠、請求超時(shí)等。例如,文件名寫錯(cuò)、文件路徑不對、文件打開模式不對等都屬于操作系統(tǒng)錯(cuò)誤大類,詳見第5章。該程序以只讀方式打開文件test.txt并在顯示器上打印(輸出)其全部內(nèi)容。如果文件不存在,則程序無法通過語法解釋,錯(cuò)誤提示為FileNotFoundEror:[Emmo2]Nosuchfileor
directory;'test.txt'。3.5.2常見語法錯(cuò)誤8屬性錯(cuò)誤屬性引用或賦值失敗會導(dǎo)致屬性錯(cuò)誤。編寫代碼時(shí),若方法名拼寫錯(cuò)誤也將提示為屬性錯(cuò)誤。將大寫字符串轉(zhuǎn)變?yōu)樾懙姆椒╨ower()被誤拼寫為lowerr(),程序無法通過語法解釋時(shí),錯(cuò)誤提示為AttributeError:'str'objecthasnoattribute"lowerr'。3.5.2常見語法錯(cuò)誤3.5.3排查程序錯(cuò)誤的方法語法錯(cuò)誤大多無法通過語法解釋,可通過報(bào)錯(cuò)信息直接找到。而邏輯錯(cuò)誤或程序運(yùn)行中繼發(fā)的語法錯(cuò)誤則往往需要通過跟蹤執(zhí)行過程中某些變量的值才能發(fā)現(xiàn)。排查程序錯(cuò)誤的方法有很多種,最簡單的方法是在程序中插入print()函數(shù),輸出中間值進(jìn)行調(diào)試。其缺點(diǎn)是,當(dāng)代碼量很大時(shí),該方法的工作效率較低。在IDLE中,用print()函數(shù)查錯(cuò)的結(jié)果如圖3-13所示,通過輸出d的值得知,由于其值小于0,因此引發(fā)了根號里為負(fù)數(shù)的值錯(cuò)誤。3.5.3排查程序錯(cuò)誤的方法許多Python語法解釋調(diào)試工具(如PyCharm等)都具備斷點(diǎn)設(shè)置、單步模式、變量查看、表達(dá)式計(jì)算等一系列調(diào)試功能,可作為高效的排查程序錯(cuò)誤方法。例如,用PyCharm排查程序錯(cuò)誤,如圖3-14所示。代
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇教版三年級上冊數(shù)學(xué)口算練習(xí)題
- 中華書局版歷史九年級上冊第3課《古代希臘》聽課評課記錄
- 出租居間合同范本
- 企業(yè)入駐協(xié)議書范本
- 湘教版數(shù)學(xué)七年級上冊3.4《一元一次方程模型的應(yīng)用》聽評課記錄1
- 學(xué)區(qū)房租賃協(xié)議書范本
- 二零二五年度肉類產(chǎn)品電商平臺支付通道合作合同協(xié)議
- 2025年度家居用品經(jīng)銷商返點(diǎn)及銷售渠道協(xié)議
- 2025年度足浴店員工福利保障與薪酬體系合同范本
- 2025年度合伙投資皮膚科醫(yī)院建設(shè)合同
- 政府采購項(xiàng)目采購需求調(diào)查指引文本
- 2024建筑用輻射致冷涂料
- 2024年浙江省公務(wù)員錄用考試《行測》題(A類)
- 2024版《安全生產(chǎn)法》考試題庫附答案(共90題)
- 《化工設(shè)備機(jī)械基礎(chǔ)(第8版)》完整全套教學(xué)課件
- 疥瘡病人的護(hù)理
- 2024年江西省中考英語試題含解析
- 公務(wù)員2012年國考《申論》真題卷及答案(地市級)
- 跨學(xué)科實(shí)踐活動2 制作模型并展示科學(xué)家探索物質(zhì)組成與結(jié)構(gòu)的歷程(分層作業(yè))-九年級化學(xué)上冊同步高效課堂(人教版2024)(解析版)
- 新員工三級安全教育考試試題參考答案
- 35kV輸變電工程(變電站、輸配電線路建設(shè))技術(shù)方案
評論
0/150
提交評論