計算機科學家眼中Python程序之道

      網友投稿 938 2022-05-29

      計算機科的思考方式綜合了數學、工程學以及自然科學的一些最優秀的特性。計算機科學家與數學家類似,他們使用形式語言來描述理念(特別是計算);與工程師類似,他們設計產品,將元件組裝成系統,對不同的方案進行評估選擇;與自然科學家類似,他們觀察復雜系統的行為,構建科學假說,并檢驗其預測。

      作為計算機科學家,最重要的技能就是問題求解。問題求解是發現問題、創造性地思考解決方案以及清晰準確地表達解決方案的能力。實踐證明,學習編程的過程,正是訓練問題求解能力的絕佳機會。

      1 什么是程序

      程序是指一組定義如何進行計算的指令的集合。這種計算可能是數學計算,如解方程組或者查找多項式的根,也可以是符號運算,如搜索和替換文檔中的文本,或者圖形相關的操作,如處理圖像或播放視頻。

      在不同的編程語言中,程序的細節有所不同,但幾乎所有編程語言中都會出現以下幾類基本指令。

      輸入:從鍵盤、文件或者其他設備中獲取數據。

      輸出:將數據顯示到屏幕,保存到文件中,或者發送到網絡上等。

      數學:進行基本數學操作,如加法或乘法。

      條件執行:檢查某種條件的狀態,并執行相應的代碼。

      重復:重復執行某種動作,往往在重復中有一些變化。

      信不信由你,這差不多就是全部了。你所遇到過的所有程序,無論多么復雜,都是由類似上面的這些指令組成的。所以我們可以把編程看作一個將大而復雜的任務分解為更小的子任務的過程,不斷分解,直到任務簡單到足以由上面的這些基本指令組合完成。

      2 運行Python

      Python入門的挑戰之一在于你可能需要自己在電腦上安裝Python及相關軟件。如果你熟悉自己的操作系統,而且習慣于命令行界面,那么安裝Python不是什么問題。但對于初學者來說,同時學習編程和系統管理命令兩件事,有時候是非常痛苦的。

      為了避免這個問題,我推薦你開始先在瀏覽器中運行Python,等熟悉了Python語言之后,我再向你介紹如何在電腦上安裝Python。

      用于運行Python的網站有不少。如果你已經找到一個喜歡的,就可以直接去用。如果沒有,我推薦PythonAnywhere。我在http://tinyurl.com/thinkpython2e上提供了詳細的入門指導。

      有兩個版本的Python,分別為Python 2和Python 3。它們很類似,所以如果你學會了一個版本,也能很容易地切換到另一個版本。實際上,作為初學者,你會遇到的兩者之間的區別非常少。本書是針對Python 3編寫的,但我也會給出一些關于Python 2的注意事項。

      Python解釋器是一個讀取并執行Python代碼的程序。根據所在環境的不同,你可能需要點擊程序圖標,或者在命令行中鍵入python命令來啟動解釋器。當它啟動以后,可以看到如下輸出:

      Python?3.4.0?(default,?Jun?19?2015,?14:20:21) [GCC?4.8.2]?on?linuxType?"help",?"copyright",?"credits"?or?"license"?for?more?information. >>>

      前3行文本包含了解釋器和所運行的操作系統的信息,所以可能與你看到的有些區別。但你應當檢查版本號是否以3開頭(本例所示的是3.4.0),表示你使用的是Python 3的解釋器。如果版本號以2開頭,那么(你肯定猜到了)解釋器是Python 2。

      最后一行是一個提示符,表明解釋器已經準備好,等待你鍵入代碼。如果你鍵入一行代碼并按下Enter鍵,解釋器會顯示結果:

      >>>?1?+?12

      3 第一個程序

      依照傳統,用新語言編寫的第一個程序叫“Hello, World!”,因為這個程序所做的事情就是只顯示“Hello, World!”。在Python中,它是這個樣子:

      >>>?print('Hello,?World!')

      這是print語句的一個示例。print并不會真往紙上打印文字,而是在屏幕上顯示結果。在這個例子中,輸出的結果是:

      Hello,?World!

      程序中的引號表示要顯示的文本的開始和結束,在輸出結果中它們并不顯示。

      括號表示print是一個函數。我們將在第3章中討論函數。

      在Python 2中,print語句略有不同。它不是一個函數,所以不使用括號:

      >>>?print?'Hello,?World!'

      這個區別的意義在后面會慢慢顯現,但現在只需要知曉就足夠了。

      4 算術操作符

      介紹完“Hello, World”之后,接下來是算術操作。Python提供了操作符,即像加號或減號這樣的用來表達計算操作的特殊符號。

      操作符+、-和*分別表示進行加法、減法和乘法運算,如下面示例所示:

      >>>?40?+?242>>>?43?–?142>>>?6?*?742

      操作符/表示除法運算:

      >>>?84?/?242.0

      這里你可能會奇怪為什么結果是42.0而不是42。我會在下一節解釋。

      最后,操作符**表示進行指數運算。也就是說,會把一個數按指數進行乘方:

      >>>?6**2?+?642

      在其他一些語言中,指數操作用^符號表示,但在Python中^這個符號已經用來表示二進制按位運算XOR了。如果你不熟悉按位運算,結果可能會讓你感到奇怪:

      >>>?6?^?24

      本書我不會討論按位操作符,但讀者可以在http://wiki.python.org/moin/BitwiseOperator上閱讀相關文檔。

      5 值和類型

      值(value)是程序操作的最基本的東西,如一個字母或者數字。前面我們見過一些值,如2、42``.0以及'Hello,World!'。

      這些值屬于不同的類型(type):2是整型(integer)的,42``.0是浮點型(floating-point)的,而'Hello,World!'是字符串(string)類型的,這么稱呼是因為它是由一堆字母“串連”起來的。

      如果不確認一個值的類型,解釋器可以告訴你:

      >>>?type(2) >>>?type(42.0) >>>?type('Hello,?World!')

      在這些結果中,單詞“class”(類)被用于某一類型中,這是一種值類型。

      不足為奇,整數屬于'int'類型, 字符串屬于'str'類型,而浮點數屬于'float'類型。

      那么'2'和'42.0'這樣的值呢?它們看起來像是數字,但又使用字符串常用的引號括起來:

      >>>?type('2') >>>?type('42.0')

      它們是字符串。

      當輸入一個很大的數字時,你可能會忍不住想在數字中間加上逗號,就像1,000,000這樣。在Python中這并不是合法的整數,但它湊巧又是一個合法的表達式:

      >>>?1,000,000(1,?0,?0)

      當然,這和我們預期的完全不同!Python把1,000,000解釋成一個用逗號分隔的整數序列。關于這種序列在本書后面可以學到更多內容。

      6 形式語言和自然語言

      自然語言是指人們所說的語言,如英語、西班牙語和法語。它們不是由人設計而來的(雖然人們會嘗試加以語法限制),而是自然演化而來的。

      形式語言則是人們為了特殊用途設計的語言。例如,數學上使用的符號體系是一種特別擅于表示數字和符號之間關系的形式語言;化學家則使用另一種形式語言來表示分子的化學結構。而最重要的是:

      編程語言是人們為了表達計算過程而設計出來的形式語言。

      形式語言傾向于對語法做出嚴格的限制。例如,3 + 3 = 6是語法正確的數學表達式,但3+ = 3則不是。H2O是語法正確的化學方程式,而2Zz則不是。

      語法規則有兩種,分別適用于記號(token)和結構(structure)。記號是語言的基本元素,如詞、數字和化學元素。3+ = 3的一個問題就是$在數學表達式中(至少就我所知)不是合法記號。相似地,2Zz不合法是因為并不存在縮寫為Zz的化學元素。

      第二種語法規則指定記號所組合的方式。數學等式3+ = 3不合法,因為雖然+和=是合法記號,但不能將它們連續放置。相似地,在化學表達式里,下標數字應該出現在元素名稱之后,而不是之前。

      “This is @ well-structured Engli$h sentence with invalid t*kens in it.”是一個結構良好,但包含非法記號的英語語句。“This sentence all valid tokens has, but invalid structure with.”這句話所有的記號都合法,但是語句結構不合法。

      當你閱讀英語的句子或形式語言的語句時,需要弄清句子的結構是什么(雖然在自然語言中這個過程是下意識完成的)。這個過程稱為語法分析。

      雖然形式語言和自然語言有很多共同的特點—記號、結構、語法以及語義,但它們也有一些區別。

      歧義性:自然語言充滿了歧義,人們通過上下文線索和其他信息來處理這些歧義。形式語言通常設計為幾乎或者完全沒有歧義,即不論上下文環境如何,任何表達式都只有一個含義。

      冗余性:為了彌補歧義,減少誤解,自然語言采用大量的冗余。因此,自然語言往往很啰嗦。形式語言則相對不那么冗余,更加簡潔。

      字面性:自然語言充滿了習慣用語和比喻。例如,有人說,“硬幣掉了”(The penny dropped[1]),并不一定是硬幣,也不一定是有什么掉了。形式語言則嚴格按照它的字面意思表達含義。

      因為我們都說著自然語言長大,有時候很難適應形式語言。在某種意義上,形式語言和自然語言的區別與詩詞和散文的區別類似,而且程度更甚。

      詩詞:字詞的使用,既考慮它們的音韻,也考慮到它們的意義,而整首詩合起來表達某種意境或情緒反應。歧義不僅常見,而且常常是刻意為之。

      散文:字詞的意義更加重要,而且句子的結構也提供更多的意義。散文比詩詞更容易分析,但仍然有不少歧義。

      程序:計算機程序的意義不含歧義,直接如字面所指。完全可以通過它的記號和結構理解其意義。

      形式語言的密度遠遠大于自然語言,所以閱讀起來需要花費更多的時間。還有,結構非常重要,所以直接自頂向下、從左至右的閱讀順序并不一定是最好的。相反,要試著學會在頭腦中解析程序,辨別出記號并解析出結構。最后,細節很重要。在自然語言中常常可以忽略的小錯誤,如拼寫錯誤或者標點符號錯誤,在形式語言中往往會造成很大的差別。

      7 調試

      程序是很容易出錯的。因為某種古怪的原因,程序錯誤被稱為bug,而查捕bug的過程稱為調試(debugging)。

      一個程序中可能出現3種類型的錯誤:語法錯誤、運行時錯誤和語義錯誤。對它們加以區分,可以更快地找到錯誤。

      編程,特別是調試,有時候會引發強烈的情緒。如果你掙扎于一個困難的bug,可能會感覺到憤怒、沮喪以及窘迫。

      有證據表明,人們會像對待人一樣對待電腦。當電腦良好完成工作時,我們會把它們當作隊友,而當它們難以控制、粗暴無禮的時候,我們會按照對待那些粗暴固執的人一樣對待它們(The Media Equation: How People Treat Computers, Television, and New Media Like Real People and Places,Reeves和Nass著)。

      對這些反應行為有所準備,可能會幫助你更好地對待電腦。一種方法是把它當作你的雇員,它有一定的長處,如速度和精度,也有特定的弱點,如沒有同情心和無法顧全大局。

      計算機科學家眼中的Python程序之道

      你的任務是做一個好經理:設法揚長避短,并找到方法控制你的情緒去面對問題,而不是讓你的反應影響工作效率。

      學習調試可能會帶來挫折感,但它是一個有價值的技能,并在編程之外還有很多用途。每章的結尾處都有一節類似于本節的關于調試技巧的討論。希望它們能帶來幫助!

      8 術語表

      問題求解(problem solving):總結問題、尋找解決方案以及表達解決方案的過程。

      高級語言(high-level language):設計來方便人們讀寫的編程語言,如Python。

      低級語言(low-level language):設計來方便計算機執行的編程語言,也被稱為“機器語言”或“匯編語言”。

      可移植性(portability):程序的一種屬性:可以在多種類型的計算機上運行。

      解釋器(interpreter):一個讀取其他程序并執行其內容的程序。

      提示符(prompt):解釋器顯示的文字,提示用戶已經準備好接收用戶的輸入。

      程序(program):一系列代碼指令的集合,指定一種運算。

      print語句(print statement):一個指令,可以通知Python解釋器在屏幕上顯示一個值。

      操作符(operator):一種特殊符號,用來表達加法、乘法或字符串拼接等簡單運算。

      值(value):程序操作的數據基本單位,如一個數字或一個字符串。

      類型(type):值的類別。到目前為止我們已經見過的類型有整數(int)、浮點數(float)和字符串(str)。

      整型(integer):用來表示整數的類型。

      浮點型(floating-point):用來表示帶小數部分的數的類型。

      字符串(string):用來表示一串字符的類型。

      自然語言(natural language):自然演化而來的人們所說的語言。

      形式語言(formal language):人們設計為某些特定目的(如表達數學概念或者計算機程序)設計的任何一種語言。所有編程語言都屬于形式語言。

      記號(token):程序的語法結構的最基本單位,類似于自然語言中的詞。

      語法(syntax):用于控制程序結構的規則。

      語法分析(parse):檢查程序并分析其語法結構。

      bug:程序中的錯誤。

      調試(debugging):發現和糾正bug的過程。

      [1]  “The penny dropped”在英語里的意思是:經過一段困惑后,突然理解了某個事情。——譯者注

      本文節選自《像計算機科學家一樣思考Python(第2版)?》

      內容簡介

      在學習和研究機器學習的時候,面臨令人眼花繚亂的算法,機器學習新手往往會不知所措。本書從算法和Python語言實現的角度,幫助讀者認識機器學習。

      本書專注于兩類核心的“算法族”,即懲罰線性回歸和集成方法,并通過代碼實例來展示所討論的算法的使用原則。全書共分為7章,詳細討論了預測模型的兩類核心算法、預測模型的構建、懲罰線性回歸和集成方法的具體應用和實現。

      本書主要針對想提高機器學習技能的Python開發人員,幫助他們解決某一特定的項目或是提升相關的技能。

      本文僅用于學習和交流目的,不代表異步社區觀點。非商業轉載請注明作譯者、出處,并保留本文的原始鏈接。

      本文轉載自異步社區。

      軟件開發 編程語言 python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:SpringCloud系列:億級流量系統架構之如何設計承載百億流量的高性能架構【石杉的架構筆記】
      下一篇:Netty基礎必備知識,ByteBuffer和ByteBuf底層原理
      相關文章
      久久久久久亚洲精品中文字幕| 亚洲日韩亚洲另类激情文学| 亚洲av永久无码精品网址| 亚洲国产精品福利片在线观看| 亚洲福利精品电影在线观看| 久久久久久久久无码精品亚洲日韩| 亚洲精品精华液一区二区| 国产亚洲玖玖玖在线观看| 亚洲精品中文字幕无码AV| 亚洲av最新在线网址| 久久国产亚洲电影天堂| 国产午夜亚洲不卡| 国产亚洲老熟女视频| 亚洲线精品一区二区三区影音先锋 | 亚洲人配人种jizz| 亚洲人xxx日本人18| 亚洲最大天堂无码精品区| 亚洲日本乱码卡2卡3卡新区| 亚洲中文字幕无码爆乳| 亚洲AⅤ男人的天堂在线观看| 国产亚洲视频在线观看| 爱情岛论坛网亚洲品质自拍| 91麻豆国产自产在线观看亚洲| 亚洲精品自产拍在线观看| 无码乱人伦一区二区亚洲一| 亚洲酒色1314狠狠做| 国产精品亚洲四区在线观看| 亚洲精品精华液一区二区| 99亚洲乱人伦aⅴ精品| 国产偷国产偷亚洲高清日韩| 亚洲国产精品无码专区影院| 久久亚洲私人国产精品vA| 亚洲va成无码人在线观看| 亚洲欧美日韩综合久久久久 | 精品亚洲永久免费精品| 久久久久久久亚洲Av无码 | 亚洲剧场午夜在线观看| 亚洲www77777| 亚洲成av人片在线观看天堂无码 | 国产精品亚洲一区二区三区在线| 日韩精品一区二区亚洲AV观看|