申明: 本站飛宇網 https://feiyetopro.blogspot.com/。自網路收集整理之書籍、文章、影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]。謝謝!
第3章 成為高手前必須知道的一些基礎知識
3.1 變數
在改進小遊戲之前,有些必須掌握的知識需要來講解一下。
當你把一個值賦值給一個名字時,它會存儲在記憶體中,把這塊記憶體稱為變數(variable)。在大多數語言中,都把這種行為稱為“給變數賦值”或“把值存儲在變數中”。
不過,Python與大多數其他電腦語言的做法稍有不同,它並不是把值存儲在變數中,而更像是把名字“貼”在值的上邊。所以有些Python程式師會說Python沒有變數,只有名字。變數就是一個名字,通過這個名字,可以找到我們想到的東西。
看個例子:
變數為什麼不叫“恒量”而叫變數?正是因為它是可變的!再看另一個例子:
上面的例子先創建一個變數,名字叫x,給它初始化賦值為3,然後又給它賦值為5(此時3就被5替換掉),接下來創建另外一個變數y,並初始化賦值為8,最後創建第三個變數z,它的值是變數x和y的和。
同樣的方式也可以運用到字串中:
這種字串加字串的語法,在Python裡稱為字串的拼接。
需要注意的地方:
在使用變數之前,需要對其先賦值。
變數名可以包括字母、數位、底線,但變數名不能以數字開頭,這跟大多數高階語言一樣——受C語言影響,或者說Python這門語言本身就是由C語言寫出來的。
字母可以是大寫或小寫,但大小寫是不同的。也就是說,fishc和FishC對於Python來說是完全不同的兩個名字。
等號(=)是賦值的意思,左邊是名字,右邊是值,不可寫反了。
變數的命名理論上可以取任何合法的名字,但作為一個優秀的程式師,請儘量給變數取一個專業一點兒的名字。
3.2 字串
到目前為止,我們所認知的字串就是引號內的一切東西,我們也把字串叫作文本,文本和數位是截然不同的。
如果直接讓兩個數字相加,那麼Python會直接將數字相加後的結果告訴你:
但是如果在數字的兩邊是加上了引號,就變成了字串的拼接,這正是引號帶來的差別:
要告訴Python你在創建一個字串,就要在字元兩邊加上引號,可以是單引號或者雙引號,Python表示在這一點上不挑剔。但必須成對,你不能一邊用單引號,另一邊卻花心地用上雙引號結尾,這樣Python就不知道你到底想幹嘛了:
這就有點像你一邊跟Python說我愛你,一邊卻摟著小C,所以,面對這麼完美的語言,我們不寫彆扭的語法!
那如果字串內容中需要出現單引號或雙引號怎麼辦?
像上邊這樣寫Python會誤會你的意思,從而產生錯誤。
有兩種方法。第一種比較常用,就是使用轉義符號(\)對字串中的引號進行轉義:
還有一種方法就是利用Python既可以用單引號也可以用雙引號表示字串這一特點,只要用上不同的引號表示字串,那麼Python就不會誤解你的意思啦。
3.3 原始字串
聽起來好像反斜線是一個好東西,但不妨試試列印C:\now:
列印結果並不是我們預期的,原因是反斜線(\)和後邊的字元(n)恰好轉義之後構成了分行符號(\n)。這時候有朋友可能會說:“用反斜線來轉義反斜線不就可以啦?”嗯,不錯,可以用反斜線對自身進行轉義:
但如果對於一個字串中有很多個反斜線,我們就不樂意了。畢竟,這不僅是一個苦差事,還可能使代碼變得混亂。
不過大家也不用怕,因為在Python中有一個快捷的方法,就是使用原始字串。原始字串的使用非常簡單,只需要在字串前邊加一個英文字母r即可:
在使用字串時需要注意的一點是:無論是否原始字串,都不能以反斜線作為結尾(注:反斜線放在字串的末尾表示該字串還沒有結束,換行繼續的意思,下一節會講這個內容)。如果你堅持這樣做就會報錯:
大家不妨考慮一下:如果非要在字串的結尾加個反斜線,有什麼辦法可以靈活實現嗎?
3.4 長字串
如果希望得到一個跨越多行的字串,例如:
從明天起,做一個幸福的人
喂馬,劈柴,周遊世界
從明天起,關心糧食和蔬菜
我有一所房子,面朝大海,春暖花開
從明天起,和每一個親人通信
告訴他們我的幸福
那幸福的閃電告訴我的
我將告訴每一個人
給每一條河每一座山取一個溫暖的名字
陌生人,我也為你祝福
願你有一個燦爛的前程
願你有情人終成眷屬
願你在塵世獲得幸福
我只願面朝大海,春暖花開
嗯,看得出這是一首非常有文采的詩,那如果要把這首詩列印出來,用學過的知識,就不得不使用多個分行符號:
如果行數非常多,又會給我們帶來不小的困擾了……好在Python總是設身處地地為我們著想——只需要使用三重引號字串("""內容""")就可以輕鬆解決問題:
最後需要提醒大家的是,程式設計的時候,時刻要注意Speak English!初學者最容易犯的錯誤(沒有之一)就是誤用了中文的標點符號。切記:程式設計中使用的標點符號都是英文的!
3.5 改進我們的小遊戲
不得不承認,之前的小遊戲真的是太簡單了。有很多朋友為此提出了不少的建議,小甲魚做了一下總結,大概有以下幾個方面需要改進:
(1)當使用者猜錯的時候程式應該給點提示,比如告訴用戶當然輸入的值比答案是大了還是小了。
(2)每運行一次程式只能猜一次,應該提供多次機會給用戶猜測,至少要三次嘛,人非聖賢,孰能一擊即中,你說是吧?!
(3)每次運行程式,答案可以是隨機的。因為程式答案固定,容易導致答案外泄,比如小紅玩了之後知道正確答案是8,就可能會把結果告訴小明,小明又會亂說。所以希望遊戲的答案可以是隨機的。
這些挑戰對於如此聰明的讀者來說一定不成問題,讓我們抄起傢伙(Python)一個個來解決掉!
3.6 條件分支
第一個改進要求:當使用者猜錯的時候程式應該給點提示,比如告訴用戶當然輸入的值比答案是大了還是小了。程式改進後(假如答案是8):
如果使用者輸入3,程式應該提示比答案小了。
如果使用者輸入9,程式應該提示比答案大了。
這就涉及一個比較的問題了,作為初學者,可能不大熟悉電腦是如何進行比較吧?但我想大家都一定認識大於號(>)、小於號(<)以及等於號(==)(注:在Python中,用兩個連續等號表示等於號,用單獨一個等號表示賦值,還記得吧?那不等於呢?嗯,不等於這個有點特殊,用感嘆號和一個等號搭配來表示)。
另外,還需要掌握Python的比較操作符有:
在IDLE中輸入兩個數以及比較操作符,Python會返回比較後的結果:
這裡1和3進行比較,判斷1是否小於3,在小於號左右分別留了一個空格,這不是必需的,但代碼量一多,看上去會美觀很多。Python是一個注重審美的程式設計語言,這就跟人一樣,人長得怎樣是天生的,一般無法改變,但人的氣質修養是可以從每個細小動作看出來的,人們說心靈美才是美,指的就是這一方面。程式也一樣,你可以不修邊幅、邋邋遢遢,只求不出錯誤,但別人閱讀你的代碼時很難受,他就不願跟你一起合作開發,要是你的代碼工整,注釋得當,遠遠看上去猶如大家之作,那結果肯定不用說啦!
大家還記得if-else吧?如果程式僅僅只是一個命令清單的話,那麼他只需要筆直地一條路走到黑,但至少覺得應該把程式設計得更聰明點——可以根據不同的條件執行不同的任務,這就是條件分支。
if 條件: 條件為真(True)執行的操作 else: 條件為假(False)執行的操作
那現在讓我們把第1個要求的代碼寫出來吧:
3.7 while迴圈
第1個要求實現了,可是用戶還不高興,他們會抱怨道:“為什麼我要不停地重新運行你這個程式呢?難道你不能每次運行多給幾次輸入的機會嗎?”(我們這個程式還好,幾次嘗試就可以成功了,但如果範圍擴大為1~100,那麼嘗試的次數就要隨之增加,總讓使用者不斷地重新打開程式,這種程式的體驗未免就太差了哈!)
第2個改進要求:程式應該提供多次機會給用戶猜測,專業點來講就是程式需要重複運行某些代碼。
下面介紹Python的while迴圈語法。
while 條件: 條件為真(True)執行的操作
非常簡單,對吧?Python一向就是這麼簡單,那一起來修改代碼吧:
聰明的讀者可能已經發現了,這麼改的話,程式的意思是只有使用者輸入正確的數字迴圈才能結束。這好像跟我們的第2個要求有點不同了,所以大家不妨邊思考邊動手,看怎麼改才是正確的。
給大家一點提示,大家思考一下如何修改,這裡我給大家的提示是:使用and邏輯操作符。Python的邏輯操作符可以將任意運算式連接在一起,並得到一個布林類型的值。布林類型只有兩個值:True和False,就是真與假,來看下面的例子:
很明顯,1>2這個條件是個偽命題,所以and的結果為假。用and邏輯操作符運行,只有當兩邊的條件均為真時,結果才能是True,否則為False,大家可以自己多做幾次實驗來證明。
3.8 引入外援
第3個改進要求:每次運行程式,答案是隨機的。需要怎麼實現呢?需要引入外援:random模組。
等等,模組這個名字怎麼那麼熟悉?
啊哈!想起來了,每次寫完程式的時候,都要按一下快速鍵F5運行,那裡就顯示著RUN MODULE,我們編寫的程式實際上就是一個模組,只是我們目前還沒有發覺。
那這個random module裡邊有一個函數叫作randint(),它會返回一個隨機的整數。可以利用這個函數來改造我們的遊戲:
3.9 閒聊資料類型
所謂閒聊,也稱為gossip,就是一點小事可以聊上半天。下麵就來聊一聊Python的資料類型。
在此之前,你可能已經聽說過,咱這個Python的變數是沒有類型的。對,沒錯,小甲魚也曾經說過,Python的變數更像是名字標籤,想貼哪兒就貼哪兒。通過這個標籤,就可以輕易找到變數在記憶體中對應的存放位置了。
但這絕不是說Python就沒有資料類型這回事。大家還記得'520'和520的區別嗎?
沒錯,帶了引號的,無論是雙引號還是單引號或者是三引號,都是字串;而不帶引號的,就是數字。字串相加叫作拼接,咳咳,不是拼爹,是拼接!數位相加就會得到兩個數字的和:
Python有很多重要的資料類型,不過這裡不會一下子全都扔給大家。因為一來你肯定一下子記不了那麼多;另外現在所要掌握的知識還不需要這麼多的資料類型來配合實現。所以,每個階段所學習的內容都是必要的,我們也只學習那些必要的內容。
Python的字串類型已經簡單講過,後邊還會對字串進行深入的探討,所以大家別吐槽小甲魚怎麼都是淺嘗輒止,沒有那回事兒!咱只是分階段逐步滲透,逐層進行消化,一下子說太深入,大家消化不了,教學也會變成純理論化(小甲魚知道死板的模式是大家最討厭的)。
今天來介紹一些Python的數數值型別又包含整型、浮點型、布林類型、複數類型等。
3.9.1 整型
整型說白了就是平時所見的整數,Python3的整型已經與長整型進行了無縫結合,現在的Python3的整型類似於Java的BigInteger類型,它的長度不受限制,如果說非要有個限制,那只限於電腦的虛擬記憶體總數。所以用Python3很容易進行大數計算。
3.9.2 浮點型
浮點型就是平時所說的小數,例如圓周率3.14是浮點型,例如地球到太陽的距離大約1.5億千米,也是浮點型。Python區分整型和浮點型的唯一方式,就是看有沒有小數點。
談到浮點型,不得不說下E記法。E記法也就是平時所說的科學計數法,用於表示特別大和特別小的數:
對於地球到太陽的距離1.5億千米,如果轉換成米的話,那就是一個非常大的數了(150 000 000 000),但是如果你用E記法就是1.5e11(大E和小e都可以)。
其實大家應該已經發現了,這個E的意思是指數,指底數為10,E後邊的數字就是10的多少次冪。像15 000等於1.5×10 000,也就是1.5×104,E記法寫成1.5e4。
3.9.3 布林類型
布林類型事實上是特殊的整型,儘管布林類型用True和False來表示“真”與“假”,但布林類型可以當作整數來對待,True相當於整型值1,False相當於整型值0,因此下邊這些運算都是可以的(最後的例子報錯是因為False相當於0,而0不能作為除數)。
當然把布林類型當成1和0來參與運算這種做法是不妥的,這跟你把羊駝當成是一種馬一樣,所以大家知道就好,千萬別在實際應用中這麼去做!
3.9.4 類型轉換
接下來介紹幾個跟資料類型緊密相關的函數:int()、float()和str()。
int()的作用是將一個字串或浮點數轉換為一個整數:
注意了,如果是浮點數轉換為整數,那麼Python會採取“截斷”處理,就是把小數點後的資料直接砍掉,注意不是四捨五入哦!
float()的作用是將一個字串或整數轉換成一個浮點數(就是小數啦):
str()的作用是將一個數或任何其他類型轉換成一個字串:
3.9.5 獲得關於類型的資訊
有時候可能需要確定一個變數的資料類型,例如使用者的輸入,當需要使用者輸入一個整數,但使用者卻輸入一個字串,就有可能引發一些意想不到的錯誤或導致程式崩潰!
現在告訴大家一個好消息,Python其實提供了一個函數,可以明確告訴我們變數的類型,這就是type()函數:
當然,通向羅馬的道路非常多,無須在一棵樹上吊死,查看Python的幫助文檔,它更建議我們使用isinstance()這個BIF來確定變數的類型。這個BIF有兩個參數:第一個是待確定類型的資料;第二個是指定一個資料類型。
isinstance()會根據兩個參數返回一個布林類型的值,True表示類型一致,False表示類型不一致:
3.10 常用操作符
3.10.1 算術操作符
和絕大多數程式設計語言一樣,Python的算術操作符大部分和我們理解的一樣,注意,這裡說的是大部分,不是全部:
+ - * / % ** //
前邊四個就不用介紹啦,加減乘除,大家都懂。不過有點小技巧倒不是大家都知道。
例如,當你想對一個變數本身進行算數運算的時候,你是不是會覺得寫a=a+1或b=b–3這類操作符特別麻煩?沒錯,在Python中可以做一些簡化:
如果使用過Python2.x版本的讀者可能會發現,咱Python的除法變得有些不同了。包括很多程式設計語言,整數除法一般都是採用floor的方式,有些書籍稱為地板除法(注:因為floor的翻譯就是地板的意思)。地板除法的概念是:計算結果取比商小的最大整型,也就是捨棄小數的意思(注:例如3/2等於1)。但是在這裡我們發現,即使是進行整數間的除法,但是答案是自動返回一個浮點型的精確數值,也就是Python用真正的除法代替了地板除法。
那有些朋友不樂意了,他說“蘿蔔青菜各有所愛,我就喜歡原來的除法,我覺著整數除以整數就應該得到一個整數嘛。”Python團隊也為此想好了後路,就是大家看到的雙斜杠,它執行的就是地板除法的操作,不過要注意一點的是,無論是整數運算還是浮點數運算,都會執行地板除法:
關於Python3在除法運算上的改革,支持的和謾駡的幾乎各占一半,有些人支持這種做法,因為Python的除法運算從一開始的設計就有失誤,但有些人又不想因此修改自己的海量代碼,而剩下的人則想要真正的除法。無論怎樣,Python團隊是秉承著追求完美和卓越的思維去一次次改進Python這門程式設計語言,所以小甲魚說Python3已經是非常棒的版本了。
百分號(%)表示求餘數的意思:
3.10.2 優先順序問題
當一個運算式存在著多個運算子的時候,就可能會發生以下對話。
加法運算子說:“我先到的,我先計算!”
乘法運算子說:“哥我幹一次夠你翻幾個圈了,哥先來!”
減法運算子說:“你糊塗了,我現在被當成負號使用,沒有我,你們再努力,結果也是得到相反的數!”
除法運算子這時候默默地說:“搶吧搶吧,老娘我除以零,大不了大家同歸於盡!”
呃!為了防止以上矛盾的出現,我們規定了運算子的優先順序,當多個運算子同時出現在一個運算式的時候,嚴格按照優先順序規定的級別來進行運算。
先乘除,後加減,如有括弧先運行括弧裡邊的。沒錯,從小學我們就學到了運算子優先順序的精髓,在程式設計中也是這麼繼承下來的。例如:
-3 * 2 + 5 / - 2
- 4
相當於
(-3) * 2 + 5 /
(-2) - 4
其實這個多做練習自然就記住了,不用刻意去背。當然在適當的地方加上括弧強調一下優先順序小甲魚覺得會是更好的方案。
Python還有一個特殊的乘法,就是雙星號(**),也稱為冪運算操作符。例如3 ** 2,雙星號左側的3稱為底數,右側的2稱為指數,把這樣的算式叫作3的2次冪,結果就是3 * 3==9。
在使用Python進行冪運算的時候,需要注意的一點是優先順序問題,因為冪運算操作符和一元操作符[1]的優先順序關係比較特別:冪運算操作符比其左側的一元操作符優先順序高,比其右側的一元操作符優先順序低:
3.10.3 比較操作符
比較操作符包括:
這個之前講過了,比較操作符根據運算式的值的真假返回布林類型的值。這裡不重複講解,列舉出來給大家回顧一下而已。
3.10.4 邏輯操作符
邏輯操作符包括:
and or not
and操作符之前已經學習過,在實例中也多次使用,當只有and操作符左邊的運算元為真,且右邊的操作符同時為真的時候,結果為真。
or操作符跟and操作符不同,or操作符只需要左邊或者右邊任意一邊為真,結果都為真;只有當兩邊同時為假,結果才為假。
not操作符是一個一元操作符,它的作用是得到一個和運算元相反的布林類型的值:
噢,對了,你可能會看到這樣的運算式:
這在其他程式設計語言一般是不合法的,但在Python中是行得通的,它事實上被解釋為:
最後,將目前接觸的所有操作符的優先順序合併在一起,如圖3-1所示。
圖3-1 Python操作符優先順序




























0 留言:
發佈留言