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

下載本文檔

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

文檔簡介

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

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

圖靈1.1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

>>>weight=177 #身高

>>>height=68 #體重

>>>title='engineer' #職稱

>>>langs=['C','Python'] #程序語言

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

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

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

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

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

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論