上一篇文章:(2018-03-21)0003.Python基礎(chǔ)入門班_第3課爽醋、容器以及容器的訪問使用
關(guān)于本人
個人信息:微博
寫作區(qū):個人博客、簡書便脊、開源中國蚂四、豆瓣、掘金、CSDN
代碼管理區(qū):碼云遂赠、GitHub久妆、GitBook、Python_NoteBook(這個僅僅限于自己的本地搭建)
我的網(wǎng)絡(luò)制作書籍:Python3Book(基于廖雪峰的Python教程編寫成書)跷睦、
july_Oneline(基于七月在線培訓機構(gòu)的教程編寫成書)筷弦、LineCode刷題總結(jié)__GitBookEditor網(wǎng)絡(luò)書籍
推薦網(wǎng)站
1.第三方庫__scipy
2.第三方庫__sklearn(安裝之前需要安裝,numpy抑诸、scipy)
3.什么是ML
4.什么是測試集
5.sklearn的作用
推薦軟件
無
推薦書籍
無
第4課 面向?qū)ο蠡A(chǔ)
一烂琴、類和對象
百度維基
類和對象(class)是兩種以計算機為載體的計算機語言的合稱。
對象是對客觀事物的抽象蜕乡,類是對對象的抽象奸绷。類是一種抽象的數(shù)據(jù)類型。
它們的關(guān)系是层玲,對象是類的實例号醉,類是對象的模板。
對象是通過new className產(chǎn)生的辛块,用來調(diào)用類的方法;類的構(gòu)造方法 畔派。
自身理解
人類 是 類
我們每個人 都是對象。
是通過人類演化而成的一個個對象
代碼展示
#一润绵、類和對象
print('一线椰、類和對象')
class Foo:
# 這里我們可以創(chuàng)建一個類級別的變量
# 它不會隨著由此類創(chuàng)建的變量而變化
name = 'lyh'
def bar(self): # 第一參數(shù)的指向
print('Bar')
def hello(self,name):
print('you are %s' %self.name)
print('i am %s'%name)
print('\n')
pass
# 根據(jù)Foo創(chuàng)建的對象
obj = Foo()
obj2 = Foo()
print(obj)
obj.bar()
obj.hello('lyh')
obj2.hello('h')
print('!end!\n')
控制臺打印
一、類和對象
<__main__.Foo object at 0x013D7CB0>
Bar
you are lyh
i am lyh
you are lyh
i am h
!end!
二授药、構(gòu)造函數(shù)
百度維基
構(gòu)造函數(shù):是一種特殊的方法士嚎。
只要用來在創(chuàng)建對象時 初始化對象,即為對象成員變量賦初始值
自身理解
自己創(chuàng)建一些函數(shù)
代碼展示
#二悔叽、構(gòu)造函數(shù)
'構(gòu)造函數(shù):是一種特殊的方法莱衩。只要用來在創(chuàng)建對象時 初始化對象,即為對象成員變量賦初始值'
print('二娇澎、構(gòu)造函數(shù)')
class Foo:
name = 'l'
def __init__(self): #這就是構(gòu)造函數(shù)笨蚁,它的職責是在模型創(chuàng)建的初期,就完成一些動作
# 簡單的說就是趟庄,自定義的初始化步驟:
# 同樣括细,他需要self來指代本身這個class
self.name = 'll'
def __init__(self,name2): #你可以在這里附加上一些參數(shù)
# 這些參數(shù)僵尸你創(chuàng)建一個Foo類時的必要條件
self.name = name2
def hello(self,name):
print('you are %s' %self.name)
print('i am %s'%name)
# obj = Foo()
obj.hello('a')
obj2 = Foo('lll')
obj.hello('b')
print('!end!\n')
控制臺打印
二、構(gòu)造函數(shù)
you are lyh
i am a
you are lyh
i am b
!end!
三戚啥、訪問限制
自身理解
能不能訪問
代碼展示
#三奋单、訪問限制
'''
變量 是否能給外界訪問
如果不能 怎么在創(chuàng)建類的時候設(shè)置
在變量的前面添加兩個__
'''
print('三、訪問限制')
class Stundet:
def __init__(self,name,age):
# 外界能訪問的變量
# self.name = name
# self.age = age
# 外界不能訪問的變量
self.__name = name # AttributeError: 'Stundet' object has no attribute 'name'
self.__age = age
def detail(self):
print(self.__name)
print(self.__age)
Lyh = Stundet('Lyh',12)
Lyh.age = 20
Lyh.detail()
print('!end!\n')
控制臺打印
三猫十、訪問限制
Lyh
12
!end!
四览濒、Getter + Setter
getter 和 setter的作用
setter方法呆盖,是對象引用調(diào)用setter方法,并傳入?yún)?shù)贷笛。
getter方法应又,對象調(diào)用getter方法,獲取對象屬性的值乏苦。
自身理解
get 獲取對象屬性值
set 設(shè)置對象屬性值
代碼展示
#四株扛、Getter + Setter
'''
如何確保安全,又能被外部修改變量
'''
print('四汇荐、Getter + Setter')
class Student(object): # (object)洞就,表示該類是從哪個類繼承下來的
def get_name(self):
return self.__name
def get_age(self):
return self.__age
def set_age(self):
self.__age = age
print('!end!\n')
控制臺打印
四、Getter + Setter
!end!
五拢驾、Python的面向?qū)ο笕筇匦越贝拧ython的經(jīng)典類和新類(現(xiàn)在基本都是用新類)
封裝、繼承繁疤、多態(tài)的基本知識
自身理解
封裝:將一些東西收藏起來
繼承:子繼承父業(yè)
多態(tài):很多鐘表示狀態(tài)
代碼展示
#五咖为、Python的面向?qū)ο笕筇匦?'''
封裝:指的是把內(nèi)容封裝到某個地方,用于日后調(diào)用
其實就是使用構(gòu)造方法將內(nèi)容封裝到對象中稠腊,
然后通過對象直接 或者self間接獲取被封裝的內(nèi)容
繼承:兒子繼承父親
爸爸有的兒子都有
多態(tài):
Python可以多類繼承
'''
print('五躁染、Python的面向?qū)ο笕筇匦?)
#1.封裝
class Student(object):
def __init__(self,name,age):
self.name = name
self.age = age
def detail(self):
print(self.name)
print(self.age)
obj1 = Student('lyh',12)
print(obj1.name) # 直接調(diào)用obj1對象的name屬性
print(obj1.age) # 直接調(diào)用obj1對象的age屬性
obj1.detail() #自我調(diào)用
print('!~~~!\n')
#2.繼承
class PrimaryStudent(Student): #因為是繼承于學生類,所以我們卸載括號內(nèi)
# 這里我們可以不寫構(gòu)造函數(shù)架忌,于是我們就是直接引用Student的構(gòu)造函數(shù)
def lol(self) : # 我們有一些新的獨有方法吞彤,會被疊加起來
print('開打開打')
class CollegeStudent(Student):
#改寫父類的構(gòu)造函數(shù)
def __init__(self,name,age,gf):
#于是爸爸的init會被直接 overwrite(重寫掉)
self.name = name
self.age = age
self.gf = gf
def gf_detail(self):
print(self.gf)
''''''
obj1 = PrimaryStudent('小了',3)
obj1.lol() #獨有方法
obj1.detail() #繼承與爸爸的方法
print('!~~~!\n')
obj2 = CollegeStudent('李',22,'H')
obj2.detail()
obj2.gf_detail()
print('!~~~!\n')
# Python可以多類繼承
class D:
def bar(self):
print('D.bar')
class C(D):
def bar(self):
print('C.bar')
class B(D):
pass
class A(B,C): # A 繼承兩個 爸爸 B、C
pass
a = A()
# -- 經(jīng)典類
# 執(zhí)行bar方法時
# 首先去A類中查找叹放,如果A類中沒有饰恕,則繼續(xù)去B類中找,如果B沒用井仰,
# 則繼續(xù)去D類中找埋嵌,如果D沒有,則繼續(xù)去C類中找俱恶,如果還是沒有找到則報錯
# 順序 A -> B -> D -> C # 注意 這是之前python2.2的經(jīng)典類順序
# ** 新類(python3.x)
# 首先去A類中查找雹嗦,如果A類中沒有,則繼續(xù)去B類中找合是,如果B沒用了罪,
# 則繼續(xù)去C類中找,如果C沒有聪全,則繼續(xù)去D類中找泊藕,如果還是沒有找到則報錯
# 順序 A -> B -> C -> D # 注意 這是新類順序
a.bar()
# 多態(tài)
'''
python 不支持多態(tài)并且也用不到多態(tài),多態(tài)的概念是應(yīng)用于java 和 C#這一類強類型語言
难礼,而python 是 鴨子類型
'''
class F1:
pass
# 假設(shè) 娃圆,S1是我們的正統(tǒng)類汽久,它繼承與根正苗紅的F1,
class S1(F1):
def show(self):
print('S1.show')
# S2是路人甲
class S2:
def show(self):
print('S2.show')
def Func(obj):
obj.show()
s1_obj = S1()
s2_obj = S2()
Func(s1_obj)
Func(s2_obj)
print('!end!\n')
控制臺打印
五踊餐、Python的面向?qū)ο笕筇匦?lyh
12
lyh
12
!~~~!
開打開打
小了
3
!~~~!
李
22
H
!~~~!
C.bar
S1.show
S2.show
!end!
六、獲取對象信息(dir()的作用臀稚、實例對象和類對象吝岭、模塊和包)
自身理解
獲取人、事物的信息
代碼展示
#六吧寺、獲取對象信息
print('六窜管、獲取對象信息')
print(type(123))
print(type('str'))
print(type(None))
print(type(abs))
print('用語句進行獲取對象信息')
# 用語句進行獲取對象信息
print(type(123) == type(456))
print(type('123') == type('456'))
print(type('123') == type(456))
print(type('123') == type(str))
print(type([]) == type(list))
print('isinstance')
# isinstance : 可以告訴我們,一個對象是不是某種類型(包含繼承關(guān)系)
class A:
pass
class B(A):
pass
class C(B):
pass
k = A()
g = B()
y = C()
print(isinstance(y,C))
print(isinstance(y,B))
print('## 使用dir()')
## 使用dir()
'''
如果要獲取一個對象的所有屬性和方法稚机,可以使用dir()函數(shù)幕帆,
它會返回一個包含字符串的list
比如,獲取一個str對象的所有屬性和方法
'''
print(dir('ABC'))
print('ABC'.__len__())
# dir()
'''
配合
getattr(),
setattr(),
hasattr() 有沒有這個屬性
'''
class MyObject:
def __init__(self):
self.x = 9
def power(self):
return self.x * self.x
obj = MyObject()
print(hasattr(obj,'x')) # 有沒有x這個屬性
print(hasattr(obj,'power')) # 有沒有power這個屬性
print(hasattr(obj,'y')) # 有沒有y這個屬性
print(setattr(obj,'y',19)) # 設(shè)置y這個屬性
print(getattr(obj,'y')) # 獲取y這個屬性
fn = getattr(obj,'power') # 獲取屬性'power'并賦值到變量Fn里面
print(fn()) # 調(diào)用 fn() 相當于調(diào)用 obj.fn()
# 實例屬性 和 類屬性
'''
類創(chuàng)建的實例 可以任意綁定屬性
給實例 綁定屬性的方法是通過 實例變量赖条,或者通過self變量
'''
class Student(object):
name = 'Student' # 類屬性
def __init__(self,name):
self.name = name # 實例屬性
s = Student('boy')
s.score = 90
print(s.name)
class Student(object):
name = 'Student' # 類屬性
s = Student() # 創(chuàng)建實例s
print(s.name) # 打印name屬性,因為實例并沒有name屬性失乾,所以會執(zhí)行查找class的name屬性
print(Student.name) # 打印類的name屬性
s.name = 'LYH' #給實例綁定name屬性
print(s.name) # 由于 實例屬性優(yōu)先級比類屬性高,因此纬乍,他會屏蔽類的name屬性
print(Student.name) # 但是類屬性并未消失碱茁,用Student.name仍然可以訪問
del s.name # 刪除實例的name屬性
print('123'+s.name) # 再次調(diào)用s.name 由于實例的name屬性沒有找到,類的name屬性就顯示出來了
print('## 模塊 和 包')
## 模塊 和 包
'''
python的程序 由 包(package)仿贬、模塊(module) 和函數(shù)組成纽竣。
包是 由 一系列模塊組成的集合。
模塊是處理某一類問題的函數(shù) 和 類的集合茧泪。
包 就是一個完成特定任務(wù)的工具蜓氨。python提供了許多有用的工具包,如字符串處理队伟、
圖形用戶接口穴吹、web應(yīng)用、圖形圖像處理等缰泡。
這些自帶的工具包和模塊安裝在python的安裝目錄下的Lib子目錄中
'''
# 包
'''
包將有聯(lián)系的模塊組織在一起刀荒,有效避免模塊名稱沖突問題,讓應(yīng)用組織結(jié)構(gòu)更加清晰棘钞。
一個普通的python應(yīng)用程序的目錄結(jié)構(gòu):
app/
__init__.py
a/
__init__.py
a.py
b/
__init__.py
b.py
app是最頂層的包缠借,a和b是它的子包,可以這樣導(dǎo)入
from app.a import a
from app.b.b import test
a.test()
test()
'''
# 模塊
'''
在python中一個文件可以被看成一個獨立模塊宜猜,而包對應(yīng)著文件夾泼返。模塊把python代碼
分成一些有組織的代碼段,通過導(dǎo)入的方式實現(xiàn)代碼重用
import sys
print(sys.path)
'''
import sys
print(sys.path)
# 導(dǎo)入模塊
# import module1
#使用from-import語句導(dǎo)入模塊的屬性
# 單行導(dǎo)入
# from module import name1
#多行導(dǎo)入
# from module import name1,name2,name3
# from module import * # 導(dǎo)入所有
# 自定義導(dǎo)入模塊名稱
# from A import B as BoyFunc
print('!end!\n')
控制臺打印
六姨拥、獲取對象信息
<class 'int'>
<class 'str'>
<class 'NoneType'>
<class 'builtin_function_or_method'>
用語句進行獲取對象信息
True
True
False
False
False
isinstance
True
True
## 使用dir()
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
3
True
True
False
None
19
81
boy
Student
Student
LYH
Student
123Student
## 模塊 和 包
['C:\\Users\\Hasee\\Desktop\\Python_七月在線\\01-Python課程___Python基礎(chǔ)入門班\\Code\\第4課 面向?qū)ο蠡A(chǔ)', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\python35.zip', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\DLLs', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\lib', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32', 'C:\\Users\\Hasee\\AppData\\Local\\Programs\\Python\\Python35-32\\lib\\site-packages']
!end!
七绅喉、實戰(zhàn)
自身理解
將學習的東西 用在戰(zhàn)場上渠鸽。
代碼展示
print('七、實戰(zhàn)')
#七柴罐、實戰(zhàn)
'''
下載 sklearn 包
http://scikit-learn.org/stable/install.html
iris(鳶尾花)
http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html
在ML里面
基本都會 X 判斷 Y 的問題
X 基本就是
Y 基本就是
ML:
機器學習[1] (Machine Learning)徽缚,是研究計算機怎樣模擬或?qū)崿F(xiàn)人類的學習行為,
以獲取新的知識或技能革屠,重新組織已有的知識結(jié)構(gòu)使之不斷改善自身的性能凿试。
它是人工智能的核心,是使計算機具有智能的根本途徑似芝,
其應(yīng)用遍及人工智能的各個領(lǐng)域那婉,它主要使用歸納、綜合而不是演繹党瓮。
'''
from sklearn import svm,datasets
# datasets數(shù)據(jù)庫详炬、svm:upport Vector Machine 分類器(支持向量機)
'''
最好把 dataset 寫成一個文件
'''
class Dataset:
# 我們創(chuàng)建一個dataset的類,這個類會幫我們下載相關(guān)的數(shù)據(jù)集
# 并給我們分類好x,y
def __init__(self,name):
# 告訴類,我們需要那個數(shù)據(jù)集
# 我們有兩個選擇,一個是'iris',一個是'digits'
self.name = name
def download_data(self): # 1寞奸、下載數(shù)據(jù)
# 從sklearn的自帶集中下載我們制定的數(shù)據(jù)集
if self.name =='iris':
# 這里是sklearn自帶的數(shù)據(jù)集下載方法呛谜,更多信息可以參考官網(wǎng)
self.download_data = datasets.load_iris()
elif self.name == 'digits':
self.download_data = datasets.load_digits()
else:
# 如果不是我們預(yù)想的兩個數(shù)據(jù)集,則報錯
print('DataSet Error : No Named datasets')
def generate_xy(self): # 2、創(chuàng)造x,y
# 通過這個過程 來把我們的數(shù)據(jù)集 分為原始數(shù)據(jù) 以及他們的label
# 我們先把數(shù)據(jù)下載下來
self.download_data() # 傳接download_data參數(shù)
x = self.download_data.data # data 是 x
y = self.download_data.target # target 是 y
print('\n Original data looks like this :\n',x)
print('\n Labels looks Like this:\n',y)
return x,y
def get_train_test_set(self,ratio): # 3枪萄、數(shù)據(jù)分成訓練呻率、測試集
# 這里,我們把所有的數(shù)據(jù)分成訓練集 和 測試集
# 一個參數(shù)要求我們告知,我們以多收的比例來分割訓練和測試集
# 首先呻引,我們把XY給generate出來
x,y = self.generate_xy()
# 有個比例礼仗,我們首先得知道 一共有多少的數(shù)據(jù)
n_samples = len(x)
#于是我們知道,有多少應(yīng)該是訓練集,多少應(yīng)該是測試集
n_train = n_samples * ratio
# 好了逻悠,接下來 我們分割數(shù)據(jù)
X_train = x[:n_train] # X訓練集
y_train = y[:n_train] # Y訓練集
X_test = x[n_train:] # X測試集
y_test = y[n_train:] # Y測試集
# 好元践,我們得到了所有想要的玩意兒
return X_train,y_train,X_test,y_test
# === 我們的dataset類創(chuàng)造完畢===
# 使用digits 數(shù)據(jù)集
data = Dataset('digits')
# 接著,我們可以用0.7 的分割率 把 xy給分割出來
X_train,y_train,X_test,y_test = data.get_train_test_set(0.7)
'''
同樣,我們也不一定需要自己創(chuàng)造類童谒,我們可以引用第三方庫里的類单旁,
比如這里,我們用SVM作為我們的分類器饥伊,去訓練我們的算法
我們就直接建造一個object象浑,使他成為SVM類
'''
clf = svm.SVC()
'''
這里clf是classifier的簡稱,SVC指的是SVM的classification版本琅豆。
因為我們的數(shù)據(jù)集都是分類問題愉豺,所以我們使用SVC()
接下來,我們fit我們的數(shù)據(jù)(也就是訓練我們的數(shù)據(jù))
顯然茫因,做fit的時候蚪拦,我們只可以使用訓練集
'''
clf.fit(X_train,y_train)
print(clf.fit(X_train, y_train))
# 拿出數(shù)據(jù)進行測試
test_point =X_test[12]
y_true = y_test[12]
# clf.predict(test_point) # 看clf給出的預(yù)測是什么
print(clf.predict(test_point.reshape(1,-1))) # 輸出 [7]
print(y_true) # 打印 7
'''
正確!
那么這樣,你們已經(jīng)學會如何訓練數(shù)據(jù)集并作出新的預(yù)測了驰贷。
把所有的測試集都導(dǎo)入clf盛嘿,讓他pridict,并看看跟真實的label相差多少括袒。
'''
print('!end!\n')
控制臺打印
七次兆、實戰(zhàn)
Original data looks like this :
[[ 0. 0. 5. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 10. 0. 0.]
[ 0. 0. 0. ..., 16. 9. 0.]
...,
[ 0. 0. 1. ..., 6. 0. 0.]
[ 0. 0. 2. ..., 12. 0. 0.]
[ 0. 0. 10. ..., 12. 1. 0.]]
Labels looks Like this:
[0 1 2 ..., 8 9 8]
C:\Users\Hasee\Desktop\Python_七月在線\01-Python課程___Python基礎(chǔ)入門班\Code\第4課 面向?qū)ο蠡A(chǔ)\面向?qū)ο蠡A(chǔ).py:442: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
X_train = x[:n_train] # X訓練集
C:\Users\Hasee\Desktop\Python_七月在線\01-Python課程___Python基礎(chǔ)入門班\Code\第4課 面向?qū)ο蠡A(chǔ)\面向?qū)ο蠡A(chǔ).py:443: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
y_train = y[:n_train] # Y訓練集
C:\Users\Hasee\Desktop\Python_七月在線\01-Python課程___Python基礎(chǔ)入門班\Code\第4課 面向?qū)ο蠡A(chǔ)\面向?qū)ο蠡A(chǔ).py:444: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
X_test = x[n_train:] # X測試集
C:\Users\Hasee\Desktop\Python_七月在線\01-Python課程___Python基礎(chǔ)入門班\Code\第4課 面向?qū)ο蠡A(chǔ)\面向?qū)ο蠡A(chǔ).py:445: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
y_test = y[n_train:] # Y測試集
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
[7]
7
!end!
代碼:74nf
明天將會更新→0005.Python基礎(chǔ)入門班_第5課、文件訪問與函數(shù)式編程入門
代碼都是上傳百度云