> "I give you a new commandment, that you love one another. Just as I have loved you, you also should love one another. By this everyone will know that you are my disciples, if you have love for one another."(JOHN14:34-35)
除法啰嗦,不僅是python。
## 整數除以整數
看官請在進入python交互模式之后(以后在本教程中,可能不再重復這類的敘述,只要看到>>>,就說明是在交互模式下,這個交互模式,看官可以在ide中,也可以像我一樣直接在shell中運行python進入交互模式),練習下面的運算:
~~~
>>> 2/5
0
>>> 2.0/5
0.4
>>> 2/5.0
0.4
>>> 2.0/5.0
0.4
~~~
看到沒有?麻煩出來了(這是在python2.x中),如果從小學數學知識除法,以上四個運算結果都應該是0.4。但我們看到的后三個符合,第一個居然結果是0。why?
因為,在python(嚴格說是python2.x中,python3會有所變化,具體看官要了解,可以去google)里面有一個規定,像2/5中的除法這樣,是要取整(就是去掉小數,但不是四舍五入)。2除以5,商是0(整數),余數是2(整數)。那么如果用這種形式:2/5,計算結果就是商那個整數。或者可以理解為:**整數除以整數,結果是整數(商)**。
繼續實驗,驗證這個結論:
~~~
>>> 5/2
2
>>> 6/3
2
>>> 5/2
2
>>> 6/2
3
>>> 7/2
3
>>> 8/2
4
>>> 9/2
4
~~~
**注意:**這里是得到整數商,而不是得到含有小數位的結果后“四舍五入”。例如5/2,得到的是商2,余數1,最終5/2=2。并不是對2.5進行四舍五入。
## 浮點數與整數相除
列位看官注意,這個標題和上面的標題格式不一樣,上面的標題是“整數除以整數”,如果按照風格一貫制的要求,本節標題應該是“浮點數除以整數”,但沒有,現在是“浮點數與整數相除”,其含義是:
> 假設:x除以y。其中 x 可能是整數,也可能是浮點數;y可能是整數,也可能是浮點數。
出結論之前,還是先做實驗:
~~~
>>> 9.0/2
4.5
>>> 9/2.0
4.5
>>> 9.0/2.0
4.5
>>> 8.0/2
4.0
>>> 8/2.0
4.0
>>> 8.0/2.0
4.0
~~~
歸納,得到規律:**不管是被除數還是除數,只要有一個數是浮點數,結果就是浮點數。**所以,如果相除的結果有余數,也不會像前面一樣了,而是要返回一個浮點數,這就跟在數學上學習的結果一樣了。
~~~
>>> 10.0/3
3.3333333333333335
~~~
這個是不是就有點搞怪了,按照數學知識,應該是3.33333...,后面是3的循環了。那么你的計算機就停不下來了,滿屏都是3。為了避免這個,python武斷終結了循環,但是,可悲的是沒有按照“四舍五入”的原則終止。
關于無限循環小數問題,小學都學習了,但是這可不是一個簡單問題,看看[維基百科的詞條:0.999...](http://zh.wikipedia.org/wiki/0.999%E2%80%A6),會不會有深入體會呢?
總之,要用python,就得遵循她的規定,前面兩條規定已經明確了。
> 補充一個資料,供有興趣的朋友閱讀:[浮點數算法:爭議和限制](https://docs.python.org/2/tutorial/floatingpoint.html#tut-fp-issues)
**說明:**以上除法規則,是針對python2,在python3中,將5/2和5.0/2等同起來了。不過,如果要得到那個整數部分的上,可以用另外一種方式:地板除.
~~~
>>> 9/2
4
>>> 9//2
4
~~~
python總會要提供多種解決問題的方案的,這是她的風格。
## 引用模塊解決除法--啟用輪子
python之所以受人歡迎,一個很重重要的原因,就是輪子多。這是比喻啦。就好比你要跑的快,怎么辦?光天天練習跑步是不行滴,要用輪子。找輛自行車,就快了很多。還嫌不夠快,再換電瓶車,再換汽車,再換高鐵...反正你可以選擇的很多。但是,這些讓你跑的快的東西,多數不是你自己造的,是別人造好了,你來用。甚至兩條腿也是感謝父母恩賜。正是因為輪子多,可以選擇的多,就可以以各種不同速度享受了。
python就是這樣,有各種各樣別人造好的輪子,我們只需要用。只不過那些輪子在python里面的名字不叫自行車、汽車,叫做“模塊”,有人承接別的語言的名稱,叫做“類庫”、“類”。不管叫什么名字吧。就是別人造好的東西我們拿過來使用。
怎么用?可以通過兩種形式用:
* 形式1:import module-name。import后面跟空格,然后是模塊名稱,例如:import os
* 形式2:from module1 import module11。module1是一個大模塊,里面還有子模塊module11,只想用module11,就這么寫了。比如下面的例子:
不啰嗦了,實驗一個:
~~~
>>> from __future__ import division
>>> 5/2
2.5
>>> 9/2
4.5
>>> 9.0/2
4.5
>>> 9/2.0
4.5
~~~
注意了,引用了一個模塊之后,再做除法,就不管什么情況,都是得到浮點數的結果了。
這就是輪子的力量。
## 關于余數
前面計算5/2的時候,商是2,余數是1
余數怎么得到?在python中(其實大多數語言也都是),用`%`符號來取得兩個數相除的余數.
實驗下面的操作:
~~~
>>> 5%2
1
>>> 9%2
1
>>> 7%3
1
>>> 6%4
2
>>> 5.0%2
1.0
~~~
符號:%,就是要得到兩個數(可以是整數,也可以是浮點數)相除的余數。
前面說python有很多人見人愛的輪子(模塊),她還有豐富的內建函數,也會幫我們做不少事情。例如函數`divmod()`
~~~
>>> divmod(5,2) #表示5除以2,返回了商和余數
(2, 1)
>>> divmod(9,2)
(4, 1)
>>> divmod(5.0,2)
(2.0, 1.0)
~~~
## 四舍五入
最后一個了,一定要堅持,今天的確有點啰嗦了。要實現四舍五入,很簡單,就是內建函數:`round()`
動手試試:
~~~
>>> round(1.234567,2)
1.23
>>> round(1.234567,3)
1.235
>>> round(10.0/3,4)
3.3333
~~~
簡單吧。越簡單的時候,越要小心,當你遇到下面的情況,就有點懷疑了:
~~~
>>> round(1.2345,3)
1.234 #應該是:1.235
>>> round(2.235,2)
2.23 #應該是:2.24
~~~
哈哈,我發現了python的一個bug,太激動了。
別那么激動,如果真的是bug,這么明顯,是輪不到我的。為什么?具體解釋看這里,下面摘錄官方文檔中的一段話:
> **Note:**?The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68\. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See?[Floating Point Arithmetic: Issues and Limitations](https://docs.python.org/2/tutorial/floatingpoint.html#tut-fp-issues)?for more information.
原來真的輪不到我。(垂頭喪氣狀。)
似乎除法的問題到此要結束了,其實遠遠沒有,不過,做為初學者,至此即可。還留下了很多話題,比如如何處理循環小數問題,我肯定不會讓有探索精神的朋友失望的,在我的github中有這樣一個輪子,如果要深入研究,[可以來這里嘗試](https://github.com/qiwsir/algorithm/blob/master/divide.py)。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python