數(shù)和四則運(yùn)算
計算機(jī),原本是用來計算的。現(xiàn)在更多人把她叫做電腦囤采,這兩個詞都是指computer。不管什么吗坚,只要提到她,普遍都會想到她能夠比較快地做加減乘除呆万,甚至乘方開方等商源。乃至于,有的人在口語中區(qū)分不開計算機(jī)和計算器谋减。
有一篇名為《計算機(jī)前世》的文章牡彻,這樣講到:
還是先來看看計算機(jī)(computer)這個詞是怎么來的。 英文學(xué)得好的小伙伴看到這貨出爹,computer
第一反應(yīng)好像是:“compute-er”是吧讨便,應(yīng)該是個什么樣的人就對了,就是啊以政,“做計算的人”。
叮咚伴找!恭喜你答對了盈蛮。
最先被命名為 computer 的確實是人。也就是說技矮,電子計算機(jī)(與早期的機(jī)械計算機(jī))被給予這個名字是因為他們執(zhí)行的是此前被分配到人的工作抖誉。 “計算機(jī)”原來是工作崗位,它被用來定義一個工種衰倦,其任務(wù)是執(zhí)行計算諸如導(dǎo)航表袒炉,潮汐圖表,天文歷書和行星的位置要求的重復(fù)計算樊零。從事這個工作的人就是 computer我磁,而且大多是女神!
所以驻襟,以后要用第三人稱來稱呼computer夺艰,請用she(她)。現(xiàn)在你明白為什么程序員中那么多“他”了吧沉衣,因為computer是“她”郁副。
[
](https://github.com/qiwsir/StarterLearningPython/blob/master/102.md#數(shù))數(shù)
在Python中,對數(shù)的規(guī)定比較簡單豌习,基本在小學(xué)數(shù)學(xué)水平即可理解存谎。
那么拔疚,做為零基礎(chǔ)學(xué)習(xí)這,也就從計算小學(xué)數(shù)學(xué)題目開始吧既荚。因為從這里開始稚失,數(shù)學(xué)的基礎(chǔ)知識列位肯定過關(guān)了。
33>>> 33333333333333333333333333333333333333333333333333333333333333333333333333333333L>>> 3.2222223.222222
上面顯示的是在交互模式下固以,如果輸入3墩虹,就顯示了3,這樣的數(shù)稱為整數(shù)憨琳,用int表示诫钓。這個稱呼和小學(xué)數(shù)學(xué)一樣。
如果輸入一個比較大的數(shù)篙螟,第二個菌湃,那么多個3組成的一個整數(shù),在Python中稱之為長整數(shù)遍略。為了表示某個數(shù)是長整數(shù)惧所,Python 2會在其末尾顯示一個L,Python 3中干脆把L都省略了绪杏,因為本來它也沒有什么作用了下愈。其實,現(xiàn)在的Python已經(jīng)能夠自動將輸入的很大的整數(shù)視為長整數(shù)了蕾久。你不必在這方面進(jìn)行區(qū)別势似。
這個功能重要,在于Python能自動處理大整數(shù)問題僧著,不用擔(dān)心溢出履因。什么是“溢出”,隨后說明盹愚,或者在這里去Google它栅迄。
第三個,在數(shù)學(xué)里面稱為小數(shù)皆怕,這里你依然可以這么稱呼毅舆,不過就像很多編程語言一樣,習(xí)慣稱之為“浮點數(shù)”端逼,用float表示朗兵。
注意,剛才我提到了小數(shù)顶滩,其實把小數(shù)稱之為“浮點數(shù)”余掖,這種說法并不準(zhǔn)確。為此,“知乎”上有專門的解釋盐欺,請閱讀(原文地址:http://www.zhihu.com/question/19848808/answer/22219209:
并不是說小數(shù)叫做浮點數(shù)赁豆。準(zhǔn)確的來說:“浮點數(shù)”是一種表示數(shù)字的標(biāo)準(zhǔn),整數(shù)也可以用浮點數(shù)的格式來存儲冗美。
當(dāng)代大部分計算機(jī)和程序在處理浮點數(shù)時所遵循的標(biāo)準(zhǔn)是由IEEE和ANSI制定的魔种。比如,單精度的浮點數(shù)以4個字節(jié)來表示粉洼,這4個字節(jié)可以分為三個部分:1位的符號位(0代表正數(shù)节预,1代表負(fù)數(shù)),8位用作指數(shù)属韧,最后的23位表示有效數(shù)字安拟。
“浮點數(shù)”的定義是相對于“定點數(shù)”來說的,它們是兩種表示小數(shù)的方式宵喂。
所謂“定點”是指小數(shù)點的位置總是在數(shù)的某個特定位置糠赦。比如在銀行系統(tǒng)中,小數(shù)點的位置總是在兩位小數(shù)之前(這兩位小數(shù)用來表示角和分)锅棕。其可以使用BCD碼來對小數(shù)進(jìn)行編碼拙泽。
浮點格式則是基于科學(xué)計數(shù)法的,它是存儲極大或極小數(shù)的理想方式裸燎。但使用浮點數(shù)來表示數(shù)據(jù)的時候顾瞻,由于其標(biāo)準(zhǔn)制定方面的原因可能會帶來一些問題,例如:某兩個不同的整數(shù)在單精度浮點數(shù)的表示方法下很可能無法區(qū)分德绿。
上述舉例中朋其,可以說都是無符號(或者說是非負(fù)數(shù)),如果要表示負(fù)數(shù)脆炎,跟數(shù)學(xué)中的表示方法一樣,前面填上負(fù)號即可氓辣。
值得注意的是秒裕,我們這里說的都是十進(jìn)制的數(shù)。
除了十進(jìn)制钞啸,還有二進(jìn)制几蜻、八進(jìn)制、十六進(jìn)制都是在編程中可能用到的体斩,當(dāng)然用六十進(jìn)制的時候就比較少了(其實時間記錄方式就是典型的六十進(jìn)制)梭稚。
進(jìn)制問題此處不是重點,建議讀者自行查找資料閱讀絮吵。
在Python中弧烤,每個數(shù)字都是真實存在的,相對于我們——人類——來講蹬敲,它真實存在暇昂,它就是對象(object)莺戒。
對象是一個深刻的術(shù)語,不管你是否理解急波,我先這么說从铲,你先聽著、用著澄暮,逐漸逐漸名段,就理解深入了。
還要注意泣懊,此對象非彼對象伸辟,但是學(xué)習(xí)Python或許在幫助你解決彼對象的時候有幫助。
比如整數(shù)3嗅定,就是一個對象自娩。
每個對象,在內(nèi)存中都有自己的一個地址渠退,這個就是它的身份忙迁。
id(3)140574872>>> id(3.222222)140612356>>> id(3.0)140612356>>>
用內(nèi)建函數(shù)id()可以查看每個對象的內(nèi)存地址,即身份碎乃。
內(nèi)建函數(shù)姊扔,英文為built-in Function,讀者根據(jù)名字也能猜個八九不離十了梅誓。不錯恰梢,就是Python中已經(jīng)定義好的內(nèi)部函數(shù)。
以上三個不同的數(shù)字梗掰,是三個不同的對象嵌言,具有三個不同的內(nèi)存地址。特別要注意及穗,在數(shù)學(xué)上摧茴,3和3.0是相等的,但是在這里埂陆,它們是不同的對象苛白。
用id()得到的內(nèi)存地址,是只讀的焚虱,不能修改购裙。
了解了“身份”,再來看“類型”鹃栽,也有一個內(nèi)建函數(shù)供使用type()躏率。
type(3)<type 'int'>>>> type(3.0)<type 'float'>>>> type(3.222222)<type 'float'>
在Python 3中,看到的是這樣的結(jié)果:
type(3)<class 'int'>>>> type(3.0)<class 'float'>>>> type(3.222222)<class 'float'>
用內(nèi)建函數(shù)能夠查看對象的類型。
<type ‘int’>
或者<class 'int'>
禾锤,說明3是整數(shù)類型(Interger)私股;
<type ‘float’>
或者<class 'float'>
,則告訴我們那個對象是浮點型(Floating point real number)恩掷。
與id()的結(jié)果類似倡鲸,type()得到的結(jié)果也是只讀的。
至于對象的值黄娘,在這里就是對象本身了峭状。
看來對象也不難理解。請保持自信逼争,繼續(xù)优床。
[
](https://github.com/qiwsir/StarterLearningPython/blob/master/102.md#變量)變量
僅僅寫出3、4誓焦、5是遠(yuǎn)遠(yuǎn)不夠的胆敞,在編程語言中,經(jīng)常要用到“變量”和“數(shù)”(在Python中嚴(yán)格來講是對象)建立一個對應(yīng)關(guān)系杂伟。例如:
x = 5>>> x5>>> x = 6>>> x6
在這個例子中移层,x = 5
就是在變量x和數(shù)
5之間建立了對應(yīng)關(guān)系,接著又建立了
x與
6`之間的對應(yīng)關(guān)系赫粥。
我們可以看到观话,x先“是”5,后來“是”6越平。
在Python中频蛔,有這樣一句話是非常重要的:對象有類型,變量無類型秦叛。
怎么理解呢晦溪?
首先,5挣跋、6都是整數(shù)尼变,Python中為它們?nèi)×艘粋€名字,叫做“整數(shù)”類型的對象(或者數(shù)據(jù))浆劲,也可以說對象(或數(shù)據(jù))類型是整數(shù)型,用int表示哀澈。
當(dāng)我們在Python中寫入了5牌借、6,computer姑娘就自動在她的內(nèi)存中某個地方給我們建立了這兩個對象割按,就好比建造了兩個雕塑膨报,一個是形狀似5,一個形狀似6,這就兩個對象现柠,這兩個對象的類型就是int.
那個x呢院领?就好比是一個標(biāo)簽,當(dāng)x = 5
時够吩,就是將x這個標(biāo)簽拴在了5上了比然,通過這個x,就順延看到了5周循,于是在交互模式中强法,>>> x
輸出的結(jié)果就是5,給人的感覺似乎是x就是5湾笛,事實是x這個標(biāo)簽貼在5上面饮怯。同樣的道理,當(dāng)x = 6
時嚎研,標(biāo)簽就換位置了蓖墅,貼到6上面。
所以临扮,作用等同于標(biāo)簽的變量x
沒有類型之說论矾,它不僅可以貼在整數(shù)類型的對象上,還能貼在其它類型的對象上公条,比如后面會介紹到的str(字符串)類型的對象等等拇囊。
這是Python的一個重要特征——對象有類型,變量無類型靶橱。
理解否寥袭?如果沒有理解,也不要緊張关霸,繼續(xù)學(xué)習(xí)传黄,“發(fā)展是硬道理”,在發(fā)展中解決問題队寇。
上面的知識膘掰,可以用來計算。
[
](https://github.com/qiwsir/StarterLearningPython/blob/master/102.md#四則運(yùn)算)四則運(yùn)算
按照下面要求佳遣,在交互模式中運(yùn)行识埋,看看得到的結(jié)果和用小學(xué)數(shù)學(xué)知識運(yùn)算之后得到的結(jié)果是否一致
2 + 57>>> 5 - 23>>> 10 / 25>>> 5 * 210>>> 10 / 5 + 13>>> 2 * 3 - 42
在Python 3中,上面的運(yùn)算中零渐,除法是有區(qū)別的窒舟,它們將是這樣的:
10 / 25.0>>> 10 / 5 + 13.0
這些運(yùn)算中,分別涉及到了四個運(yùn)算符號:加(+)诵盼、減(-)惠豺、乘(*)银还、除(/)
另外,我相信讀者已經(jīng)發(fā)現(xiàn)了一個重要的公理:
在計算機(jī)中洁墙,四則運(yùn)算和數(shù)學(xué)中學(xué)習(xí)過的四則運(yùn)算規(guī)則是一樣的
要不說人是高等動物呢蛹疯,自己發(fā)明的東西,一定要繼承自己已經(jīng)掌握的知識热监,別跟自己的歷史過不去捺弦。偉大的科學(xué)家們,在當(dāng)初設(shè)計計算機(jī)的時候就想到后輩小子們學(xué)習(xí)的需要了狼纬,一定不能讓后世子孫再學(xué)新的運(yùn)算規(guī)則羹呵,就用數(shù)學(xué)里面的好了。感謝那些科學(xué)家先驅(qū)者疗琉,澤被后世冈欢。
下面計算三個算術(shù)題,看看結(jié)果是什么
4 + 2
4.0 + 2
4.0 + 2.0
可能憤怒了盈简,這么簡單的題目凑耻,就不要勞駕計算機(jī)了,太浪費(fèi)了柠贤。
別著急香浩,還是要運(yùn)算一下,然后看看結(jié)果臼勉,有沒有不一樣邻吭?要仔細(xì)觀察哦。
4+26>>> 4.0+26.0>>> 4.0+2.06.0
觀察能力運(yùn)用到這里宴霸,在物理課堂上學(xué)的一點不浪費(fèi)囱晴。
找出不一樣的地方。第一個式子結(jié)果是6瓢谢,這是一個整數(shù)畸写;后面兩個是6.0,這是浮點數(shù)氓扛。這意味著什么枯芬,你可以繼續(xù)試驗,看看能不能總結(jié)出什么規(guī)律采郎。后面會用到千所。
似乎計算機(jī)做一些四則運(yùn)算是不在話下的,但是蒜埋,有一個問題請你務(wù)必注意:在數(shù)學(xué)中淫痰,整數(shù)是可以無限大的,但是在計算機(jī)中理茎,整數(shù)不能無限大黑界。為什么呢?(推薦去google皂林,其實計算機(jī)的基本知識中肯定學(xué)習(xí)過了朗鸠。)因此,就會有某種情況出現(xiàn)础倍,就是參與運(yùn)算的數(shù)或者運(yùn)算結(jié)果超過了計算機(jī)中最大的數(shù)了烛占,這種問題稱之為“整數(shù)溢出問題”。
[
](https://github.com/qiwsir/StarterLearningPython/blob/master/102.md#大整數(shù))大整數(shù)
這里有一篇專門討論這個問題的文章沟启,推薦閱讀:整數(shù)溢出
對于其它語言忆家,整數(shù)溢出是必須正視的,但是德迹,在Python里面芽卿,無憂愁,原因就是Python為我們解決了這個問題胳搞。
請閱讀拙文:大整數(shù)相乘
可以在實驗一下大整數(shù)相乘卸例。
123456789870987654321122343445567678890098876 * 1233455667789990099876543332387665443345566152278477193527562870044352587576277277562328362032444339019158937017801601677976183816L
Python 3中的計算結(jié)果,比上面的少L:
123456789870987654321122343445567678890098876 * 1233455667789990099876543332387665443345566152278477193527562870044352587576277277562328362032444339019158937017801601677976183816
Python自動幫為我們解決大整數(shù)問題肌毅。這是Python跟很多其它編程語言大不一樣的地方筷转,也就是說,你盡可以放心悬而,在Python中呜舒,整數(shù)的長度是不受限制的(當(dāng)然,這句話有點絕對了)笨奠。
Python解憂愁袭蝗,可是使用任意大的整數(shù)。
所以艰躺,選擇學(xué)習(xí)Python就是珍惜光陰了呻袭。
強(qiáng)調(diào)知識點,有兩個符號需要牢記(不記住也沒關(guān)系腺兴,可以隨時google左电,只不過記住后使用更方便)
整數(shù),用int表示页响,來自單詞:integer
浮點數(shù)篓足,用float表示,就是單詞:float
可以用一個命令:type(object)來檢測一個數(shù)是什么類型闰蚕。
type(4)<type 'int'> #4是int栈拖,整數(shù)>>> type(5.0)<type 'float'> #5.0是float,浮點數(shù)>>> type(988776544222112233445566778899887766554433221133344455566677788998776543222344556678)<type 'long'> #是長整數(shù)没陡,也是一個整數(shù)
Python 3的結(jié)果是:
type(4)<class 'int'>>>> type(5.0)<class 'float'>>>> type(988776544222112233445566778899887766554433221133344455566677788998776543222344556678)<class 'int'>
兩個版本有區(qū)別涩哟,在Python 3中索赏,不再有l(wèi)ong類型對象了,都?xì)w類為int類型贴彼。
[
](https://github.com/qiwsir/StarterLearningPython/blob/master/102.md#浮點數(shù))浮點數(shù)
對于浮點數(shù)潜腻,通常情況也沒有什么太神奇的,不過器仗,有時候會遇到非常大或者非常小的浮點數(shù)融涣,這時候通常會使用一種叫做“科學(xué)記數(shù)法”的方式表示。
9.8 ** -7.27.297468937055047e-08
在這個例子中精钮,e-08表示的是10的-8次方威鹿,這就是科學(xué)記數(shù)法。當(dāng)然轨香,也可以直接使用這種方法寫數(shù)字忽你。
a = 2e3>>> a2000.0
前面說到大整數(shù)問題的時候,Python幫我們解決了棘手的問題弹沽,使得整數(shù)可以無限大檀夹,但是,浮點數(shù)跟整數(shù)不同策橘,它存在上限和下限炸渡,如果超出了上下的范圍,就會出現(xiàn)溢出問題了丽已。也就是說蚌堵,如果計算的結(jié)果太大或者太小,乃至與已經(jīng)不在Python的浮點數(shù)范圍之內(nèi)沛婴,就會有溢出錯誤吼畏。
500.0 ** 100000Traceback (most recent call last): File "<stdin>", line 1, in <module>OverflowError: (34, 'Numerical result out of range')
請注意看剛才報錯的信息,“out fo range”嘁灯,就是超出了范圍泻蚊,溢出。所以丑婿,在計算中性雄,如果遇到了浮點數(shù),就要小心行事了羹奉。對于這種溢出秒旋,需要你在編寫程序的時候處理,并擔(dān)當(dāng)相應(yīng)的責(zé)任诀拭。
當(dāng)然迁筛,也要看看Python 3中的結(jié)果如何:
500.0 ** 100000Traceback (most recent call last): File "<pyshell#19>", line 1, in <module> 500.0 ** 100000OverflowError: (34, 'Result too large')
浮點數(shù)總要小心,它會因為“too large”而“out of range”耕挨。更要學(xué)會閱讀程序中的報錯信息细卧,因為后面還會用到尉桩,比如除法。