本書以大量的編程實例與作者多年編程實踐的體會來揭示編程的本質(zhì),系統(tǒng)性地指導(dǎo)讀者如何編程。書中所有代碼都用Python語言編寫,通過編程實例講解Python語言的所有知識點,使讀者在掌握編程思維和技巧(邏輯思維能力、計劃構(gòu)建能力、循環(huán)計算能力、遞歸求解能力等)的同時,自然而然地熟練掌握Python語言。
本書既適合作為程序設(shè)計基礎(chǔ)編程導(dǎo)論Python語言程序設(shè)計等課程的教材,也適合參加編程競賽的、自學Python編程的中學生、大中專學生、程序員及普通讀者參考。
全書包含370段程序?qū)嵗?00道習題。作者為普林斯頓大學博士、千人計劃專家、長江學者,曾擔任美國UTD大學教師20余年,在講授Python編程方面具有豐富經(jīng)驗。
《編程導(dǎo)論以Python為舟》為雙色印刷,重點突出,便于讀者深入理解和查詢知識點。
前言
各位讀者想要學習編程嗎?不管你有沒有編程基礎(chǔ),這本書都會滿足你的需求。本書將會帶領(lǐng)讀者由淺入深地學習編程,通過大量有趣的編程問題以及對實例的分析、運用和解釋,培養(yǎng)讀者解決問題的能力(也就是計算思維能力),同時通過這些有趣的實例來指導(dǎo)讀者學習如何具體地組織數(shù)據(jù)結(jié)構(gòu)、構(gòu)建各類函數(shù)與程序片段等編程技巧。計算思維的具體表現(xiàn)形式是算法,可以說,算法是程序的精神,而函數(shù)與數(shù)據(jù)結(jié)構(gòu)是算法的具體實現(xiàn),或者說是程序的骨肉。編程者需要兼顧程序的精神與骨肉。
本書作者希望以編程的實例和體驗來傳授編程的本質(zhì),而不是空談編程理論。本書中所有的代碼都用Python編程語言編寫,同時本書也通過編程實例講解了Python語言的所有重點。作者選擇Python語言是因為Python已經(jīng)成為世界上最通用的編程語言之一,它簡單易學、功能強大。不同于市面上大部分的編程語言書,本書的特點是完整、系統(tǒng)地指導(dǎo)讀者如何編程,讀者在學習編程的同時,自然而然地熟練掌握Python語言。
在這個信息化的時代,無論是大數(shù)據(jù)、物聯(lián)網(wǎng),還是人工智能等應(yīng)用,它們已經(jīng)深入到千家萬戶的日常生活中,因此我們所有人都需要學習編程。因為只有學習了編程,我們才能對信息社會有真實的認知,而不會一直認為它是個神秘的事,甚至陷入人云亦云的窘境中。正是由于認識到編程教育的重要性,政府在2017年頒布了相關(guān)文件,計劃逐步將編程教育納入中小學的課程體系中。
為什么編程應(yīng)該納入課程體系中呢?其實編程本身具有更深層的教育意義。從中小學教育開始,這幾十年來,學校所教授的必修課程,包括數(shù)學物理化學生物等,都是告訴學生我們所知道的宇宙萬物的一些道理,也就是一些我們所發(fā)現(xiàn)或觀測到的事實(facts)。不管是數(shù)學的公式、定理的證明,還是物理的規(guī)律、化學的反應(yīng)等,都是facts。在我們所傳授的知識體系中嚴重缺乏對創(chuàng)新能力和解決問題能力的培養(yǎng),而編程過程中對每一個程序的設(shè)計和實現(xiàn),都是從無到有,也就是說,寫程序的過程就是創(chuàng)新的過程。學習編程不僅可以學習如何解決問題,還可以更進一步地學習如何有效地解決問題。而這些能力的培養(yǎng)恰恰被我們的傳統(tǒng)教育忽視了,因此有必要將編程納入所有學生必修的知識和技能范圍內(nèi)。人類社會的變化是如此迅速,相對應(yīng)地,我們的教育也應(yīng)該與時俱進。
編程要怎么學呢?市面上有許多以講解某一種計算機語言為目標的書,例如Python語言學習、Java語言編程、C語言教程等。作者從事編程與計算機科學領(lǐng)域的相關(guān)教學已有20余年,深感通過學習某種編程語言來學習編程是個錯誤的方式。這種方式常會使學生們陷入對某一種編程語言細枝末節(jié)的學習中,妨礙學生了解和體會編程的核心思想與本質(zhì)。就算學生努力記住了某種編程語言的流水賬細節(jié),那又如何呢?在這種學習方式下,很可能使培養(yǎng)編程能力和理解能力變得更加困難。就算考試取得高分,難道就能證明學生已經(jīng)擁有相應(yīng)的編程能力嗎?這樣的編程學習方式甚至讓學生自以為已經(jīng)學會了編程,其實,還差得遠呢。
這些年來,作者深切地覺得我們?nèi)鄙僖槐緯槐疽詫W習編程為主、學習編程語言為輔的書。我們需要這樣的書來引導(dǎo)學生學習編程,并切實培養(yǎng)編程能力。本書是作者多年的心得匯集而成的,是一本教導(dǎo)編程原理和技巧的書,它以Python語言作為渡河之舟來輔助編程知識的學習和鞏固。跟隨本書的講解,讀者既可以學習編程知識,又可以同時掌握Python語言的使用。
問曰: 我是個文科生,學習編程對我有用嗎?
當然有用。
我們可以從兩方面來看。第一,英文有一個詞叫作Logistics,意為組織計劃、后勤管理。不管你是要開一家奶茶店,還是制作商品物流計劃、組織一個活動、管理公司行政、計劃一次旅行,或者規(guī)劃孩子的學習,乃至家中的日常事務(wù)等,都屬于Logistics的范疇。學習編程,可以直接增強組織、計劃的能力,對自己的事業(yè)和家庭都有直接的益處,甚至教育孩子的功效也會上一個臺階。第二,學習編程讓我們知道計算機是怎么運作的、機器中所謂的智能是怎么產(chǎn)生的等極為有用的知識,并且可以練習和活用這些知識。
希望通過本書的學習,讀者能夠跟上信息、智能時代的腳步。愿你們從學習這些知識中得到喜悅,所謂學而時習之,不亦樂乎,我想就是這個道理吧。
問曰: 讀這本書之前需要什么預(yù)備知識?
只要讀者有清晰的頭腦和肯學習的心就可以了。
很多人都有個錯誤的觀念,認為學習編程或算法需要高深的數(shù)學知識,其實不然。閱讀本書只需要讀者邏輯清楚,學過初中的數(shù)學知識。讀者可以用下例來檢查是否有足夠的數(shù)學知識來閱讀這本書。你是否知道一個正整數(shù)可以分解成若干個質(zhì)數(shù)相乘?如15=35,24=2223。假如你知道這個數(shù)學道理,恭喜你,你完全有能力研讀這本書了。本書的內(nèi)容通俗易懂,目標是讓一般讀者都能通過本書學到編程的核心和技巧,同時也學會運用Python語言編程。
不僅一般讀者會因為讀本書而受益,學習計算機相關(guān)專業(yè)的讀者也會因為研讀本書而受益匪淺。希望讀者能通過閱讀本書喜歡上編程,感覺到編程是件具有藝術(shù)性的事,也是件可以作為休閑消遣的趣事。
問曰: 以何因緣寫這本書?
因緣千絲萬縷,互相影響。任何事的成就必定是因人、因時、因事、因地等因緣影響而成的。縱然因緣深廣復(fù)雜,暫縷其大綱,可以概括如下:
第一,我在完成《計算機科學導(dǎo)論以Python為舟》一書之后,感覺我們還需要從軟件編程的角度出發(fā),再寫一本書,它可以作為軟件導(dǎo)論、程序設(shè)計課程的教材,或者是我之前撰寫的計算機科學導(dǎo)論的姐妹書,用作計算機導(dǎo)論課程的輔助教材。
第二,我的女兒奕蘭在上中學。我一直想要教她一些編程知識,但是沒有看到任何合適的書可以引導(dǎo)她學習基礎(chǔ)編程,所以我決定要寫一本實際、有用、深入淺出、抓住重點的好書。對中學生(或任何人)而言,學習編程就一定要學真實代碼的編寫,因此我在本書中以Python為工具展示編程的美妙,這樣讀者就不需要浪費時間去學習一些非代碼型的編程工具,這些工具是無法盡顯編程的原理和技巧的。
第三,Python語言是一種簡單易學、功能強大的語言,非常適用于編程基礎(chǔ)的學習。已經(jīng)有很多教學實踐顯示,初學者可以很快地掌握Python語言的基本功能,所以讀者經(jīng)過本書的學習,得以用Python語言練習各類計算思維方式和各種編程技巧。如今,Python語言已經(jīng)被廣泛運用到科學計算、網(wǎng)站建設(shè)、機器學習、游戲開發(fā)等方面,成為全世界軟件開發(fā)工程師們使用率最高的語言之一。
第四,編程絕對不是學習了一種編程語言后就能掌握的知識。編程語言(例如C、Python、Java等)不過是編程的工具。學習語言是必需的,但是更重要的是學習如何編程,學習解決問題的思維方式,學習如何設(shè)計數(shù)據(jù)結(jié)構(gòu)和程序的架構(gòu)。也就是說,不僅要學習如何編寫正確的程序,更要學習如何才能編寫出可以快速執(zhí)行并且縝密周全的程序。
第五,近年來,會下圍棋的計算機打遍天下無敵手,人工智能(或稱機器智能)變得異常紅火。在媒體、商業(yè)的各種炒作下,似乎很多人都成了人工智能的專家,對一些熱門話題侃侃而談,這使得普通人對人工智能產(chǎn)生片面的憧憬或者懼怕。事實上,絕大部分人還是霧里看花、人云亦云罷了。大家一定要了解,人工智能不是個神奇的事,通俗地說,它不過是一些程序的執(zhí)行結(jié)果和效果是人編寫出來的程序的執(zhí)行結(jié)果或效果罷了。人工智能要實現(xiàn)類似人類的邏輯推理、跨領(lǐng)域聯(lián)想等功能,要達到那些電影情節(jié)所展示的境界,還有非常遙遠的路要走。成為世界第一的圍棋程序固然是驚人的,但是這個程序卻不能玩其他的游戲。我希望大家能了解: 人工智能是由程序計算出來的,進而對人工智能產(chǎn)生比較清楚和冷靜的認知。學習好編程后,相信大家對國家和社會關(guān)于人工智能的發(fā)展戰(zhàn)略會有正確的態(tài)度,進而產(chǎn)生莫大的動力。這是我寫本書的動機之一。本書特別有一章稱為智能是計算出來的,就是講解這些觀念的。
問曰: 這本書的特色為何?
作者撰寫這本書的目標是希望讀者利用此書打好編程的基礎(chǔ)、掌握編程的核心基礎(chǔ)技巧、體會編程的美,同時也能熟練地用Python語言編程。具體而言,本書的特色可以歸納成下列幾點:
本書的第一個特點是教授用計算機程序解決問題的思維和技巧(或稱為計算思維)。內(nèi)容由淺入深、清楚易懂。讀者們可以從書中學習到用編程解決問題的基本思維方式:
(1) 邏輯思維的能力;
(2) 組織架構(gòu)的能力;
(3) 循環(huán)計算的能力;
(4) 遞歸求解的能力。
我們用以下例子來做解釋(在第1章中有多個例子及詳細的解釋)。
問題描述: 編寫一個程序,計算出一組數(shù)字的總和。
當我們面對這樣的問題時,要如何著手編程來解決問題呢?
(1) 首先要建立解決問題的基本思路,我們稱之為算法。就是將這些數(shù)一個不漏地加起來,在這個把數(shù)加起來的過程中,既不能重復(fù)也不能遺漏任何一個數(shù)。這種既不重復(fù)也不遺漏地抓取一堆數(shù)字中的每個數(shù)字的過程稱為遍歷。
(2) 組織基本數(shù)據(jù)結(jié)構(gòu)。要遍歷一堆數(shù)字,首先要設(shè)計一個數(shù)據(jù)結(jié)構(gòu),將這堆數(shù)字保存起來,并且使得程序能方便地遍歷它們,這樣才能把這些數(shù)字一個個加起來。對于這個問題,最簡單的數(shù)據(jù)結(jié)構(gòu)就是用一個列表結(jié)構(gòu)把這堆數(shù)字存儲起來。
例如,在下面所列的Python程序遍歷加起來中就有一個列表結(jié)構(gòu)在程序中用變量L表示其中存儲了需要相加的5個數(shù)字 [100,-100, 2, 10, 8]。Python語言用[ ]來表示列表結(jié)構(gòu),其中所保存的對象被稱為元素,列表就是個有序的元素集合。這種列表結(jié)構(gòu)非常有用,本書會對其做詳細介紹。我們的程序可以用一種十分簡單的方式獲取列表中的任意元素。我們用L[索引]來代表列表L中任意位置的元素。Python中的序列編號都是從0開始,那么L[0]代表了列表的第一個元素,在此例中就是數(shù)字100。以此類推,L[1]指向L中的第二個元素-100。L[2]指向第三個元素2,L[3]指向10, L[4]指向8。有了數(shù)據(jù)結(jié)構(gòu)后,我們的程序就可以累加列表L中的所有數(shù)字。
(3) 構(gòu)建循環(huán)計算。Python程序遍歷加起來用for語句做循環(huán)計算,把列表L里的元素一一累加到變量Sum里。這個Sum變量稱為累積變量,重點是累積變量的初始值要設(shè)為0,并且必須在循環(huán)開始執(zhí)行之前完成初始賦值,也就是Sum=0。
我們在Python程序遍歷加起來中還定義了一個add_all (L)函數(shù)。Python語言用def這個關(guān)鍵字來定義一個函數(shù),在此稱為add_all (L)函數(shù),括號中間的變量會傳入函數(shù)中,此變量稱為參數(shù)。函數(shù)可以說是部分的程序,也就是說,一個程序可以由多個函數(shù)組成。所以編寫程序的本質(zhì),其實就是將原來的問題分解為多個小問題,再編寫函數(shù)來解決這些小問題。本程序很簡單,只有一個函數(shù)add_all(L),作用是將所傳參數(shù)L中的所有元素加起來,最后將其總和Sum作為返回值返回(用return關(guān)鍵字返回)。 函數(shù)print()是Python固有的函數(shù),功能是把print括號中的結(jié)果在屏幕上顯示出來。至此,各位讀者只需大概了解編程即可,詳細的解釋請閱讀本書前兩章。
#遍歷加起來行首是符號#,代表這行是注釋
L=[100,-100, 2,10, 8]
def add_all(L):
Sum=0
for e in L:
Sum=Sum e
return Sum
print(add_all(L))
相同的計算思維和方式,也可以應(yīng)用到其他問題上。再舉例說明。
問題描述: 在一堆的數(shù)字中,找到其中的最小值。
下面是Python的程序遍歷找最小值。Min變量作為累積變量,它的初始值設(shè)為L[0]。然后Min與L中所有的元素一個個地比較,一旦找到比當前Min小的值就將Min賦值為新的數(shù)。遍歷結(jié)束后,Min必定保存L中最小的元素。
#遍歷找最小值
L=[100,-100, 2,10, 8]
def find_min(L):
Min=L[0]
for e in L:
if e Min: Min=e
return Min
本書第二個特點是強調(diào)遞歸求解的思維。
作者有30多年的編程經(jīng)驗、20多年的教學經(jīng)驗,深以為所有同學一定要盡早熟悉遞歸求解的思維方式。遞歸求解的方式是將大問題分解成同質(zhì)的小問題,大問題的解決是由這些小問題的解決構(gòu)建而成的。大問題與小問題是同質(zhì)關(guān)系,都是用相同函數(shù)的代碼來解決,只是參數(shù)不同罷了,所以解決大問題時的函數(shù)(有較大的參數(shù))會調(diào)用同名稱的函數(shù)(有較小的參數(shù)),這種方式稱為遞歸求解。目前,市面上很少有書強調(diào)遞歸求解。本書再三強調(diào)遞歸求解思維的重要性,在第4~6章中展示并解釋了大量的例子來讓讀者熟悉遞歸求解的思維。只有熟悉了遞歸思維后,讀者才會從一個編程的工匠升華成編程的藝術(shù)家,才會體會到這種解決問題思維的簡單、明晰和美麗。本書的第8章主要講解編程的核心算法,其內(nèi)容全部基于遞歸求解的思維。讀者一定要與遞歸求解思維成為好朋友,而作為好朋友的唯一方式就是要多親近它、理解它、熟悉它。
許多同學學習編程時,沒有熟悉遞歸求解的思維方式,所以編程的水平很難上一個臺階。多年以來,看到許多要畢業(yè)的學生如此,許多研究生也是如此,我很難過。我覺得是我們這些老師的錯。可能很多教編程的老師自己都不熟悉遞歸求解的思維,這不是誤人子弟嗎?
我用前面的例子將列表中的所有數(shù)加起來為例,讓讀者初步體會下遞歸求解的思維方式。
遞歸求解的思維方式: L中元素的總和等于第一個元素(L[0]) 加上 L剩下元素的總和,見Python程序遞歸加起來。是不是很簡單?定義一個函數(shù)add_r1(L),其返回值是L中所有元素的總和。這個總和就是L[0] add_r1(L[1:]),其中L[1:]代表L從L[1]開始到最后元素的列表。所以這個新的列表參數(shù)比較小,比原來的L少了第一個元素,重新調(diào)用add_r1()函數(shù)。每一次調(diào)用,參數(shù)都會減少一個,一直到只剩下一個,則傳回這個值。我們用len(L)(Python的固有函數(shù))來檢查參數(shù)列表的長度。所謂遞歸,是指函數(shù)內(nèi)調(diào)用函數(shù)自身的方式(參數(shù)不同)。所以我們要算L的總和,遞歸的方式是算L[去掉第一個元素]的總和加上L[0]。這是多么簡單易懂的方式!
#遞歸加起來
def add_r1(L):
if len(L)==1: return L[0]
return L[0] add_r1(L[1:])
將大問題分解成小問題的方式有很多種。我們也可以用另外一種遞歸方式來求解二分合并法。先將L分成兩部分,再將返回值合并起來。所以對L求總和,就等于L[前半部]的總和加上L[后半部]的總和。在下面的Python程序遞歸二分求和法中,L[0:len(L)//2]代表L的前半部列表,L[len(L)//2:]代表L的后半部列表。這個程序與前面的程序都是用遞歸思維來求解的。而這個程序的好處在于,在多核的情況下,求L前半部的總和與求L后半部的總和可以并行計算。
#遞歸二分求和法
def add_r2(L):
if len(L)==1: return L[0]
return add_r2(L[0:len(L)//2]) add_r2(L[len(L)//2:])
本書的第三個特點是以簡潔的方式使讀者熟練掌握Python語言。
Python語言已經(jīng)成為世界上軟件工程師們使用最多的語言之一。市面上有不少學習Python語言的書,但是許多都過于煩瑣。本書整理出Python語言最重要的知識點,讓讀者在最短的時間熟悉Python語言的編程。第3章深談Python函數(shù)、數(shù)據(jù)類型、輸入輸出和文件讀寫等重要知識,以及容易犯的錯誤。第7章講解Python的面向?qū)ο蟮木幊趟季S和技巧,同時講授小烏龜畫圖的技巧。通過本書的學習,讀者會自然而然地熟悉Python語言的編程,將來也更容易學習其他語言的編程,例如C、C 、Java等。
本書的第四個特點是講解了大量的實例。第1、2章展示了許多基本的編程例子和循環(huán)計算的例子。第3章針對Python語言的特性,講解了大量例子和作者的Python使用經(jīng)驗。第4章展示了許多基本遞歸求解的例子。第5章講解了比較復(fù)雜的各類遞歸求解的例子,其中包含二分法、求最大公因數(shù)、線性方程組求解、排序和排列組合求解等問題。第6章智能是計算出來的中的許多例子非常有趣,都是展示計算機是如何表現(xiàn)出智能的,其中包括小老鼠走迷宮、過河問題、AB猜數(shù)字游戲、24點游戲、最后拿牌就輸?shù)戎悄苡螒颍@些編程的例子展示出機器智能是如何被計算出來、如何能戰(zhàn)勝大多數(shù)玩家的。第7章講解面向?qū)ο缶幊痰乃悸罚故拘觚敭媹D的技巧,其中有大量畫圖和動畫的例子。第8章講解編程的核心深搜方式,重點在于不能產(chǎn)生無限循環(huán)的搜索。所謂過河問題,是指在河的一邊有一些東西,彼此可能相克
沙行勉 (Edwin Sha),博士生導(dǎo)師,2000年起任美國終身制正教授 (Full Professor),中國國家千人計劃(A類)特聘專家,長江學者講座教授,海外杰出青年學者。于1986年獲得臺灣大學計算機科學系學士學位,在海軍陸戰(zhàn)隊服役兩年后赴美國普林斯頓大學(Princeton University)就讀。于1991年和1992年分別獲美國普林斯頓大學計算機科學系碩士學位和博士學位。1992年起任教于美國圣母大學(University of Notre Dame)計算機科學與工程系,并于1995年起擔任該系副系主任和研究生部主任。2000年起作為終身制正教授任教于美國得克薩斯州大學達拉斯分校(UTD)計算機科學系,2001年曾擔任計算機科學部主任。任上海交通大學、山東大學、北京航空航天大學、湖南大學等客座、兼任教授或博導(dǎo)。2008年被評為海外杰出青年學者。2010年起任教育部長江學者講座教授。2011年起任國家千人計劃特聘專家,20122017年任重慶大學國家特聘教授和計算機學院院長。現(xiàn)全職任上海華東師范大學終身特聘教授。
至2017年,已在相關(guān)國際學術(shù)會議及國際核心期刊上發(fā)表英文學術(shù)論文400余篇, 其中包括60余篇IEEE和ACM Transactions期刊論文。共獲各類國家級教學、科研獎項近40項,其中包括: 美國Oak Ridge 大學聯(lián)盟頒發(fā)的杰出青年教授獎,美國國家科學基金頒發(fā)的杰出學術(shù)發(fā)展獎, 美國圣母大學頒發(fā)的杰出教學獎,世界頂級期刊ACM Transactions(ACM TODAES)頒發(fā)的2011年度最佳論文獎,以及IEEE Transactions on Computers頒發(fā)的2016年度代表論文等。多次以大會主席身份主持國際重要學術(shù)會議。沙教授在教學方面深受中美學生的喜愛,例如,在美國從教期間,他在每學期由學生給老師打分的教學評鑒中都得到高分。沙行勉教授喜愛中國傳統(tǒng)文化及儒釋道哲學,以人才培養(yǎng)、教學育人為其終身的興趣及志向。
目錄
第1章初探編程之境
1.1計算機編程的基本概念
1.1.1編程如何解決問題
1.1.2解決雞兔同籠問題的編程思維
1.1.3解決排序與合并問題的編程思維
1.1.4解決過河問題的編程思維
1.1.5程序的基本要素
1.2乘Python之舟進入計算機語言的世界
1.2.1什么是Python
1.2.2如何在Windows中使用Python
1.3解釋a=a 3
1.3.1介紹變量
1.3.2關(guān)于a=a 3
1.3.3常用算術(shù)運算符
1.4介紹數(shù)據(jù)類型
1.4.1布爾類型
1.4.2列表
1.4.3字符串
1.5學習Python的控制語句
1.5.1條件控制語句if語句
1.5.2循環(huán)控制語句for循環(huán)
1.5.3循環(huán)控制語句while循環(huán)
習題
第2章鞏固編程基礎(chǔ)
2.1再談Python的循環(huán)控制語句
2.1.1遍歷加積累的循環(huán)結(jié)構(gòu)
2.1.2以不同編程方式解決相同問題
2.1.3for與while循環(huán)的比較
2.1.4中國余數(shù)定理的循環(huán)實現(xiàn)
2.2函數(shù)的簡介
2.2.1什么是函數(shù)
2.2.2函數(shù)的創(chuàng)建與調(diào)用
2.2.3幾種常用的內(nèi)置函數(shù)
2.3探討編程思路
2.3.1以多項式運算為例
2.3.2編程思路的總結(jié)
2.4討論循環(huán)中的一些技巧
2.4.1討論for i in range():結(jié)構(gòu)
2.4.2討論for e in L:結(jié)構(gòu),L為一個列表
2.5活學活用運行Python解決問題
2.5.1幾種簡單的排序算法及衍生問題
2.5.2二進制、十進制等進制之間的轉(zhuǎn)換問題
2.5.3撲克牌游戲21點
2.5.4老虎機游戲
習題
第3章深談Python函數(shù)、變量與輸入輸出
3.1深入了解函數(shù)的各種性質(zhì)
3.1.1編寫完美函數(shù)
3.1.2參數(shù)與返回值
3.1.3局部變量與全局變量
3.1.4嵌套函數(shù)
3.1.5參數(shù)類型
3.2再談序列與字典數(shù)據(jù)類型
3.2.1列表與元組
3.2.2字符串
3.2.3字典
3.3關(guān)于Python數(shù)據(jù)類型的注意事項
3.3.1可變與不可變類型的討論
3.3.2參數(shù)的傳遞問題
3.3.3默認參數(shù)的傳遞問題(可選)
3.4深入探討列表的常用操作與開銷
3.4.1添加列表元素的討論
3.4.2刪除列表元素的討論
3.4.3生成列表的一些技巧
3.5輸入輸出、文件操作與異常處理
3.5.1輸入
3.5.2輸出
3.5.3文件操作
3.5.4異常處理
習題
第4章探究遞歸求解的思維方式
4.1理解遞歸求解的思維方式
4.1.1遞歸的基本思路
4.1.2遞歸求解的例子
4.2用遞歸方式重溫例題
4.2.1遞歸實現(xiàn)數(shù)列求和
4.2.2遞歸實現(xiàn)歸并
4.2.3遞歸求解因數(shù)分解
4.3list、string內(nèi)置函數(shù)的非遞歸與遞歸實現(xiàn)
4.3.1列表內(nèi)置函數(shù)的實現(xiàn)
4.3.2字符串內(nèi)置函數(shù)的實現(xiàn)
4.4四種不同的遞歸方式來解決排序問題
4.4.1選擇排序
4.4.2插入排序
4.4.3快速排序
4.4.4歸并排序
4.4.5四種排序方式的比較
習題
第5章熟練遞歸編程
5.1二分法求解問題
5.1.1什么是二分法
5.1.2在有序序列中使用二分法查找元素位置
5.1.3求解算術(shù)平方根
5.2求兩個數(shù)的最大公因數(shù)
5.2.1因數(shù)分解法求最大公因數(shù)
5.2.2歐幾里得算法求最大公因數(shù)
5.2.3討論因數(shù)分解法與歐幾里得算法的優(yōu)劣
5.3中國余數(shù)定理問題
5.3.1介紹相關(guān)的基礎(chǔ)知識
5.3.2中國余數(shù)定理問題的求解
5.4關(guān)于遞歸函數(shù)開銷的討論
5.4.1函數(shù)調(diào)用的開銷
5.4.2參數(shù)傳遞過程中的開銷
5.4.3重復(fù)計算的開銷
5.5用遞歸思維解決線性方程組問題
5.6用各種編程方式解決排列問題
5.6.1全排列問題
5.6.2通用排列問題
5.7用各種編程方式解決組合問題
5.7.1在排列問題的解法上解決組合問題(解法一)
5.7.2非遞歸方式解決組合問題(解法二)
5.7.3特殊二分方式解決組合問題(解法三)
5.7.4循環(huán)遞歸方式解決組合問題(解法四)
習題
第6章智能是計算出來的
6.1老鼠走迷宮問題
6.2菜雞狼過河問題
6.3AB猜數(shù)字游戲
6.424點游戲
6.5最后拿牌就輸
習題
第7章面向?qū)ο缶幊膛c小烏龜畫圖
7.1初識面向?qū)ο缶幊?br />
7.1.1什么是對象
7.1.2體會面向?qū)ο缶幊痰膬?yōu)勢
7.2面向?qū)ο笾械母拍?br />
7.2.1類與對象
7.2.2Python中的__init__()方法
7.2.3self變量和pass關(guān)鍵字
7.2.4Python中公有和私有類型的定義方式
7.3了解面向?qū)ο蟮娜筇匦?br />
7.3.1封裝
7.3.2繼承
7.3.3多態(tài)
7.4初識小烏龜
7.4.1小烏龜?shù)膶傩?br />
7.4.2基本圖形的繪制
7.4.3遞歸圖形的繪制
7.5多個小烏龜?shù)膭訄D繪制
7.5.1過河游戲
7.5.2小老鼠走迷宮
習題
第8章掌握編程的精華算法
8.1深入淺出之算法
8.1.1算法時間復(fù)雜度分析
8.1.2圖的基本介紹
8.2深度優(yōu)先搜索
8.2.1何為深搜
8.2.2圖的深搜
8.2.3拓撲排序問題
8.2.4一個有趣的迷宮例子
8.3最短路徑問題
8.3.1有向無環(huán)圖的最短路徑問題
8.3.2權(quán)值非負的有環(huán)圖的最短路徑問題
8.4動態(tài)規(guī)劃算法
8.4.1攔截導(dǎo)彈問題
8.4.2背包問題
8.4.3最短路徑問題
習題
參考文獻