目錄
1.4Python編程基礎
1、Python基本語法
(1)一段正確運行的Python代碼
# 代碼1:一段正確運行的Python代碼
isMLGeek = True
# 如果您是一位機器學習愛好者,系統常規輸出:推薦您購買《Python機器學習及實踐》。
if isMLGeek:
print('I recommend you to read "DIY Machine Learning Systems for Kaggle Competitions with Python Programming"!')
本地輸出:
I recommend you to read "DIY Machine Learning Systems for Kaggle Competitions with Python Programming"!
(2)一段錯誤運行的代碼
# 代碼2:一段錯誤運行的代碼
# isMLGeek
# 錯誤提示
# Traceback (most recent call last):
# File "F:/AC/pycharm/kaggle/kaggle1.py", line 4, in <module>
# if isMLGeek:
# NameError: name 'isMLGeek' is not defined
(3)小結
①命令提示符:代碼中每一行有關Python的編程語句都由>>>作爲命令提示符。如果使用Pycharm或者IPython Notebook等集成開發平臺,我們則看不到Python命令行提示符。
②代碼縮進:許多在C、C++和Java語言中需要用{}來分割的模塊,在Python中都嚴格採用縮進機制進行區分。
③註釋:爲代碼添加註釋是一種專業性的良好習慣,使得代碼便於追溯並且提高可讀性。
④瑞士計算機科學家、1984年圖靈獎獲得者Niklaus E. wirth在他1976年出版的著名書籍Algorithms + Data Structures = Programs中闡述了一個非常經典的觀點:程序是由數據結構與算法組成。
2、Python數據類型
(1)數字(Number)
常用的數字類型包括整型數(Integer)、長整型數(Long)、浮點數(Float)以及複雜型數(Complex)。整型數和浮點數是我們平時最常使用的兩類。
(2)布爾值(Boolean)
在Python中,用來表示真/假有固定的表示:True代表真,False代表假。切記,Python是大小寫敏感的編程語言,因此只有按照這樣輸入纔會被解釋器理解爲布爾值。
(3)字符串(String)
在Python裏,字符串的表示可以使用成對的英文單引號或者雙引號輔助進行表示:'abc'或者"123"。
(4)元組(Tuple)
元組是一系列Python數據類型按照順序組成的序列。使用一組小括號()表徵,如(1, 'abc', 0.4)是一個包含有三個元素的元組。元組中的數據類型不必統一,這個是Python的一大特點。我們可以通過索引直接從元組中找到我們需要的數據。特別需要提醒的是,大多數編程語言都默認索引的起始值爲0,不是1。
(5)列表(List)
列表是用一對中括號[]來組織數據,如[1, 'abc', 0.4]。需要記住一點例外的是:Python允許在使用者在訪問列表的同時修改列表裏的數據,而元組則不然。
(6)字典(Dictionary)
這是Python裏面非常實用而且功能強大的數據結構,特別在數據處理任務裏面,字典幾乎成了數據存儲的主流形式。從字典自身的數據結構而言,它包括多組鍵(key):值(value)對,Python是用大括號來容納這些鍵值對,如{1:'1', 'abc':0.1, 0.4:80}。字典中的鍵是唯一的,但是沒有數據類型的要求。
3、Python數據運算
(1)算術運算
Python常用的算術運算符有:加法(+)、減法(-)、乘法(*)、除法(/)、取模(%)以及冪指數(**)運算。
# 代碼3:算術運算代碼舉例
# 整數加法。
a1 = 10 + 20
print('a1 = ', a1)
# 整數與浮點數的減法。
a2 = 30 - 60.6
print('a2 = ', a2)
# 整數與浮點數的乘法。
a3 = 4 * 8.9
print('a3 = ', a3)
# 整數與整數的除法,這裏會發現結果只是保留了取整後的商數。(備註:Python3.7版本中,結果爲浮點數)
a4 = 5 / 4
print('a4 = ', a4)
# 整數與浮點數的除法,結果變爲浮點數。
a5 = 5.0 / 4
print('a5 = ', a5)
# 整數取模運算。
a6 = 5 % 4
print('a6 = ', a6)
# 冪指數運算。
a7 = 2.0 ** 3
print('a7 = ', a7)
本地輸出:
a1 = 30
a2 = -30.6
a3 = 35.6
a4 = 1.25
a5 = 1.25
a6 = 1
a7 = 8.0
(2)比較運算
如果說,算術運算的返回值一般是數字類型的話;那麼,比較運算則反饋布爾值類型的結果。
# 代碼4:比較運算代碼舉例
# 整數比較。
a8 = 10 < 20
print('a8 = ', a8)
a9 = 10 > 20
print('a9 = ', a9)
# 整數與浮點數的比較。
a10 = 30 <= 30.0
print('a10 = ', a10)
a11 = 30 >= 30.0
print('a11 = ', a11)
# 判斷兩個值是否相等。
a12 = 30 == 40
print('a12 = ', a12)
# 兩個值不相等的判定。
a13 = 30 != 40
print('a13 = ', a13)
本地輸出:
a8 = True
a9 = False
a10 = True
a11 = True
a12 = False
a13 = True
(3)賦值運算
與許多流行的高級編程語言C、C++、Java等不同,Python在聲明變量時不需要預告知類型。
# 代碼5:賦值運算代碼樣例
# 將一個元組賦值給變量t。
t = (1, 'abc', 0.4)
print('t = ', t)
# 試圖更改元組t的第一個元素,但是解釋器報錯,具體原因我們已經講過,元組一旦初始化不可以改變內部元素。
# t[0] = 2
# 錯誤提示
# Traceback (most recent call last):
# File "F:/AC/pycharm/kaggle/kaggle1.py", line 61, in <module>
# t[0] = 2
# TypeError: 'tuple' object does not support item assignment
# 將一個列表賦值給變量l。
l = [1, 'abc', 0.4]
print('l = ', l)
# 試圖更改列表l的第一個元素。
l[0] = 2
print('l = ', l)
# 試圖對更新過的列表l的第一個元素2,進行遞增1並重新賦值的操作。
l[0] += 1
print('l = ', l)
# 觀察輸出,應該爲3。
l[0]
print('l[0] = ', l[0])
# 試圖對更新過的列表l的第一個元素2,進行遞減2,並且重新賦值給l[0]。
l[0] -= 2
print('l = ', l)
# 觀察輸出,應該爲1。
print('l[0] = ', l[0])
本地輸出:
t = (1, 'abc', 0.4)
l = [1, 'abc', 0.4]
l = [2, 'abc', 0.4]
l = [3, 'abc', 0.4]
l[0] = 3
l = [1, 'abc', 0.4]
l[0] = 1
(4)邏輯運算
這種類型的運算比較簡單,共有三種:與(and)、或(or)、非(not)。
# 代碼6:邏輯運算代碼樣例
# 與(and)運算只有二者都是True返回值纔是True。
a14 = True and True
print('a14 = ', a14)
a15 = True and False
print('a15 = ', a15)
# 或(or)運算只要有其中一方爲True,運算結果就是True。
a16 = True or False
print('a16 = ', a16)
a17 = False or False
print('a17 = ', a17)
# 非(not)運算直接反轉布爾值。
a18 = not True
print('a18 = ', a18)
本地輸出:
a14 = True
a15 = False
a16 = True
a17 = False
a18 = False
(5)成員運算
這是針對Python裏面較爲複雜的數據結構而設立的一種運算,主要面向元組、列表和字典。通過運算符in詢問是否有某個元素在元組或者列表裏出現,或者檢視某個鍵(key)是否在字典裏存在。
# 代碼7:成員運算代碼樣例
# 將一個列表賦值給變量l,一個元組賦值給變量t,一個字典賦值給變量d。
l = [1, 'abc', 0.4]
t = (1, 'abc', 0.4)
d = {1: '1', 'abc': 0.1, 0.4: 80}
# 試圖詢問1列表中是否有0.4。
a19 = 0.4 in l
print('a19 = ', a19)
# 試圖詢問t元組中是否有1。
a20 = 1 in t
print('a20 = ', a20)
# 試圖詢問字典d中是否有鍵'abc'。
a21 = 'abc' in d
print('a21 = ', a21)
# in只能用來考量是否有鍵(key),不能告訴您是否有值(value)。
a22 = 0.1 in d
print('a22 = ', a22)
本地輸出:
a19 = True
a20 = True
a21 = True
a22 = False
4、Python流程控制
(1)分支語句(if)
解釋器會依次詢問if與elif後面的布爾值或者反饋布爾值的表達式,一旦其中任何一個爲真,便會執行對應的多行分支語句;如果其中沒有任何一個爲真,則執行else對應的語句。
常用幾種語法結構如下:
if 布爾值/表達式:
【製表符】執行分支1(可以有多行,都需要製表符縮進)
【製表符】……
else:
【製表符】執行分支2(可以有多行,都需要製表符縮進)
【製表符】……
或者
if 布爾值/表達式:
【製表符】執行分支1(可以有多行,都需要製表符縮進)
【製表符】……
elif 布爾值/表達式:
【製表符】執行分支2(可以有多行,都需要製表符縮進)
【製表符】……
else:
【製表符】執行分支3(可以有多行,都需要製表符縮進)
【製表符】……
# 代碼8:分支語句代碼樣例
# 首先將True的布爾值賦予變量b。
b = True
# 然後使用分支語句if else組合。
if b:
print("It's True!")
else:
print("It's False!")
# 接着使用分支語句if elif else組合,將False的布爾值賦予變量b,True賦予變量c。
b = False
c = True
if b:
print("b is True!")
elif c:
print("c is True!")
else:
print("Both are False!")
# 將False的布爾值賦予變量b,False賦予變量c,重複一遍,觀察結果。
b = False
c = False
if b:
print("b is True!")
elif c:
print("c is True!")
else:
print("Both are False!")
本地輸出:
It's True!
c is True!
Both are False!
(2)循環控制(for)
在執行循環語句時,臨時變量會逐個獲得可遍歷數據結構中的值;每獲取到其中一個值之後,製表符縮進的所有語句會執行一次。
常見的一種遍歷語法如下:
for 臨時變量 in 可遍歷數據結構(列表、元組、字典)
【製表符】執行語句(可以有多行,都需要製表符縮進)
【製表符】……
# 代碼9:循環語句代碼樣例
# 對字典d的鍵進行循環遍歷,輸出每組鍵值對。
d = {1: '1', 'abc': 0.1, 0.4: 80}
for k in d:
print(k, ":", d[k])
本地輸出:
1 : 1
abc : 0.1
0.4 : 80
5、Python函數(模塊)設計
在對函數/模塊的設計方面,我們可以向函數提供必要的參數輸入,同時可以從函數/模塊獲取所需的返回值。Python採用def這個關鍵詞來定義一個函數/模塊。
# 代碼10:函數定義和調用代碼樣例
# 定義一個名叫foo的函數,傳入參數x。
def foo(x):
# 爲x執行平方運算,返回所得的值,同時注意函數體內部所有代碼一律縮進。
return x ** 2
# 調用函數foo,傳入參數值爲8.0,觀察輸出,結果爲64.0。
a23 = foo(8.0)
print('a23 = ', a23)
本地輸出:
a23 = 64.0
6、Python編程庫(包)的導入
有一些編程庫默認配置在Python最基本的解釋器環境中,這些是我們經常要用到的;也有一些是其他編程愛好者所開發,發佈在PyPI(Python Package Index)平臺上,這些需要我們自主安裝。實際使用中,哪怕是執行一些相對簡單的數學運算,我們甚至都能在Python語言的內置程序庫中找到可以導入(import)並且使用的包。
# 代碼11:程序庫/工具包導入代碼示例
# 直接使用import導入math工具包。
import math
# 調用math包下的函數exp求自然指數。
a24 = math.exp(2)
print('a24 = ', a24)
# 從(from)math工具包裏指定導入exp函數。
from math import exp
# 直接使用函數名稱調用exp,不需要聲明math包。
a25 = exp(2)
print('a25 = ', a25)
# 從(from)math工具包裏指定導入exp函數,並且對exp重新命名爲ep。
from math import exp as ep
# 使用函數exp的臨時替代名稱調用。
a26 = ep(2)
print('a26 = ', a26)
本地輸出:
a24 = 7.38905609893065
a25 = 7.38905609893065
a26 = 7.38905609893065
7、Python基礎綜合實踐
# 代碼12:“良/惡性乳腺癌腫瘤預測”完整代碼樣例
# 導入pandas工具包,並且更名爲pd。
import pandas as pd
# 調用pandas工具包的read_csv函數/模塊,傳入訓練文件地址參數,獲得返回的數據並且存至變量df_train。
df_train = pd.read_csv('../Datasets/Breast-Cancer/breast-cancer-train.csv')
# 調用pandas工具包的read_csv函數/模塊,傳入測試文件地址參數,獲得返回的數據並且存至變量df_test。
df_test = pd.read_csv('../Datasets/Breast-Cancer/breast-cancer-test.csv')
# 選取'Clump Thickness'與'Ceil Size'作爲特徵,構建測試集中的正負分類樣本。
df_test_negative = df_test.loc[df_test['Type'] == 0][['Clump Thickness', 'Cell Size']]
df_test_positive = df_test.loc[df_test['Type'] == 1][['Clump Thickness', 'Cell Size']]
# 導入matplotlib工具包中的pyplot並簡化命名爲plt。
import matplotlib.pyplot as plt
# 繪製圖1-2中的良性腫瘤樣本點,標記爲紅色的o。
plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
# 繪製圖1-2中的惡性腫瘤樣本點,標記爲黑色的x。
plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
# 繪製x,y軸的說明。
plt.xlabel('Clump Thickness')
plt.ylabel('Ceil Size')
# 顯示圖1-2。
plt.show()
# 導入numpy工具包,並且重命名爲np。
import numpy as np
# 利用numpy中的random函數隨機採樣直線的截距和係數。
intercept = np.random.random([1])
coef = np.random.random([2])
lx = np.arange(0, 12)
ly = (-intercept - lx * coef[0]) / coef[1]
# 繪製一條隨機直線。
plt.plot(lx, ly, c='yellow')
# 繪製圖1-3。
plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
plt.xlabel('Clump Thickness')
plt.ylabel('Ceil Size')
plt.show()
# 導入sklearn中的邏輯斯蒂迴歸分類器。
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
# 使用前10條訓練樣本學習直線的係數和截距。
lr.fit(df_train[['Clump Thickness', 'Cell Size']][:10], df_train['Type'][:10])
print('Testing accuracy (10 training samples):', lr.score(df_test[['Clump Thickness', 'Cell Size']], df_test['Type']))
intercept = lr.intercept_
coef = lr.coef_[0, :]
# 原本這個分類面應該是lx * coef[0] + ly * coef[1] + intercept = 0,映射到2維平面上之後,應該是:
ly = (-intercept - lx * coef[0]) / coef[1]
# 繪製圖1-4。
plt.plot(lx, ly, c='green')
plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
plt.xlabel('Clump Thickness')
plt.ylabel('Ceil Size')
plt.show()
lr = LogisticRegression()
# 使用所有訓練樣本學習直線的係數和截距。
lr.fit(df_train[['Clump Thickness', 'Cell Size']], df_train['Type'])
print('Testing accuracy (all training samples):', lr.score(df_test[['Clump Thickness', 'Cell Size']], df_test['Type']))
intercept = lr.intercept_
coef = lr.coef_[0, :]
ly = (-intercept - lx * coef[0]) / coef[1]
# 繪製圖1-5。
plt.plot(lx, ly, c='blue')
plt.scatter(df_test_negative['Clump Thickness'], df_test_negative['Cell Size'], marker='o', s=200, c='red')
plt.scatter(df_test_positive['Clump Thickness'], df_test_positive['Cell Size'], marker='x', s=150, c='black')
plt.xlabel('Clump Thickness')
plt.ylabel('Ceil Size')
plt.show()
本地輸出:具體本地輸出請參照https://blog.csdn.net/wyatt007/article/details/105530565。