1. 程式人生 > >《機器學習實戰》書中python2.7與3.6的區別-持續更新

《機器學習實戰》書中python2.7與3.6的區別-持續更新

《機器學習實戰》書中使用的是python2.7,而對於現在新接觸python的同學來說都是上手python3.6版本。

由於本渣渣也正在學習此書,將陸續列出遇到的不同於現實編碼的困難與解決方法(如果能解決的話.......)。

1.import numpy時候,書中提倡from numpy import *
而我們在學習python3.6時常用import numpy as np,於是在呼叫tile、zeros等函式時,要改為np.tile(),np.zeros()。

2.輸出的print後邊要加上()

3.在使用pickle開啟檔案時,由於開啟方式時二進位制,要在‘w’後面或者‘r’

後面加上‘b’,如‘wb’

    import pickle
    fw = open(filename,'wb')                   #pickle是二進位制開啟,加b
    pickle.dump(inputTree,fw)
    fw.close()

4.書中的獲取字典dict的keys方法dict.keys()獲得的字典集不是list形式不能直接使用'[ ]'取值

這是python2.7的取值方法,在3.6中應該改為如下:

str = list(dict.keys())[0]
先將dict.keys()轉化為list形式

5.在第四章出現一個無法解決的問題:

tokenText = textParse(open('E:/BigData/machinelearninginaction/Ch04/email/spam/%d.txt' % i).read())

這個開啟檔案會出現解碼錯誤的問題:'gbk' codec can't decode byte 0xff in position 199

然後我試著用‘utf-8’ 出現:'utf-8' codec can't decode byte 0xff in position 43

似乎是這些檔案中有兩種的編碼的方式。於是我只提取前15個檔案,不用修改就成功了。

試了很多方法,全部檔案的讀取還是沒有成功。

如果同時解碼多個編碼方式還是沒有解決。

6.在一個dataSet = range(50),中 del(dataSet[30])會出現錯誤

因為range返回的是range object 先將起轉化為list

如:dataSet = list(range(50))

7.第九章中在載入資料時有這塊程式碼:

for line in fr.readlines():
        curline = line.strip().split('\t')
        fltLine = map(float,curline)
        dataMat.append(fltLine)
這裡會報錯,提示map物件不能做mean處理,原因是python 2.7的map返回的是直接的結果,而python 3.6中返回的是map的物件:
<map object at 0x00000000021DA860> 
這裡把這個物件轉化為list即可,具體整個程式碼塊改為:
for line in fr.readlines():
        curline = line.strip().split('\t')
        curline = list(map(float,curline))
        dataMat.append(curline)