《Python機器學習及實踐:從零開始通往Kaggle競賽之路》第1章 簡介篇 學習筆記(二)1.4Python編程基礎總結

目錄

1.4Python編程基礎

1、Python基本語法

(1)一段正確運行的Python代碼

(2)一段錯誤運行的代碼

(3)小結

2、Python數據類型

(1)數字(Number)

(2)布爾值(Boolean)

(3)字符串(String)

(4)元組(Tuple)

(5)列表(List)

(6)字典(Dictionary)

3、Python數據運算

(1)算術運算

(2)比較運算

(3)賦值運算

(4)邏輯運算

(5)成員運算

4、Python流程控制

(1)分支語句(if)

(2)循環控制(for)

5、Python函數(模塊)設計

6、Python編程庫(包)的導入

7、Python基礎綜合實踐


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章