python程序設(shè)計(jì) 課件 董付國(guó) 第1-6章 初識(shí)python-序列與迭代_第1頁(yè)
python程序設(shè)計(jì) 課件 董付國(guó) 第1-6章 初識(shí)python-序列與迭代_第2頁(yè)
python程序設(shè)計(jì) 課件 董付國(guó) 第1-6章 初識(shí)python-序列與迭代_第3頁(yè)
python程序設(shè)計(jì) 課件 董付國(guó) 第1-6章 初識(shí)python-序列與迭代_第4頁(yè)
python程序設(shè)計(jì) 課件 董付國(guó) 第1-6章 初識(shí)python-序列與迭代_第5頁(yè)
已閱讀5頁(yè),還剩535頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1章初識(shí)PythonPython程序設(shè)計(jì)·第1章初識(shí)Python本章首先介紹計(jì)算機(jī)與程序語(yǔ)言之間的關(guān)系,然后初步探索Python語(yǔ)言,簡(jiǎn)述其歷史、版本、支持平臺(tái)與各種實(shí)施。在本章的編程訓(xùn)練中,我們將下載Python,建立起可以正常運(yùn)行的Python程序設(shè)計(jì)環(huán)境,我們可以在互動(dòng)模式下一行一行地輸入程序代碼并執(zhí)行,或是將Python程序?qū)懺谠创a文件里,整個(gè)交給Python解釋器執(zhí)行。計(jì)算機(jī)簡(jiǎn)史1Python集成開(kāi)發(fā)環(huán)境4計(jì)算機(jī)軟件與程序設(shè)計(jì)語(yǔ)言2Python語(yǔ)言簡(jiǎn)介3Python下載與安裝5目錄1.1計(jì)算機(jī)簡(jiǎn)史現(xiàn)代計(jì)算機(jī)計(jì)算機(jī)科學(xué)計(jì)算機(jī)組成1.1

現(xiàn)代計(jì)算機(jī)我們先來(lái)了解計(jì)算機(jī)、計(jì)算機(jī)科學(xué)和計(jì)算機(jī)硬件系統(tǒng)的相關(guān)知識(shí)。艾倫·麥席森·圖靈(1912年6月23日-1954年6月7日),出生于英國(guó)倫敦帕丁頓,畢業(yè)于美國(guó)普林斯頓大學(xué),是英國(guó)數(shù)學(xué)家、邏輯學(xué)家,被譽(yù)為“計(jì)算機(jī)科學(xué)之父”,“人工智能之父”,他是計(jì)算機(jī)邏輯的奠基者,他提出了“圖靈機(jī)”和“圖靈測(cè)試”等重要概念,為現(xiàn)代計(jì)算機(jī)的邏輯工作方式奠定了基礎(chǔ)。為了紀(jì)念圖靈對(duì)計(jì)算機(jī)科學(xué)的巨大貢獻(xiàn),1966年,由美國(guó)計(jì)算機(jī)協(xié)會(huì)(ACM)設(shè)立一年一度的“圖靈獎(jiǎng)”,以表彰在計(jì)算機(jī)科學(xué)中做出突出貢獻(xiàn)的人。圖靈獎(jiǎng)被喻為“計(jì)算機(jī)界的諾貝爾獎(jiǎng)”。

圖靈1.1

現(xiàn)代計(jì)算機(jī)約翰·馮·諾依曼(1903年12月28日-1957年2月8日),出生于匈牙利,畢業(yè)于瑞士蘇黎世聯(lián)邦理工學(xué)院,數(shù)學(xué)家,現(xiàn)代計(jì)算機(jī)、博弈論、核武器和生化武器等領(lǐng)域內(nèi)的科學(xué)全才,被后人稱為“現(xiàn)代計(jì)算機(jī)之父”和“博弈論之父”,他在泛函分析、遍歷理論、幾何學(xué)、拓?fù)鋵W(xué)和數(shù)值分析等眾多數(shù)學(xué)領(lǐng)域及計(jì)算機(jī)學(xué)、量子力學(xué)和經(jīng)濟(jì)學(xué)中都有重大成就,也為人類第一顆原子彈和第一臺(tái)電子計(jì)算機(jī)的研制做出了巨大貢獻(xiàn)。馮·諾依曼1.1

現(xiàn)代計(jì)算機(jī)電子計(jì)算機(jī)通稱電腦,簡(jiǎn)稱計(jì)算機(jī),是一種通用的信息處理機(jī)器,它能執(zhí)行可以充分詳細(xì)描述的任何過(guò)程。用于描述解決特定問(wèn)題的步驟序列稱為算法,算法可以變成軟件(程序),確定硬件(物理機(jī))能做什么和做了什么。創(chuàng)建軟件的過(guò)程稱為編程。1.1.1現(xiàn)代計(jì)算機(jī)幾乎每個(gè)人都用過(guò)計(jì)算機(jī)。也許你玩過(guò)計(jì)算機(jī)游戲,或曾用計(jì)算機(jī)寫文章、在線購(gòu)物、聽(tīng)音樂(lè)或通過(guò)社交媒體與朋友聯(lián)系。計(jì)算機(jī)被用于預(yù)測(cè)天氣、設(shè)計(jì)飛機(jī)、制作電影、經(jīng)營(yíng)企業(yè)、完成金融交易和控制工廠等。世界上第一臺(tái)通用電子數(shù)字計(jì)算機(jī)ENIAC誕生于1946年2月14日的美國(guó)賓夕法尼亞大學(xué)。中國(guó)的第一臺(tái)電子計(jì)算機(jī)誕生于1958年。在2019年6月17日公布的全球超算500強(qiáng)榜單中,中國(guó)以擁有219臺(tái)超級(jí)計(jì)算機(jī),繼續(xù)蟬聯(lián)全球擁有超算數(shù)量最多的國(guó)家。

世界上第一臺(tái)通用計(jì)算機(jī)ENIAC1.1.1現(xiàn)代計(jì)算機(jī)但是,計(jì)算機(jī)到底是什么機(jī)器?一個(gè)計(jì)算設(shè)備怎么能執(zhí)行這么多不同的任務(wù)呢?現(xiàn)代計(jì)算機(jī)可以被定義為“在可改變的程序的控制下,存儲(chǔ)和操縱信息的機(jī)器”。該定義有兩個(gè)關(guān)鍵要素:第一,計(jì)算機(jī)是用于操縱信息的設(shè)備。這意味著我們可以將信息放入計(jì)算機(jī),計(jì)算機(jī)將信息轉(zhuǎn)換為新的、有用的形式,然后輸出(顯示)信息。第二,計(jì)算機(jī)在可改變的程序的控制下運(yùn)行。1.1.1現(xiàn)代計(jì)算機(jī)計(jì)算機(jī)不是唯一能操縱信息的機(jī)器。當(dāng)你用簡(jiǎn)單的計(jì)算器來(lái)運(yùn)算一組數(shù)字時(shí),就是在輸入信息(數(shù)字),處理信息(如計(jì)算連續(xù)的總和),然后顯示。另一個(gè)典型的例子是油泵。給油箱加油時(shí),油泵利用某些輸入:當(dāng)前每升汽油的價(jià)格和來(lái)自傳感器的信號(hào),汽油流入汽車油箱的速率等。油泵將這個(gè)輸入轉(zhuǎn)換為加了多少汽油和應(yīng)付多少錢的信息。但計(jì)算器或油泵并不是完整的計(jì)算機(jī),這些設(shè)備包含的是嵌入式計(jì)算機(jī)(芯片),被構(gòu)建來(lái)執(zhí)行單一的任務(wù)?!坝?jì)算機(jī)程序”是一組詳細(xì)指令的有序集合。程序明確地告訴計(jì)算機(jī)做什么,如果我們改變程序,計(jì)算機(jī)就會(huì)執(zhí)行不同的動(dòng)作序列,從而完成不同的任務(wù)。正是這種靈活性,讓計(jì)算機(jī)在一個(gè)時(shí)刻是文字處理器,在另一個(gè)時(shí)刻是金融顧問(wèn),后來(lái)又變成一個(gè)街機(jī)游戲。機(jī)器(硬件)沒(méi)變,但控制機(jī)器的程序(軟件)改變了。1.1.1現(xiàn)代計(jì)算機(jī)每臺(tái)計(jì)算機(jī)只是“執(zhí)行”(運(yùn)行)程序的機(jī)器。例如AppleMacintosh、DellPC、聯(lián)想Thinkpad筆記本、AppleiPad和華為智能手機(jī)等,它們實(shí)際上是不同類型的計(jì)算機(jī)。所有這些不同的計(jì)算機(jī)具有相同的力量,通過(guò)適當(dāng)?shù)木幊?,每臺(tái)計(jì)算機(jī)基本上可以做任何其他計(jì)算機(jī)可以做的事情。從這個(gè)意義上說(shuō),放在你書桌上的PC機(jī)實(shí)際上是一臺(tái)通用機(jī)器,它可以做任何你想要它做的事,只要你能足夠詳細(xì)地描述要完成的任務(wù)。1.1.2計(jì)算機(jī)軟件與程序設(shè)計(jì)語(yǔ)言事實(shí)上,計(jì)算機(jī)科學(xué)并不只是研究計(jì)算機(jī)的。計(jì)算機(jī)科學(xué)本質(zhì)上是研究什么可以計(jì)算,它是更廣泛的計(jì)算科學(xué)領(lǐng)域的基礎(chǔ),其中包括網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)和信息管理系統(tǒng)等。著名計(jì)算機(jī)科學(xué)家埃格斯·迪克斯特拉曾經(jīng)說(shuō)過(guò),“計(jì)算機(jī)之于計(jì)算機(jī)科學(xué),正如望遠(yuǎn)鏡之于天文學(xué)?!庇?jì)算機(jī)是計(jì)算機(jī)科學(xué)中的重要工具,由于它可以執(zhí)行我們描述的任何過(guò)程,所以真正的問(wèn)題是:“我們可以描述什么過(guò)程?”即:計(jì)算機(jī)科學(xué)的根本問(wèn)題就是“可以計(jì)算什么”。計(jì)算機(jī)科學(xué)家應(yīng)用許多研究技術(shù)來(lái)回答這個(gè)問(wèn)題,其中三種主要技術(shù)是設(shè)計(jì)、分析和實(shí)驗(yàn)。1.1.2計(jì)算機(jī)軟件與程序設(shè)計(jì)語(yǔ)言證明某個(gè)問(wèn)題可以解決的一種方式就是實(shí)際設(shè)計(jì)解決方案。也就是說(shuō),我們開(kāi)發(fā)了一個(gè)逐步的過(guò)程,以實(shí)現(xiàn)期望的結(jié)果。計(jì)算機(jī)科學(xué)家稱之為“算法”,算法設(shè)計(jì)是計(jì)算機(jī)科學(xué)中最重要的方面之一。設(shè)計(jì)有一個(gè)弱點(diǎn),它只能回答“什么是可計(jì)算的”。如果可以設(shè)計(jì)一個(gè)算法,那么問(wèn)題是可解的。然而,未能找到算法并不意味著問(wèn)題是不可解的,這可能是碰巧還沒(méi)有找到正確的想法,這就是我們引入分析的原因。1.1.2計(jì)算機(jī)軟件與程序設(shè)計(jì)語(yǔ)言分析是以數(shù)學(xué)方式檢查算法和問(wèn)題的過(guò)程。算法分析是計(jì)算機(jī)科學(xué)的重要組成部分。當(dāng)一些問(wèn)題太復(fù)雜或者定義不明確而無(wú)法開(kāi)展分析時(shí),在這種情況下,計(jì)算機(jī)科學(xué)家就依靠實(shí)驗(yàn)。他們實(shí)際實(shí)現(xiàn)一些系統(tǒng),然后研究行為的結(jié)果。即使在進(jìn)行理論分析時(shí),也經(jīng)常需要實(shí)驗(yàn)來(lái)驗(yàn)證和完善分析。對(duì)于大多數(shù)問(wèn)題,底線是能否構(gòu)建一個(gè)可靠的工作系統(tǒng)。通常我們需要對(duì)系統(tǒng)進(jìn)行測(cè)試,以確定這個(gè)底線已經(jīng)滿足。當(dāng)你開(kāi)始編寫自己的程序時(shí),會(huì)有很多機(jī)會(huì)觀察你的解決方案的表現(xiàn)。如今,計(jì)算機(jī)科學(xué)家參與的活動(dòng)都在計(jì)算這把大傘之下,例如移動(dòng)計(jì)算、網(wǎng)絡(luò)、人機(jī)交互、人工智能、計(jì)算科學(xué)(使用強(qiáng)大的計(jì)算機(jī)來(lái)模擬科學(xué)過(guò)程)、數(shù)據(jù)庫(kù)和數(shù)據(jù)挖掘、軟件工程、網(wǎng)絡(luò)和多媒體設(shè)計(jì)、數(shù)字音樂(lè)制作、管理信息系統(tǒng)和計(jì)算機(jī)安全等。無(wú)論在何處進(jìn)行計(jì)算,計(jì)算機(jī)科學(xué)的技能和知識(shí)都有應(yīng)用。1.1.3計(jì)算機(jī)組成一名成功的程序員也許并不需要知道計(jì)算機(jī)工作的所有細(xì)節(jié),但是,了解計(jì)算機(jī)的基本原理將有助于掌握讓程序運(yùn)行所需的步驟。因此,讓我們來(lái)看看計(jì)算機(jī)的內(nèi)部構(gòu)造。不同計(jì)算機(jī)在具體細(xì)節(jié)上會(huì)顯著不同,但抽象起來(lái)看,所有現(xiàn)代數(shù)字計(jì)算機(jī)都是非常相似的。右圖展示了計(jì)算機(jī)的功能視圖,計(jì)算機(jī)系統(tǒng)包括中央處理單元(CPU)、主存儲(chǔ)器(RAM)、輔助存儲(chǔ)器以及輸入和輸出設(shè)備。CPU是機(jī)器的“大腦”,這是計(jì)算機(jī)執(zhí)行所有基本操作的地方。CPU可以執(zhí)行簡(jiǎn)單的算術(shù)運(yùn)算,如兩個(gè)數(shù)相加,也可以執(zhí)行邏輯操作,如測(cè)試兩個(gè)數(shù)是否相等。

計(jì)算機(jī)的功能視圖1.1.3計(jì)算機(jī)組成CPU只能直接訪問(wèn)(操作)存儲(chǔ)在“主存儲(chǔ)器”(RAM,隨機(jī)存取存儲(chǔ)器)中的信息(數(shù)據(jù)和程序)。主存儲(chǔ)器速度快,但它也是易失性存儲(chǔ)。也就是說(shuō),當(dāng)電源關(guān)閉時(shí),主存儲(chǔ)器中的信息會(huì)丟失。因此,還必須有一些輔助存儲(chǔ)器來(lái)提供永久存儲(chǔ)。在個(gè)人計(jì)算機(jī)中,主要的輔助存儲(chǔ)器通常是硬盤驅(qū)動(dòng)器(HDD)或固態(tài)驅(qū)動(dòng)器(SSD)。HDD將信息以磁模式存儲(chǔ)在磁盤上,而SSD使用稱為閃存的電子電路。大多數(shù)計(jì)算機(jī)還支持可移動(dòng)介質(zhì)作為輔助存儲(chǔ)器,如U盤和DVD數(shù)字多功能光盤,后者以光學(xué)模式存儲(chǔ)信息,由激光讀取和寫入。人們通過(guò)輸入和輸出設(shè)備與計(jì)算機(jī)交互,常見(jiàn)的設(shè)備如鍵盤、鼠標(biāo)和顯示器。來(lái)自輸入設(shè)備的信息由CPU處理,并可以被移動(dòng)到主存儲(chǔ)器或輔助存儲(chǔ)器。類似地,需要顯示信息時(shí),CPU將它發(fā)送到一個(gè)或多個(gè)輸出設(shè)備。1.1.3計(jì)算機(jī)組成當(dāng)在計(jì)算機(jī)上啟動(dòng)游戲或文字處理程序時(shí),構(gòu)成程序的指令從(更)持久的輔助存儲(chǔ)器復(fù)制到計(jì)算機(jī)的主存儲(chǔ)器中。一旦指令被加載,CPU就開(kāi)始執(zhí)行程序。技術(shù)上,CPU遵循的過(guò)程稱為“讀取-執(zhí)行循環(huán)”。從存儲(chǔ)器取得第一條指令,解碼以弄清楚它代表什么,并且執(zhí)行適當(dāng)?shù)膭?dòng)作。然后,取得并解碼和執(zhí)行下一條指令。循環(huán)繼續(xù),一條指令接著一條指令。這確實(shí)是所有的計(jì)算機(jī)從你打開(kāi)它直到關(guān)閉時(shí)做的事情:讀取指令、解碼、執(zhí)行。但計(jì)算機(jī)能以很快的速度執(zhí)行這個(gè)簡(jiǎn)單的指令流,每秒完成數(shù)十億條指令。將足夠多的簡(jiǎn)單指令以正確的方式放在一起(編程),計(jì)算機(jī)便完成了驚人的工作。1.2計(jì)算機(jī)軟件與程序設(shè)計(jì)語(yǔ)言計(jì)算機(jī)軟件程序設(shè)計(jì)語(yǔ)言計(jì)算機(jī)翻譯器1.2

計(jì)算機(jī)軟件與程序設(shè)計(jì)語(yǔ)言電腦硬件其實(shí)非常復(fù)雜,主要原因之一是輸入/輸出設(shè)備既繁多且各不相同,例如鍵盤、鼠標(biāo)、顯卡與屏幕、聲卡與喇叭、打印機(jī)、硬盤、U盤、攝像頭、藍(lán)牙、無(wú)線網(wǎng)卡與路由器等等,如果要由人們或直接由應(yīng)用軟件來(lái)面對(duì)這種種裝置,那幾乎是不可能的任務(wù),所幸,我們可以在軟件與硬件之間加入一層被稱為操作系統(tǒng)(operatingsystem,OS)的軟件,由它來(lái)管理下面的硬件并負(fù)責(zé)執(zhí)行上面的軟件,介于兩者之間,讓上層程序可存取下層的輸出入裝置。

硬件、操作系統(tǒng)與軟件1.2.1計(jì)算機(jī)軟件“計(jì)算”的一個(gè)要點(diǎn)是:“軟件”(程序)主宰“硬件”(物理機(jī)器)。軟件決定計(jì)算機(jī)可以做什么,沒(méi)有軟件,計(jì)算機(jī)也許只是昂貴的鎮(zhèn)紙。程序是一系列指令的有序集合,它告訴計(jì)算機(jī)做什么。顯然,就目前而言,我們?nèi)匀恍枰糜?jì)算機(jī)可以理解的語(yǔ)言來(lái)提供這些指令。1.2.1計(jì)算機(jī)軟件操作系統(tǒng)也是程序,只不過(guò)非常龐大復(fù)雜,在整個(gè)電腦系統(tǒng)中扮演著管理員的角色。操作系統(tǒng)可以分為許多組成部分。簡(jiǎn)單而言,其中會(huì)由驅(qū)動(dòng)程序負(fù)責(zé)與底層硬件溝通,不同的硬件裝置需要不同的驅(qū)動(dòng)程序,借以彌補(bǔ)其差異,提供一致的接口供上層調(diào)用;然后提供程序運(yùn)行環(huán)境,以執(zhí)行各式各樣的應(yīng)用軟件,而這些軟件可由各種“程序語(yǔ)言”編寫而成。我們平常自由自在地享受各式軟件,諸如網(wǎng)頁(yè)瀏覽器(InternetExplorer、百度、搜狗等)、即時(shí)通訊軟件(QQ、微信)、電子表格(Excel)、媒體播放程序、壓縮軟件(Zip、WinZip)、看圖軟件等等,這些軟件都必須由某一種(或數(shù)種)程序語(yǔ)言開(kāi)發(fā)編寫而成。1.2.2程序設(shè)計(jì)語(yǔ)言人類的自然語(yǔ)言不太適合描述復(fù)雜的算法,因?yàn)槠渲谐錆M著模糊和不精確。計(jì)算機(jī)科學(xué)家設(shè)計(jì)了一些符號(hào),以準(zhǔn)確無(wú)二義的方式來(lái)表示計(jì)算,從而繞過(guò)了這些問(wèn)題,這些形式表示法的特殊符號(hào)稱為編程語(yǔ)言,其中的每個(gè)結(jié)構(gòu)都有精確的形式(即語(yǔ)法)和精確的含義(即語(yǔ)義)。編程語(yǔ)言就像一種規(guī)則,用于編寫計(jì)算機(jī)將遵循的指令。程序員通常將他們的程序稱為“計(jì)算機(jī)代碼”,用編程語(yǔ)言來(lái)編寫算法(軟件)的過(guò)程就被稱為“編碼”或“編程”,程序設(shè)計(jì)人員有時(shí)也自稱為“碼農(nóng)”。編程是計(jì)算機(jī)科學(xué)的一個(gè)基本組成部分,因此,對(duì)所有立志成為計(jì)算機(jī)專業(yè)人員的人都很重要。計(jì)算機(jī)已經(jīng)成為我們社會(huì)中的常見(jiàn)工具,要理解這個(gè)工具的優(yōu)點(diǎn)和局限性,就需要理解編程。程序員是計(jì)算機(jī)的真正控制者,編程能讓你成為一個(gè)更聰明的計(jì)算機(jī)用戶。1.2.2程序設(shè)計(jì)語(yǔ)言編程也有很多樂(lè)趣。這是一項(xiàng)智力活動(dòng),讓人們通過(guò)有用的、有時(shí)非常漂亮的創(chuàng)作來(lái)表達(dá)自己,因此,許多人確實(shí)愛(ài)好編寫計(jì)算機(jī)程序。編程也會(huì)培養(yǎng)有價(jià)值的問(wèn)題解決技能,特別是將復(fù)雜系統(tǒng)分解為一些可理解的子系統(tǒng)及其交互,從而分析復(fù)雜系統(tǒng)的能力。在信息社會(huì),程序員有著很大的市場(chǎng)需求,理解計(jì)算機(jī)和具備編程的能力可能會(huì)讓你在社會(huì)競(jìng)爭(zhēng)中占據(jù)優(yōu)勢(shì)。本質(zhì)上,計(jì)算機(jī)硬件只能理解一種稱為機(jī)器語(yǔ)言的低級(jí)語(yǔ)言,而程序通常使用面向人類的高級(jí)語(yǔ)言(如Python、Java)編寫。因此,高級(jí)語(yǔ)言必須被編譯或解釋,以便計(jì)算機(jī)能夠理解它。高級(jí)語(yǔ)言比機(jī)器語(yǔ)言更容易移植。時(shí)至今日,已經(jīng)出現(xiàn)過(guò)無(wú)數(shù)的程序語(yǔ)言,那些曾經(jīng)熱門的程序語(yǔ)言至少就有幾十個(gè),諸如FORTRAN、COBOL、C、C++、C#、Java、PHP、JavaScript、VisualBasic、Perl、Lisp、Prolog、Ada等等。1.2.3計(jì)算機(jī)翻譯器假設(shè)我們希望讓計(jì)算機(jī)對(duì)兩個(gè)數(shù)求和,CPU實(shí)際執(zhí)行的指令可能是這樣的:將內(nèi)存位置2001的數(shù)加載到CPU中將內(nèi)存位置2002的數(shù)加載到CPU中在CPU中對(duì)這兩個(gè)數(shù)求和將結(jié)果存儲(chǔ)到內(nèi)存位置2003兩個(gè)數(shù)求和似乎有很多工作,實(shí)際上甚至比這更復(fù)雜,因?yàn)橹噶詈蛿?shù)字是以二進(jìn)制符號(hào)表示的(即0和1的序列)。在高級(jí)語(yǔ)言中,兩個(gè)數(shù)求和可以更自然地表達(dá)為c=a+b。這讓人們?nèi)菀桌斫猓覀冞€需要用“編譯”或“解釋”方法,以便將高級(jí)語(yǔ)言翻譯成計(jì)算機(jī)可以執(zhí)行的機(jī)器語(yǔ)言。1.2.3計(jì)算機(jī)翻譯器“編譯器”是一個(gè)復(fù)雜的計(jì)算機(jī)程序,它接受一個(gè)以高級(jí)語(yǔ)言編寫的程序,并將其翻譯成以某個(gè)計(jì)算機(jī)的機(jī)器語(yǔ)言表達(dá)的等效程序。下圖展示了編譯過(guò)程。高級(jí)語(yǔ)言程序被稱為“源代碼”,得到的“機(jī)器代碼”是計(jì)算機(jī)可以直接執(zhí)行的程序。圖中的虛線表示機(jī)器代碼的執(zhí)行(也稱為“運(yùn)行程序”)。

編譯高級(jí)語(yǔ)言1.2.3計(jì)算機(jī)翻譯器“解釋器”模擬能理解高級(jí)語(yǔ)言的計(jì)算機(jī),它根據(jù)需要一條一條地分析和執(zhí)行源代碼指令。下圖展示了這個(gè)過(guò)程。

解釋高級(jí)語(yǔ)言1.2.3計(jì)算機(jī)翻譯器解釋和編譯之間的區(qū)別在于,編譯是一次性翻譯。一旦程序被編譯,它可以重復(fù)運(yùn)行而不再需要編譯器或源代碼。在解釋的情況下,每次程序運(yùn)行時(shí)都需要解釋器和源代碼。編譯的程序往往更快,因?yàn)槠浞g是一次完成的,但是解釋語(yǔ)言擁有更靈活的編程環(huán)境,程序可以交互式地開(kāi)發(fā)和運(yùn)行。翻譯過(guò)程突出了高級(jí)語(yǔ)言對(duì)機(jī)器語(yǔ)言的可移植性。計(jì)算機(jī)的機(jī)器語(yǔ)言由特定CPU的設(shè)計(jì)者創(chuàng)建,每種類型的計(jì)算機(jī)都有自己的機(jī)器語(yǔ)言。不同的是,以高級(jí)語(yǔ)言編寫的程序可以在許多不同種類的計(jì)算機(jī)上運(yùn)行,只要存在合適的編譯器或解釋器(這只是另一個(gè)程序)。因此,我們可以在自己的筆記本計(jì)算機(jī)和平板計(jì)算機(jī)上運(yùn)行完全相同的Python程序。盡管它們有不同的CPU,但都運(yùn)行著Python解釋器。1.3

Python語(yǔ)言Python簡(jiǎn)史Python語(yǔ)言特點(diǎn)Python語(yǔ)言的版本1.3Python語(yǔ)言簡(jiǎn)介Python是一種解釋型程序語(yǔ)言,了解Python的一個(gè)好方法是使用交互式shell(俗稱“殼”,用來(lái)區(qū)別于“核”)進(jìn)行實(shí)訓(xùn)操作。shell是指“為使用者提供操作界面”的軟件。Python標(biāo)準(zhǔn)版包括一個(gè)IDLE程序,它提供了一個(gè)shell以及編輯Python程序的工具。1.3.1Python簡(jiǎn)史Python語(yǔ)言是由荷蘭人吉多·范羅蘇姆在1980年代末設(shè)計(jì)的,于1994年1月正式發(fā)布1.0版,經(jīng)過(guò)近三十年的發(fā)展演進(jìn),現(xiàn)在已經(jīng)成為主流的程序設(shè)計(jì)語(yǔ)言之一。

Python語(yǔ)言LogoPython之父吉多·范羅蘇姆1.3.1Python簡(jiǎn)史Python這個(gè)名字取自于著名的英國(guó)超現(xiàn)實(shí)喜劇“蒙提派森的飛行馬戲團(tuán)”,另外,Python又有巨蟒蛇之意,所以其代表圖示為兩只蟒蛇纏繞在一起,形成類似于太極陰陽(yáng)圖的樣子。Python支持多種程序設(shè)計(jì)范式,包括程序式、結(jié)構(gòu)式、面向?qū)ο?、函?shù)式、腳本式,其語(yǔ)法高級(jí)且簡(jiǎn)潔,易于學(xué)習(xí),具備了垃圾收集、動(dòng)態(tài)類型檢查、異常處理機(jī)制等特色。Python的程序庫(kù)模塊多得不計(jì)其數(shù),游戲、多媒體、數(shù)學(xué)運(yùn)算、視頻處理、系統(tǒng)程序、網(wǎng)站網(wǎng)頁(yè)、機(jī)器人等等領(lǐng)域,都可見(jiàn)其運(yùn)用之處,廣受各界采用。1.3.2Python語(yǔ)言特點(diǎn)Python的程序代碼清楚易懂,開(kāi)發(fā)軟件時(shí)易于編寫功能,之后也易于維護(hù)修改,提供一致的程序設(shè)計(jì)模型,核心概念并不多。與C、C++、Java等程序語(yǔ)言相比,Python的開(kāi)發(fā)速度快,相同功能需要的程序代碼行數(shù)較少。所以,使用Python可以提高程序開(kāi)發(fā)人員與軟件工程師的生產(chǎn)力,在較短時(shí)間內(nèi)完成較多功能。Python常被昵稱為膠水語(yǔ)言,它能夠把用其他語(yǔ)言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起。常見(jiàn)的一種應(yīng)用情形是,使用Python快速生成程序的原型(有時(shí)甚至是程序的最終界面),然后對(duì)其中有特別要求的部分,用更合適的語(yǔ)言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而后封裝為Python可以調(diào)用的擴(kuò)展類庫(kù)。在使用擴(kuò)展類庫(kù)時(shí)可能需要考慮平臺(tái)問(wèn)題,某些可能不提供跨平臺(tái)的實(shí)現(xiàn)。Python語(yǔ)法簡(jiǎn)潔清晰,它強(qiáng)制使用空白符(whitespace)作為語(yǔ)句縮進(jìn)。1.3.3Python語(yǔ)言的版本Python是純粹的自由軟件,源代碼和解釋器CPython遵循GNU通用公共許可證許可,為此成立了非營(yíng)利組織Python軟件基金會(huì),開(kāi)發(fā)人員也逐漸演變成Python開(kāi)發(fā)團(tuán)隊(duì),并擁有廣大的社團(tuán)。Python語(yǔ)言的各項(xiàng)開(kāi)發(fā)工作都記錄在Python功能增進(jìn)建議書之中,規(guī)范并定義各種擴(kuò)充與延伸功能的技術(shù)規(guī)格,讓整個(gè)Python社區(qū)擁有共同遵循的原則和依據(jù)。目前在用的Python版本分為2.x與3.x(又稱為Python3000或py3k),兩個(gè)版本并不完全兼容,學(xué)習(xí)與查詢相關(guān)數(shù)據(jù)時(shí),應(yīng)看清楚適用版本。1.3.3Python語(yǔ)言的版本雖然3.x版已推出一段時(shí)日,但仍有很多人以2.x版開(kāi)發(fā)程序,使用者眾多,很多程序代碼只相容于2.x版,某些程序庫(kù)模塊也尚未更新提供3.x的版本。Python的2.7版本發(fā)布至今已相當(dāng)普及,也是2.x的最后一版,該版本進(jìn)入了糾錯(cuò)和維護(hù)的穩(wěn)定狀態(tài)。關(guān)于Python各版本之間功能與特色的差異詳情,可以到Python官方網(wǎng)站的文件區(qū)(/)查詢。本書編寫時(shí)應(yīng)用的是Python版本3.8。1.4

Python集成開(kāi)發(fā)環(huán)境1.4Python集成開(kāi)發(fā)環(huán)境執(zhí)行Python程序的規(guī)格已經(jīng)由Python語(yǔ)言定義好了,而現(xiàn)在需要的是實(shí)施,就是要為實(shí)際動(dòng)手編寫程序搭建好Python程序的運(yùn)行環(huán)境,它依托于不同的操作系統(tǒng)。理論上,只要Python程序運(yùn)行環(huán)境的每一個(gè)具體實(shí)現(xiàn)都遵守Python語(yǔ)言的規(guī)格,而且程序員也按照標(biāo)準(zhǔn)編寫Python程序,那么所編寫的程序代碼不管在哪一個(gè)程序運(yùn)行環(huán)境里都應(yīng)該能正確無(wú)誤地得到執(zhí)行。換句話說(shuō),在Windows上編寫的Python程序,也可以放到Linux上執(zhí)行,只要兩處都安裝了相兼容的Python運(yùn)行環(huán)境即可,因此Python具備良好的可移植性。1.4Python集成開(kāi)發(fā)環(huán)境常見(jiàn)的Python實(shí)施有CPython、StacklessPython、UnladenSwallow、IronPython、Jython、PyPy等等,且各有其獨(dú)特之處,例如CPython是Python官方團(tuán)隊(duì)以C語(yǔ)言編寫開(kāi)發(fā)的運(yùn)行環(huán)境,具有標(biāo)準(zhǔn)地位,其源代碼完全開(kāi)放,可移植性最高。另外有些實(shí)施,如ActivePython、PythonXY、AnacondaPython等,是把CPython重新包裝,再加入額外的程序庫(kù),專供特定領(lǐng)域使用,例如科學(xué)計(jì)算、數(shù)據(jù)分析與管理、數(shù)據(jù)庫(kù)運(yùn)用等。本書的程序與范例都以CPython實(shí)施為準(zhǔn);平常提到Python時(shí)指的便是這個(gè)運(yùn)行環(huán)境。1.5

Python下載與安裝安裝Python開(kāi)發(fā)環(huán)境執(zhí)行Python程序1.5

安裝Python學(xué)習(xí)Python課程時(shí),除了利用學(xué)校的計(jì)算機(jī)實(shí)驗(yàn)室完成相關(guān)實(shí)訓(xùn)任務(wù)外,還應(yīng)該在自己的個(gè)人計(jì)算機(jī)中安裝Python軟件,以方便隨時(shí)進(jìn)行編程練習(xí)。我們以Windows環(huán)境和CPython版本為例,來(lái)學(xué)習(xí)搭建Python3.x開(kāi)發(fā)環(huán)境。1.5.1安裝Python開(kāi)發(fā)環(huán)境請(qǐng)按照下列步驟完成安裝并進(jìn)行簡(jiǎn)單操作。步驟1:在自己的個(gè)人計(jì)算機(jī)中為Python語(yǔ)言建立一個(gè)文件夾(例如:\Python)。步驟2:下載Python軟件?;ヂ?lián)網(wǎng)上有很多地方提供了下載服務(wù)。這里,我們選擇在Python的官網(wǎng)上下載python。打開(kāi)Python官網(wǎng)(。

Python官網(wǎng)1.5.1安裝Python開(kāi)發(fā)環(huán)境鼠標(biāo)指向“Downloads”-“Windows”菜單命令,屏幕顯示如圖所示,單擊“Python3.8.1”按鈕,按屏幕提示,將Python軟件下載到指定的文件夾。

選擇“Windows”1.5.1安裝Python開(kāi)發(fā)環(huán)境步驟3:下載完成后雙擊執(zhí)行下載的exe程序,進(jìn)入安裝界面。(安裝完成后,若再次單擊該程序,可執(zhí)行卸載Python的操作。)

Python安裝界面1.5.1安裝Python開(kāi)發(fā)環(huán)境在選擇安裝時(shí),可以把下方的“AddPython3.8toPATH”勾選上,直接默認(rèn)把用戶變量添加上,后續(xù)不用再添加。安裝界面中可以選擇默認(rèn)安裝或者自定義安裝。由于默認(rèn)安裝路徑層次比較深,可以選擇自定義安裝,例如將Python程序系統(tǒng)安裝在前面定義的“\Python”目錄中,以方便后續(xù)查找。其他選項(xiàng)選擇默認(rèn)(見(jiàn)圖1-12),單擊“Next”按鈕,進(jìn)一步的高級(jí)選項(xiàng)選擇默認(rèn)(見(jiàn)圖1-13),單機(jī)“Install”按鈕,完成安裝(見(jiàn)圖1-14)。1.5.1安裝Python開(kāi)發(fā)環(huán)境圖1-12設(shè)置選項(xiàng)1.5.1安裝Python開(kāi)發(fā)環(huán)境圖1-13設(shè)置高級(jí)選項(xiàng)1.5.1安裝Python開(kāi)發(fā)環(huán)境圖1-14完成安裝1.5.1安裝Python開(kāi)發(fā)環(huán)境步驟4:安裝成功。在安裝目錄可以看到Python安裝文件的相關(guān)信息,在“開(kāi)始”菜單可以單擊“Python3.8”>“Python3.8(32-bit)”命令,打開(kāi)Python軟件。至此,可以使用Python了。

Python操作界面1.5.1安裝Python開(kāi)發(fā)環(huán)境下載安裝后,若沒(méi)有改動(dòng)缺省設(shè)置的安裝路徑,那么Python3.x版會(huì)放在C:\Python中。Windows“開(kāi)始”菜單的“Python3.8”子菜單中也會(huì)出現(xiàn)“IDLE(Python3.832-bit)”命令,這是一款簡(jiǎn)易的圖形化開(kāi)發(fā)編輯器。請(qǐng)分析并記錄:(1)你實(shí)際選擇安裝的Python軟件版本是:答:__________________________________________________________________________(2)你是否完成Python軟件的安裝?若未完成,則簡(jiǎn)單分析原因是什么?答:________________________________________________________________________________________________________________________________________________________1.5.1安裝Python開(kāi)發(fā)環(huán)境安裝后的Python程序運(yùn)行環(huán)境,里面最主要的部分是“解釋器”,解釋器負(fù)責(zé)執(zhí)行程序,把Python程序交給它后,它就開(kāi)始解析程序代碼、檢查語(yǔ)法有無(wú)錯(cuò)誤、根據(jù)程序語(yǔ)義去完成任務(wù)(例如計(jì)算某個(gè)數(shù)學(xué)公式)、把數(shù)據(jù)存回文件、通過(guò)網(wǎng)絡(luò)請(qǐng)求到某網(wǎng)站,等等,而這些具體功能都會(huì)由某個(gè)程序庫(kù)負(fù)責(zé);解釋器與眾多程序庫(kù)再加上Python運(yùn)行環(huán)境的其他部分,將會(huì)往下層存取操作系統(tǒng)提供的服務(wù),完成程序代碼定義的功能。當(dāng)然這是極度簡(jiǎn)化后的示意圖,Python程序運(yùn)行環(huán)境可再細(xì)分出許多部分,解釋器的功能也可再細(xì)分。解釋器是Python程序運(yùn)行環(huán)境的門戶,編寫Python程序時(shí),直接面對(duì)的就是解釋器。運(yùn)行環(huán)境架構(gòu)1.5.1安裝Python開(kāi)發(fā)環(huán)境Python具有非常豐富龐大的程序庫(kù),例如處理各種數(shù)據(jù)形式的程序庫(kù)、網(wǎng)絡(luò)連線的程序庫(kù)、存取文件系統(tǒng)的程序庫(kù)等。1.5.2執(zhí)行Python程序下面我們來(lái)學(xué)習(xí)編寫控制機(jī)器內(nèi)部計(jì)算過(guò)程的程序。我們通過(guò)向Python解釋器發(fā)出指令來(lái)指揮計(jì)算機(jī)內(nèi)部的計(jì)算過(guò)程。可以用交互模式啟動(dòng)Python解釋器(shell)。shell允許用戶在其中鍵入Python命令,然后顯示執(zhí)行結(jié)果。啟動(dòng)shell的具體細(xì)節(jié)因不同的Python安裝而異。一般情況下,我們會(huì)使用IDLE應(yīng)用程序,它提供了Pythonshell,可以幫助我們創(chuàng)建和編輯Python程序。在Windows“開(kāi)始”菜單中單擊“IDLE(Python3.832-bit)”命令,屏幕顯示IDLE窗口。

PythonIDLE窗口1.5.2執(zhí)行Python程序當(dāng)?shù)谝淮螁?dòng)IDLE時(shí),所看到的具體的啟動(dòng)消息取決于當(dāng)前正在運(yùn)行的Python版本和正在使用的系統(tǒng)。重要的部分是圖中的最后一行,>>>

是一個(gè)Python提示符,表示Python解釋器正在進(jìn)行展示交互式會(huì)話,等待給它的命令。在編程語(yǔ)言中,一個(gè)完整的命令稱為語(yǔ)句(注意,不要使用中文的句號(hào)、引號(hào)等符號(hào))。下面是與Pythonshell交互的例子:>>>print("Hello,World!")Hello,World!>>>print(2+3)5>>>print("2+3=",2+3)2+3=51.5.2執(zhí)行Python程序1.5.2執(zhí)行Python程序這里,我們嘗試了三個(gè)使用Python的print語(yǔ)句的例子。第一個(gè)print語(yǔ)句要求Python顯示文本短語(yǔ)“Hello,World!”,Python在下一行做出響應(yīng),打印出該短語(yǔ)。第二個(gè)print語(yǔ)句要求Python打印2與3之和。第三個(gè)print結(jié)合了這兩個(gè)想法。Python打印出引號(hào)中的部分“2+3=”,然后是2+3的結(jié)果,即5。建議讀者啟動(dòng)自己的Pythonshell并嘗試這些例子。Python允許我們將一系列語(yǔ)句放在一起,創(chuàng)建一個(gè)全新的命令或函數(shù)。下面的例子創(chuàng)建了一個(gè)名為hello的新函數(shù):>>>defhello():print("Hello")print("計(jì)算機(jī)很有趣!")>>>1.5.2執(zhí)行Python程序1.5.2執(zhí)行Python程序第一行告訴Python我們正在定義一個(gè)新函數(shù),命名為hello。接下來(lái)兩行縮進(jìn),表明它們是hello函數(shù)的一部分。最后的空白行(通過(guò)按兩次回車鍵獲得)讓Python知道定義己完成,并且shell用另一個(gè)提示符進(jìn)行響應(yīng)。注意,鍵入定義并不會(huì)導(dǎo)致Python打印任何東西。我們告訴Python,當(dāng)hello函數(shù)用作命令時(shí)應(yīng)該發(fā)生什么,但實(shí)際上并沒(méi)有要求Python執(zhí)行它。鍵入函數(shù)名稱并跟上括號(hào),函數(shù)就被調(diào)用了。下面是使用hello命令時(shí)發(fā)生的事情:>>>hello()Hello計(jì)算機(jī)很有趣!>>>1.5.2執(zhí)行Python程序1.5.2執(zhí)行Python程序這時(shí),hello函數(shù)定義中的兩個(gè)print語(yǔ)句按順序執(zhí)行了。命令可以有可變部分,稱為參數(shù),放在括號(hào)中。讓我們看一個(gè)使用參數(shù)、自定義問(wèn)候語(yǔ)的例子。先是定義:>>>defgreet(person):print("Hello",person)print("Howareyou?")1.5.2執(zhí)行Python程序現(xiàn)在我們可以使用定制的問(wèn)候。>>>greet("John")HelloJohnHowareyou?>>>greet("Emily")HelloEmilyHowareyou?>>>1.5.2執(zhí)行Python程序1.5.2執(zhí)行Python程序使用greet時(shí),我們可以發(fā)送不同的名稱,從而自定義結(jié)果。print是Python中的一個(gè)內(nèi)置函數(shù),當(dāng)我們調(diào)用print函數(shù)時(shí),括號(hào)中的參數(shù)告訴函數(shù)要打印什么。注意到,執(zhí)行一個(gè)函數(shù)時(shí),括號(hào)必須包含在函數(shù)名之后,即使沒(méi)有給出參數(shù)也是如此。例如,可以使用print而不使用任何參數(shù),創(chuàng)建一個(gè)空白的輸出行。>>>print()>>>但是如果只鍵入函數(shù)的名稱,省略括號(hào),函數(shù)將不會(huì)真正執(zhí)行。這時(shí),交互式Python會(huì)話將顯示一些輸出,表明名稱所引用的函數(shù),如下面的交互所示:>>>greet<functiongreetatOx8393aec>>>>print<built-infunctionprint)1.5.2執(zhí)行Python程序1.5.2執(zhí)行Python程序這里的0x8393aec是在計(jì)算機(jī)存儲(chǔ)器中的位置(地址),其中恰好存儲(chǔ)了greet函數(shù)的定義。如果你在自己的計(jì)算機(jī)上嘗試,肯定會(huì)看到不同的地址。如果將函數(shù)交互式地輸入到Pythonshell中,當(dāng)退出shell時(shí),定義會(huì)丟失。如果下次希望再次使用它們時(shí),必須重新鍵入。1.5.2執(zhí)行Python程序?qū)嶋H上,程序的創(chuàng)建通常是將定義寫入獨(dú)立的文件,稱為“模塊”或“腳本”。此文件保存在輔助存儲(chǔ)器中,可以反復(fù)使用。模塊文件是一個(gè)文本文件,可以用任何應(yīng)用程序來(lái)編輯文本,例如記事本或文字處理程序,只要將程序保存為“純文本”文件即可。有一種特殊類型的應(yīng)用稱為集成開(kāi)發(fā)環(huán)境(IDE,IntegratedDevelopmentEnvironment)簡(jiǎn)化了這個(gè)過(guò)程,它們專門設(shè)計(jì)用于幫助程序員編寫程序,包括自動(dòng)縮進(jìn)、顏色高亮顯示和交互式開(kāi)發(fā)等功能。作為Pythonshell的IDLE就是一個(gè)簡(jiǎn)單卻完整的開(kāi)發(fā)環(huán)境?!癐DLE”中多出來(lái)的字母“L”是表達(dá)對(duì)EricIdle(埃里克·艾多爾)的致敬,他是英國(guó)六人喜劇團(tuán)體MontyPython的6位成員之一。1.5.2執(zhí)行Python程序我們來(lái)編寫并運(yùn)行一個(gè)完整的程序,以說(shuō)明模塊文件的使用。要將此程序鍵入IDLE,應(yīng)選擇File/NewFile菜單選項(xiàng)。這將打開(kāi)一個(gè)空白(非shell)窗口,可以在其中鍵入程序。下面是程序的Python代碼:【程序?qū)嵗?-1】一個(gè)簡(jiǎn)單的示例程序。#chaos.py#一個(gè)隨意編寫的簡(jiǎn)單程序,沒(méi)有特定的目的defmain():print("該程序說(shuō)明了一個(gè)隨意的功能。")x=eval(input("輸入0到1之間的數(shù)字:"))foriinrange(10):x=3.9*x*(1-x)print(x)main()1.5.2執(zhí)行Python程序1.5.2執(zhí)行Python程序在IDLE中鍵入該程序之后,從菜單中選擇File/Save,并保存為chaos.py。擴(kuò)展名.py表示這是一個(gè)Python模塊。在保存程序時(shí)要小心,因?yàn)镮DLE默認(rèn)在系統(tǒng)的Python文件夾中啟動(dòng)。建議將所有Python程序放在一個(gè)專用的個(gè)人文件夾中。程序?qū)嵗?-1中包含了幾行代碼,定義了一個(gè)新函數(shù)main(程序通常放在一個(gè)名為main的函數(shù)中),文件的最后一行是調(diào)用此函數(shù)的命令。一旦我們將一個(gè)程序保存在這樣的模塊文件中,就可以隨時(shí)運(yùn)行它。程序能以許多不同的方式運(yùn)行,這取決于你使用的實(shí)際操作系統(tǒng)和編程環(huán)境。如果使用的是窗口系統(tǒng),可以通過(guò)單擊(或雙擊)模塊文件的圖標(biāo)來(lái)運(yùn)行Python程序。在命令行情況下,可以鍵入像pythonchaos.py這樣的命令。使用IDLE時(shí),只需打開(kāi)該程序文件,從模塊窗口菜單中選擇Run/RunModule即可運(yùn)行程序。IDLE運(yùn)行程序時(shí),控制將切換到shell窗口。下面是看起來(lái)的樣子:>>>=======================RESTART=======================1.5.2執(zhí)行Python程序該程序說(shuō)明了一個(gè)隨意的功能。輸入0到1之間的數(shù)字:.250.731250.766441406250.69813501043853750.82189581879023040.57089401919693170.95539874836420990.1661867219544130.54041791206179260.96862893029980420.11850901017563877>>>1.5.2執(zhí)行Python程序1.5.2執(zhí)行Python程序第一行是來(lái)自IDLE的通知,表明shell已重新啟動(dòng)。IDLE在每次運(yùn)行程序時(shí)都會(huì)這樣做,使程序運(yùn)行在一個(gè)干凈的環(huán)境中。然后,Python從上至下逐行運(yùn)行該模塊的各條語(yǔ)句(命令),這就像在Python提示符下逐行鍵入它們一樣。模塊中的def會(huì)引導(dǎo)Python創(chuàng)建main函數(shù),模塊的最后一行導(dǎo)致Python調(diào)用main函數(shù),從而運(yùn)行程序。在這個(gè)例子中鍵入了“.25”,然后打印出10個(gè)數(shù)字的序列。1.5.2執(zhí)行Python程序注意到,Python有時(shí)會(huì)在存儲(chǔ)模塊文件的(子)文件夾中創(chuàng)建另一個(gè)名為pycache的文件夾,這里是Python存儲(chǔ)伴隨文件的地方,伴隨文件的擴(kuò)展名為.pyc。在本例中,Python可能會(huì)創(chuàng)建另一個(gè)名為chaos.pyc的文件,這是Python解釋器使用的中間文件。從技術(shù)上講,Python采用混合編譯/解釋的過(guò)程。模塊文件中的Python源代碼被編譯為較原始的指令,稱為字節(jié)代碼,然后解釋這個(gè)字節(jié)代碼(.pyc)。如果有.pyc文件可用,則第二次運(yùn)行模塊就會(huì)更快。如果刪除字節(jié)代碼文件,Python會(huì)根據(jù)需要自動(dòng)重新創(chuàng)建它們。在IDLE下運(yùn)行模塊,會(huì)將程序加載到shell窗口中。只需在shell提示符下鍵入命令main(),就可以要求Python再次運(yùn)行該程序。謝謝大家第2章Python語(yǔ)法基礎(chǔ)Python程序設(shè)計(jì)·第2章Python語(yǔ)法基礎(chǔ)Python屬于解釋性程序語(yǔ)言,因此我們可以一行一行地編寫程序命令并交給Python解釋器立即執(zhí)行,這一點(diǎn)與編譯式程序語(yǔ)言(例如C與C++)不同,其程序代碼必須先經(jīng)過(guò)編譯器轉(zhuǎn)換為電腦硬件能讀懂的機(jī)器指令碼,然后才執(zhí)行。解釋性程序語(yǔ)言這種方式非常方便學(xué)習(xí),在互動(dòng)模式下,透過(guò)互動(dòng)過(guò)程,逐步掌握Python的語(yǔ)法和各項(xiàng)功能特色。標(biāo)識(shí)符與數(shù)據(jù)類型1程序文件擴(kuò)展名與常見(jiàn)錯(cuò)誤類型4運(yùn)算符與表達(dá)式2程序注釋3軟件開(kāi)發(fā)簡(jiǎn)介5目錄2.1

標(biāo)識(shí)符與數(shù)據(jù)類型標(biāo)識(shí)符與保留字對(duì)象與類型、動(dòng)態(tài)類型列表、可變與不可變別名、元組內(nèi)置常數(shù)2.1

標(biāo)識(shí)符與數(shù)據(jù)類型為開(kāi)始下面的學(xué)習(xí),我們進(jìn)入Python解釋器互動(dòng)模式(Shell),或者把程序代碼寫入文件再交由解釋器執(zhí)行。在本書中,當(dāng)看到三個(gè)大于符號(hào)“>>>”時(shí),代表解釋器處于互動(dòng)模式,等待你輸入程序代碼;若是出現(xiàn)較長(zhǎng)且完整的程序代碼時(shí),則會(huì)寫成文件并標(biāo)示文件名。2.1

標(biāo)識(shí)符與數(shù)據(jù)類型下面的程序代碼會(huì)輸出數(shù)字3。 >>>3 3在互動(dòng)模式(Shell)中,光是輸入“3”,也會(huì)回應(yīng)“3”,這是因?yàn)镾hell會(huì)在執(zhí)行完一段程序代碼之后,盡量輸出結(jié)果提供回應(yīng)。但若是在程序文件里寫個(gè)“3”,執(zhí)行后并不會(huì)出現(xiàn)“3”,平常編寫程序代碼文件時(shí),若想輸出內(nèi)容到屏幕上,應(yīng)使用print語(yǔ)句。2.1

標(biāo)識(shí)符與數(shù)據(jù)類型雖然這一行程序代碼只有一個(gè)數(shù)字3,但執(zhí)行可不簡(jiǎn)單,解釋器努力工作,解析輸入的程序代碼,檢查語(yǔ)法并了解語(yǔ)義后,知道你想要的是個(gè)值為3的數(shù)字;然后,若處于互動(dòng)模式,解釋器會(huì)試著輸出執(zhí)行結(jié)果。光是執(zhí)行“3”也不簡(jiǎn)單2.1

標(biāo)識(shí)符、對(duì)象與類型不過(guò)上述程序代碼在執(zhí)行完后無(wú)法再次調(diào)用。為此,我們需要命名機(jī)制,為它取個(gè)名稱,以便能透過(guò)該名稱重復(fù)調(diào)用,請(qǐng)看下面的程序代碼。在符號(hào)“#”之后的文字是程序的注釋,即使輸入了也會(huì)被解釋器所忽略。 >>>a=3#建立整數(shù)3,取名稱a(第一次) >>>a#再次調(diào)用a 3當(dāng)執(zhí)行程序代碼“a=3”時(shí),等號(hào)“=”的意思是“賦值”,會(huì)先執(zhí)行右邊的程序代碼,建立整數(shù)3后,若左邊的名稱是第一次出現(xiàn),那么解釋器會(huì)建立該名稱,再把數(shù)字3賦值給名稱a。除了整數(shù),Python還能提供浮點(diǎn)數(shù)、字符串和其他各種數(shù)據(jù)。2.1.1標(biāo)識(shí)符與保留字名稱是編程的重要組成部分。我們?yōu)橹得ɡ鏲elsius和fahrenheit),為模塊命名(例如convert),也為模塊中的函數(shù)命名(例如main)。從技術(shù)上講,所有這些名稱都稱為“標(biāo)識(shí)符”。當(dāng)我們要在程序里命名名稱時(shí),必須遵守Python制定的一些規(guī)則:每個(gè)標(biāo)識(shí)符必須以字母或下劃線(“_”)開(kāi)頭,后跟字母(小寫a到z,大寫A到Z)、數(shù)字(0到9)或下劃線(“_”)的任意序列。這意味著第一個(gè)不能是數(shù)字,單個(gè)標(biāo)識(shí)符不能包含任何空格。所以,a、i、score、factory、_g_value、camelCase、idx、send_to_screen等等都是合乎規(guī)則的名稱。注意到,Python標(biāo)識(shí)符區(qū)分大小寫(又稱“大小寫敏感”),所以對(duì)Python來(lái)說(shuō),spam、Spam、sPam和SPAM是不同的名稱。在大多數(shù)情況下,程序員可以自由選擇符合這些規(guī)則的任何名稱。不過(guò),好的程序員總是會(huì)選擇一些有實(shí)際意義的名字。2.1.1標(biāo)識(shí)符與保留字Python有39個(gè)保留字(也稱關(guān)鍵字),但是與有五六十個(gè)以上保留字的語(yǔ)言如C++、C#、Java等等相比,Python可謂中規(guī)中矩,如果少于這個(gè)數(shù)目,恐怕就得犧牲掉某些語(yǔ)言特色或是采取更精簡(jiǎn)的作法。例如COBOL,這個(gè)“古老”的程序語(yǔ)言的保留字?jǐn)?shù)目居然高達(dá)三百多個(gè)。本書附錄A.1列出了Python的保留字。 >>>if=3 #if是Python保留字 File"<stdin>",line1 if=3 ^if是Python的保留字,無(wú)法以此命名,要不然會(huì)出現(xiàn)出錯(cuò)信息“SyntaxError:invalidsyntax”(語(yǔ)法錯(cuò)誤:無(wú)效的語(yǔ)法)。 >>>IF=4 #取名為大寫IF后雖可行,但不建議2.1.1標(biāo)識(shí)符與保留字在Python中也可以使用Unicode字符來(lái)命名,例如可以使用中文字、日文假名、法文字母來(lái)命名,例如: >>>數(shù)=3 #建立整數(shù)3,命名為“數(shù)” >>>你好='hello' #建立字符串'hello',命名為“你好”不過(guò)取這種名稱不利流通也不具國(guó)際性,所以應(yīng)盡量避免。2.1.1標(biāo)識(shí)符與保留字當(dāng)想透過(guò)某名稱存取與其綁定的對(duì)象時(shí),該名稱必須先存在,也就是必須先定義。在Python中定義名稱的方式是賦值語(yǔ)句。當(dāng)某名稱第一次出現(xiàn)在賦值語(yǔ)句左邊時(shí),解釋器就會(huì)產(chǎn)生該名稱,然后便能在程序中使用該名稱(對(duì)象);之后若該名稱又出現(xiàn)在賦值語(yǔ)句左邊,便會(huì)轉(zhuǎn)而指向別的對(duì)象。 >>>a #目前尚未有“a”這個(gè)名稱 Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> NameError:name'a'isnotdefined

(名稱錯(cuò)誤:名稱'a'尚未定義)2.1.1標(biāo)識(shí)符與保留字 >>>a=3 #以賦值語(yǔ)句產(chǎn)生名稱、建立int對(duì)象3,并綁定兩者 >>>a+5 #之后就可以使用名稱“a”來(lái)存取對(duì)象 8 >>>a=99 #轉(zhuǎn)而指向別的新對(duì)象但也有例外,在使用“+=”這樣的運(yùn)算符時(shí),若左邊是可變對(duì)象,例如list(列表),其動(dòng)作通常會(huì)是原地修改。2.1.1標(biāo)識(shí)符與保留字Python還包括許多內(nèi)置函數(shù)(例如print函數(shù))。雖然在技術(shù)上可以將內(nèi)置函數(shù)的名稱用來(lái)標(biāo)識(shí)其他目的,但這是一個(gè)“非常糟糕”的主意。例如,如果你重新定義print的含義,那么就無(wú)法再打印信息,這也會(huì)讓其他閱讀程序的Python程序員感到非常困惑,因?yàn)樗麄冾A(yù)期中的print指的是內(nèi)置函數(shù)。2.1.2對(duì)象與類型請(qǐng)看下面的舉例,執(zhí)行結(jié)果見(jiàn)右圖。名稱與對(duì)象的關(guān)系圖中的“3”、“7”、“1.25”、“'hello'”,被稱為“對(duì)象”,每個(gè)對(duì)象都有其類型,例如“7”是“int”(整數(shù)),“1.25”為“?oat”(浮點(diǎn)數(shù)),“'hello'”是“str”(字符串)。2.1.2對(duì)象與類型當(dāng)你想建立字符串對(duì)象時(shí),以單引號(hào)“'”或雙引號(hào)“"”包住想要的文字即可。執(zhí)行賦值(等號(hào)“=”)動(dòng)作時(shí),如果左邊的名稱(標(biāo)識(shí)符)是第一次出現(xiàn),那么Python解釋器就會(huì)先產(chǎn)生該名稱,讓你經(jīng)由該名稱調(diào)用指向的對(duì)象;若之后再把相同的名稱放在等號(hào)左邊,那么解釋器會(huì)找出該名稱、使它轉(zhuǎn)而指向新的對(duì)象,例如上述程序代碼執(zhí)行后,名稱a最后會(huì)指向整數(shù)對(duì)象。名稱與對(duì)象之間的關(guān)系又稱為綁定。由于Python具備垃圾收集的功能,而上述程序代碼最后已經(jīng)沒(méi)有任何名稱指向該對(duì)象,原先的整數(shù)對(duì)象3(被稱為垃圾)會(huì)被自動(dòng)回收。編寫程序時(shí)會(huì)根據(jù)需求建立各種不同的對(duì)象,若想表示學(xué)生的成績(jī),可使用整數(shù)或浮點(diǎn)數(shù)類型的對(duì)象,若想存儲(chǔ)員工的姓名,可使用字符串類型的對(duì)象。此外,Python還提供了其他一些數(shù)據(jù)類型。2.1.2對(duì)象與類型在某些程序語(yǔ)言里,變量是個(gè)整體的概念,包括變量的名稱、變量值的類型、存放變量值的地方。以變量名稱來(lái)使用變量,變量與類型也捆綁在一起,一經(jīng)宣告便不可改變,存放值的地方也是一塊與變量名稱緊緊關(guān)聯(lián)在一起的固定大小的存儲(chǔ)塊。但是,若只有這種形式的變量也會(huì)很不方便,所以其他程序語(yǔ)言后來(lái)加入了指針、對(duì)象等概念。而在Python里,所有東西通通都是對(duì)象,不論是整數(shù)、字符串、列表,還是函數(shù)、模塊等等,并且把名稱與對(duì)象的概念獨(dú)立開(kāi)來(lái),所以不再使用“變量”的概念來(lái)解釋。2.1.3動(dòng)態(tài)類型談?wù)摮绦蛘Z(yǔ)言時(shí),常會(huì)看到“動(dòng)態(tài)”與“靜態(tài)”這兩個(gè)字眼,簡(jiǎn)單地說(shuō),動(dòng)態(tài)是指“執(zhí)行時(shí)”,靜態(tài)就是指“執(zhí)行前”。把名稱與對(duì)象分離開(kāi)來(lái),而且把類型放在對(duì)象身上,在動(dòng)態(tài)執(zhí)行時(shí)才會(huì)去找出對(duì)象的類型,這種概念稱為動(dòng)態(tài)類型。2.1.3動(dòng)態(tài)類型名稱本身并不含有類型信息,該名稱可能指向整數(shù)對(duì)象、也可能指向列表對(duì)象,在程序執(zhí)行過(guò)程中,該名稱指向?qū)ο蟮念愋涂赡軙?huì)改變,所以光看程序代碼“a+b”,并不知道a與b的類型,自然也不清楚“+”應(yīng)該做什么動(dòng)作,只有在執(zhí)行時(shí),知道a與b的類型后,才能執(zhí)行“a+b”。如果是整數(shù),那么“+”是算術(shù)加法,如果是字符串,那么“+”是字符串連接。這種根據(jù)類型做出不一樣行為的機(jī)制,叫做“多態(tài)”。因?yàn)镻ython采用動(dòng)態(tài)類型,所以名稱可隨時(shí)指向不同類型的對(duì)象,容器類型內(nèi)的元素也可以是不同類型。例如下面的程序代碼,在列表a里放入各種類型的對(duì)象。 >>>a=[3,'abc',4.56,(0,1,2),[[3,4],'def']]2.1.4列表除了整數(shù)、浮點(diǎn)數(shù)、字符串等數(shù)據(jù)類型之外,還有一種叫做列表(list)的具備容器(數(shù)據(jù)結(jié)構(gòu))功能的類型,list數(shù)據(jù)結(jié)構(gòu)中可以放入任何類型的對(duì)象。建立列表對(duì)象時(shí),其語(yǔ)法是使用方括號(hào)“[]”包住想含有的對(duì)象。例如:>>>li0=[30,41,52,63]>>>li0[2] #調(diào)用位于索引2處的對(duì)象52>>>li1=['amy','bob','cathy']>>>b=li1[1] #拿到索引1之處的對(duì)象,賦值給名稱b>>>b #名稱b指向字符串對(duì)象'bob''bob'>>>li1[99] #索引值超過(guò)界限,發(fā)生錯(cuò)誤Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError:listindexoutofrange#索引錯(cuò)誤2.1.4列表2.1.4列表見(jiàn)圖2-3,名稱li0指向一個(gè)列表對(duì)象,含有4個(gè)元素(或稱為項(xiàng)目),分別是整數(shù)對(duì)象30、41、52、63,然后可使用“l(fā)i0[2]”的索引語(yǔ)法來(lái)存取該位置的對(duì)象,給定名稱后再于方括號(hào)內(nèi)寫進(jìn)索引值即可。列表的索引值從0開(kāi)始計(jì)數(shù),所以列表li0的有效索引值界限是從0到3。名稱li1指向另一個(gè)列表對(duì)象,含有3個(gè)字符串對(duì)象,使用索引語(yǔ)法取出對(duì)象后,可以賦值給另一個(gè)名稱;若索引值超過(guò)界限,便會(huì)顯示出錯(cuò)信息“IndexError:listindexoutofrange”(索引錯(cuò)誤:列表索引值超過(guò)界限)。

列表對(duì)象2.1.4列表注:索引從0開(kāi)始長(zhǎng)度為n的列表,其有效索引值是0到n-1,如果不小心以n作為索引值來(lái)存取列表,就會(huì)出錯(cuò),這叫做“離一錯(cuò)誤”。雖然只差一,但還是屬于非法動(dòng)作。列表可以同時(shí)放入任何類型的對(duì)象,包括列表本身。2.1.4列表例如: >>>li2=[3,101,4.56,'book','music’] >>>li3=['Frank',177,68,'engineer',['C','Python’]] >>>li3[4] #li3列表、索引值4的地方也是個(gè)列表['C','Python’] >>>li3[4][1] #既然是個(gè)列表,繼續(xù)以[]語(yǔ)法調(diào)用其內(nèi)容'Python'列表li2里有兩個(gè)整數(shù)對(duì)象、一個(gè)浮點(diǎn)數(shù)對(duì)象、兩個(gè)字符串對(duì)象。列表不僅可以含有整數(shù)、浮點(diǎn)數(shù)、字符串這些對(duì)象類型,也可含有列表。如上例的li3,其索引值4之處也是個(gè)列表,里頭含有兩個(gè)字符串。列表內(nèi)可含有列表2.1.4列表當(dāng)我們說(shuō)“列表內(nèi)可存放對(duì)象”時(shí),并不是真的把某個(gè)對(duì)象放在列表里,而是讓該列表能以索引的方式指向別的對(duì)象,就跟“a=3”的賦值結(jié)果差不多,只不過(guò)改成索引語(yǔ)法來(lái)調(diào)用罷了。2.1.5可變與不可變類型為int、?oat、str的對(duì)象,都擁有“不可變”的特性,即:不可變對(duì)象一旦建立,其值就無(wú)法改變??梢宰屇硞€(gè)名稱轉(zhuǎn)而指向別的對(duì)象,但不能修改不可變對(duì)象。 >>>a=3#建立整數(shù)對(duì)象(值為3),產(chǎn)生名稱a指向它 >>>a=4#名稱a轉(zhuǎn)而指向另一個(gè)整數(shù)對(duì)象(值為4) >>>a 4上述程序代碼中,值為3的整數(shù)對(duì)象一旦建立后,其值就不能再變動(dòng);執(zhí)行“a=4”后,名稱a指向新的對(duì)象,則原先的對(duì)象將成為垃圾被系統(tǒng)回收。但列表屬于“可變”對(duì)象,建立后,仍可修改其內(nèi)容。 >>>name='Frank' #姓名

>>>weight=177 #身高

>>>height=68 #體重

>>>title='engineer' #職稱

>>>langs=['C','Python'] #程序語(yǔ)言

>>>li4=[name,weight,height,title,langs] >>>li4[2]=75 #哇,變胖啦

>>>li4 ['Frank',185,75,'engineer',['C','Python']]2.1.5可變與不可變2.1.5可變與不可變?cè)谏鲜龃a中,列表li4的索引值2原本指向整數(shù)對(duì)象68(體重),之后“l(fā)i4[2]=75”讓該處轉(zhuǎn)而指向新的整數(shù)對(duì)象75,換句話說(shuō),列表li4改變了。而因?yàn)槌绦蚶餂](méi)有任何一處(名稱)指向之前的整數(shù)對(duì)象68,也就成為垃圾,會(huì)被Python的垃圾收集機(jī)制回收。2.1.6別名因?yàn)镻ython有不可變對(duì)象(int、?oat、str)與可變對(duì)象(list、dict)之分,而且名稱與對(duì)象其實(shí)是獨(dú)立的兩樣?xùn)|西,所以必須注意發(fā)生“別名現(xiàn)象”,也就是當(dāng)兩個(gè)(或以上)的名稱都指向同一個(gè)對(duì)象時(shí)的狀況。別名也叫做共享參考。如果是不可變對(duì)象,那么程序行為應(yīng)可預(yù)期,例如:>>>a=3 #名稱a指向整數(shù)對(duì)象3>>>b=a #透過(guò)名稱a拿到整數(shù)對(duì)象3,賦值給名稱b>>>a #此時(shí),a與b都指向“同一個(gè)”對(duì)象3>>>b3>>>b=4 #名稱b指向“新的整數(shù)對(duì)象4”>>>b4>>>a #名稱a仍指向原先的整數(shù)對(duì)象332.1.6別名上述程序行為,讀者應(yīng)該熟悉了,但如果是可變對(duì)象,那就要小心,例如:>>>a=[60,71,82] #名稱a指向列表>>>b=a #透過(guò)名稱a拿到列表,賦值給名稱b>>>a #此時(shí),a與b都指向“同一個(gè)”列表[60,71,82]>>>b[60,71,82]>>>b[0]=99 #透過(guò)名稱b修改列表(可變對(duì)象)>>>b #改變了[99,71,82]>>>a[99,71,82]2.1.6別名2.1.6別名當(dāng)使用可變對(duì)象時(shí),同一個(gè)對(duì)象可賦值給多個(gè)名稱。換句話說(shuō),多個(gè)名稱可指向同一個(gè)對(duì)象,透過(guò)這些名稱都可以修改該可變對(duì)象。Python提供了元組(tuple)類型,元組是不可變的列表(list)。建立tuple對(duì)象時(shí),須使用小括號(hào)“()”包住想含有的對(duì)象,例如:>>>() #空tuple()>>>t0=(30,41,52,63)>>>t0[2] #調(diào)用索引2該處的對(duì)象52>>>t1=('amy','bob','cathy')>>>b=t1[1] #讀取索引1的對(duì)象,賦值給名稱b>>>b #名稱b指向字符串對(duì)象'bob''bob'2.1.6別名>>>t1[0]='annie’ #tuple是不可變對(duì)象,不能修改Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:'tuple'objectdoesnotsupportitemassignment(類型錯(cuò)誤:'tuple'對(duì)象不支持項(xiàng)目分配)>>>t1[99] #索引值超過(guò)界限,發(fā)生錯(cuò)誤Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>IndexError:tupleindexoutofrange(索引錯(cuò)誤:元組索引超出范圍)2.1.6別名2.1.7元組tuple跟list很像,建立時(shí)改用小括號(hào)包住內(nèi)含對(duì)象,調(diào)用時(shí)的索引語(yǔ)法都跟list一樣,索引值超過(guò)界限時(shí)也會(huì)發(fā)生錯(cuò)誤,但tuple對(duì)象屬于不可變對(duì)象,當(dāng)你想要更動(dòng)它時(shí),例如“t1[0]='annie'”,將會(huì)出現(xiàn)錯(cuò)誤“TypeError:'tuple'objectdoesnotsupportitemassignment”(類型錯(cuò)誤:'tuple'對(duì)象不支持賦值動(dòng)作)。既然tuple對(duì)象不可變,就無(wú)須擔(dān)心別名現(xiàn)象,因?yàn)橐坏┠闶稚嫌袀€(gè)名稱指向tuple對(duì)象,不管是你自己建立的、還是從某地方拿到的,它都不會(huì)改變。>>>t0=(0,1,2,3)>>>t1=t0 #t1與t1指向同一個(gè)對(duì)象>>>t1[0]=99 #不可變Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:'tuple'objectdoesnotsupportitemassignment(類型錯(cuò)誤:'tuple'對(duì)象不支持項(xiàng)目分配)2.1.7元組2.1.7元組當(dāng)想建立只含一個(gè)元素的tuple對(duì)象時(shí),不能只寫“('onlyone')”,因?yàn)槔ㄌ?hào)“()”除了用來(lái)建立tuple對(duì)象,也可用來(lái)改變運(yùn)算順序,所以必須如上述程序代碼加個(gè)逗號(hào)“('onlyone',)”,這樣Python才能正確得知你想要的是什么。另外,在語(yǔ)義明確的地方,通??梢允÷缘艚uple的括號(hào),Python還是能知道你的意思。 >>>t0=('onlyone') #t0是str對(duì)象 >>>t1=('onlyone',) #t1是tuple對(duì)象 >>>('a','b','c') #以括號(hào)“()”建立tuple對(duì)象 ('a','b','c’) >>>'a','b','c' #此處可省略括號(hào) ('a','b','c')又如:>>>(0,1,2,3) #建立數(shù)組(0,1,2,3)>>>3*(4+5) #用括號(hào)改變運(yùn)算順序27>>>(0) #這樣只會(huì)得到值為0的int對(duì)象0>>>(0,) #這樣會(huì)得到含有一個(gè)元素的tuple對(duì)象(0,)2.1.7元組2.1.8內(nèi)置常數(shù)所謂“內(nèi)置常數(shù)”是指Python事先就設(shè)定好的數(shù)據(jù),即系統(tǒng)缺省的幾個(gè)名稱、指向預(yù)先建立的對(duì)象,這些名稱都代表了特定的意義,如果任意重新賦值的話,程序的行為就會(huì)改變,也會(huì)讓閱讀程序代碼的人困惑且造成混淆,因此,一般不會(huì)也不該這么做。內(nèi)置常數(shù)包括:None、False、True、NotImplemented、Ellipsis、__debug__。2.2

運(yùn)算符與表達(dá)式算術(shù)表達(dá)式比較運(yùn)算符邏輯運(yùn)算符運(yùn)算符優(yōu)先級(jí)2.2

運(yùn)算符與表達(dá)式現(xiàn)在,我們已經(jīng)建立并擁有一些東西(對(duì)象)了,但是,該怎么操作各種類型的對(duì)象呢?例如,華氏溫度轉(zhuǎn)成攝氏,拿到五門課的成績(jī)后想求個(gè)平均分,想比較兩個(gè)對(duì)象的大小,想連接好幾個(gè)字符串,這些動(dòng)作就要靠表達(dá)式來(lái)完成了。表達(dá)式由操作數(shù)與運(yùn)算符組成,操作數(shù)就是對(duì)象,可以直接寫在程序里,例如“3”、“45.67”、“'Howareyou?'”、“[3,2,1,0]”這些字面值;操作數(shù)也可以是個(gè)名稱,透過(guò)名稱調(diào)用指向的對(duì)象。至于運(yùn)算符,代表了種種不同的操作動(dòng)作,例如兩個(gè)整數(shù)對(duì)象相加、連接兩個(gè)tuple或列表、比較兩個(gè)字符串、檢查某個(gè)對(duì)象是否存在于列表中,等等。2.2.1算術(shù)運(yùn)算符算術(shù)運(yùn)算符包括+、-、*、/、%、//、**,例如: >>>a=3+5 #+加法,得到8 >>>b=6-20 #-減法,得到-14 >>>c=200+a*b #先乘除后加減,得到88 >>>c2=(200+a)*b #使用括號(hào)改變運(yùn)算順序,得到-2912 >>>d=17/3 #5.666666666666667 >>>d2=17//3 #地板除法,得到5 >>>e=17%3 #余數(shù),得到2 >>>f=2**5 #2的5次方,得到32 >>>g=+f #求f的正數(shù),還是32 >>>h=-f #求f的負(fù)數(shù),得到-322.2.1算術(shù)運(yùn)算符其中“+”加法、“-”減法、“*”乘法、“**”冪次方,就跟在數(shù)學(xué)課中所學(xué)到的一樣;“+”與“-”運(yùn)算符不僅能作為二元運(yùn)算符(需要兩個(gè)操作數(shù)),代表加法與減法,也可作為一元運(yùn)算符(需要一個(gè)操作數(shù)),代表正數(shù)與負(fù)數(shù),“-x”可改變x的正負(fù)號(hào),但“+x”就沒(méi)什么用了。2.2.1算術(shù)運(yùn)算符要特別注意“/”、“//”和“%”。先來(lái)看看“//”地板除法運(yùn)算符,我們想象有一條垂直的數(shù)值線(見(jiàn)圖2-5),往上為正、往下為負(fù);“17//3”的結(jié)果會(huì)是“17除以3”的地板,也就是比它小但最靠近它的整數(shù),換句話說(shuō),“17除以3”落在5與6之間,天花板是6、地板是5,所以“17//3”地板除法的結(jié)果會(huì)是5;而“-17除以3”落在-5與-6之間,天花板是-5、地板是-6,所以“-17//3”結(jié)果是-6。若作用在浮點(diǎn)數(shù),行為仍相同,但結(jié)果的對(duì)象類型會(huì)是?oat。

天花板與地板2.2.1算術(shù)運(yùn)算符換個(gè)說(shuō)法,地板除法“//”的運(yùn)算規(guī)則是:先對(duì)被除數(shù)進(jìn)行四舍五入取整(除數(shù)不動(dòng)),然后運(yùn)算除法,對(duì)運(yùn)算結(jié)果進(jìn)行無(wú)條件截?cái)?,只保留到整?shù)部分,小數(shù)點(diǎn)后不保留。這個(gè)計(jì)算結(jié)果類似于floor(),所以叫地板除法。至于“/”除法運(yùn)算符,若操作數(shù)是浮點(diǎn)數(shù),則得到一般除法(也稱精確除法)的結(jié)果,例如“17.0/3”的結(jié)果是“5.666666666666667”,只要操作數(shù)其中一個(gè)是浮點(diǎn)數(shù),另一個(gè)操作數(shù)就會(huì)被自動(dòng)轉(zhuǎn)成浮點(diǎn)數(shù),然后再作除法。但因?yàn)殡娔X的浮點(diǎn)數(shù)類型不能表示無(wú)窮位數(shù),所以只能得到“5.666666666666667”這樣的結(jié)果;另外,就算是非無(wú)窮位數(shù),浮點(diǎn)數(shù)類型仍無(wú)法完整表示某些值,操作數(shù)不論是整數(shù)還是浮點(diǎn)數(shù),其行為都相同(見(jiàn)表2-1)。2.2.1算術(shù)運(yùn)算符表2-1“/”、“%”與“//”的運(yùn)算結(jié)果2.2.1算術(shù)運(yùn)算符“%”余數(shù)運(yùn)算符,操作數(shù)是正整數(shù)對(duì)象時(shí),其行為例如“17%3”的結(jié)果是2;但若是負(fù)整數(shù),其行為由“x%y”等于“x-(x//y)*y”決定,若作用在浮點(diǎn)數(shù),行為仍一樣,但結(jié)果的類型是?oat。 >>>x=17 >>>y=-3 >>>x%y -1 >>>x-(x//y)*y -12.2.1算術(shù)運(yùn)算符Python執(zhí)行表達(dá)式運(yùn)算時(shí),會(huì)遵從運(yùn)算符優(yōu)先順序,在算術(shù)運(yùn)算符中,“**”最高,“+”正數(shù)與“-”負(fù)數(shù)次之,然后是“*、/、//、%”,之后是“+、-”加減法,這也符合我們學(xué)過(guò)的運(yùn)算順序。若想改變運(yùn)算順

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論