Python 程式語言近年來在資料科學和機器學習領域廣受歡迎,其簡潔易學的特性,讓許多初學者也能快速上手。本文將從 Google Colab 的使用開始,逐步介紹 Python 的基礎語法,包含變數、資料型別、運運算元、控制結構、資料結構、函式以及物件導向程式設計。接著,我們將會探討 NumPy 函式庫的基礎應用,以及如何使用 Matplotlib 進行資料視覺化。這些都是 Python 程式設計的重要基本,對於後續學習機器學習等進階主題至關重要。
使用Google Colab
在本章中,我們將使用Google Colab來撰寫和執行Python程式碼。Colab是一個根據雲端的平臺,提供了一個免費的環境讓我們可以撰寫和執行Python程式碼。後續章節中,我們將更深入地探討Colab的功能和使用方法。
變數和資料型別
在程式設計中,變數是用來儲存資料的容器。Python的變數不需要事先宣告其資料型別,當我們指定給變數時,Python會自動判斷其資料型別。讓我們建立一些變數,然後印出其值。
# 宣告變數
a = 10 # 整數
pi = 3.14 # 浮點數
st = "Hello, World!" # 字串
# 印出變數值
print(a)
print(pi)
print(st)
###註解
註解是程式設計中非常重要的一部分,它可以增加程式碼的可讀性和維護性。在Python中,我們可以使用#
符號來建立單行註解,或者使用三個雙引號("""
)來建立多行註解。
# 單行註解
# 這是一個單行註解
"""
多行註解
這是一個多行註解
"""
資料型別
Python提供了多種內建的資料型別,包括整數、浮點數、複數、字串和布林值等。讓我們看看如何使用這些資料型別。
# 整數
a = 10
print(type(a)) # 印出資料型別
# 浮點數
pi = 3.14
print(type(pi)) # 印出資料型別
# 複數
c = 3 + 4j
print(type(c)) # 印出資料型別
# 字串
st = "Hello, World!"
print(type(st)) # 印出資料型別
# 布林值
b = True
print(type(b)) # 印出資料型別
運運算元
Python提供了多種運運算元,包括算術運運算元、比較運運算元、邏輯運運算元等。讓我們看看如何使用這些運運算元。
# 算術運運算元
a = 10
b = 3
print(a + b) # 加法
print(a - b) # 減法
print(a * b) # 乘法
print(a / b) # 除法
# 比較運運算元
a = 10
b = 3
print(a > b) # 大於
print(a < b) # 小於
print(a == b) # 等於
print(a != b) # 不等於
# 邏輯運運算元
a = True
b = False
print(a and b) # 邏輯與
print(a or b) # 邏輯或
print(not a) # 邏輯非
圖表翻譯:
graph LR A[變數] --> B[資料型別] B --> C[整數] B --> D[浮點數] B --> E[複數] B --> F[字串] B --> G[布林值] C --> H[算術運算] D --> I[比較運算] E --> J[邏輯運算]
在這個圖表中,我們可以看到變數和資料型別的關係,以及不同資料型別之間的轉換。同時,我們也可以看到算術運算、比較運算和邏輯運算的過程。
基礎運運算元與控制結構
Python是一種高階程式語言,提供了多種基礎運運算元和控制結構,以便開發者能夠撰寫出高效且易於維護的程式碼。在本文中,我們將探討Python中的身份運運算元、成員運運算元、條件陳述式、迴圈和基本資料結構。
身份運運算元
Python中的身份運運算元包括is
和is not
,用於檢查兩個物件是否為同一物件(具有相同的記憶體位置)。這些運運算元在需要判斷兩個變數是否指向同一物件時非常有用。
成員運運算元
成員運運算元用於檢查某個值或變數是否屬於某個序列。Python中的序列可以是列表、元組、字典、集合等。在下一節中,我們將更深入地探討這些資料結構。
條件陳述式
條件陳述式是Python中用於控制程式流程的重要結構。它們允許開發者根據條件執行不同的程式碼塊。Python中的條件陳述式包括if
、elif
和else
。
if
陳述式:用於評估某個條件,如果條件為真,則執行該陳述式塊中的程式碼。elif
陳述式:是else if
的簡寫形式,當前一個條件不成立時,會評估elif
後面的條件,如果成立,則執行該陳述式塊中的程式碼。else
陳述式:不需要條件,當所有前面的條件都不成立時,會執行else
陳述式塊中的程式碼。
迴圈
迴圈是Python中用於重複執行某段程式碼的結構。Python提供了兩種迴圈:while
和for
。
while
迴圈:當某個條件為真時,會重複執行迴圈中的程式碼,直到條件不成立。for
迴圈:主要用於遍歷序列(如列表、元組、字典、集合等),對序列中的每個元素執行一次迴圈中的程式碼。
基本資料結構
Python提供了多種基本資料結構,用於組織和儲存資料。這些資料結構包括:
- 列表(List):可變的有序集合。
- 元組(Tuple):不可變的有序集合。
- 字典(Dictionary):無序的鍵值對集合。
- 集合(Set):無序的唯一元素集合。
每種資料結構都有其特點和使用場景,根據具體需求選擇合適的資料結構是撰寫高效程式碼的關鍵。
範例程式碼
# 列表範例
my_list = [1, 2, 3, 4, 5]
for item in my_list:
print(item)
# 字典範例
my_dict = {'name': 'John', 'age': 30}
print(my_dict['name'])
# 集合範例
my_set = {1, 2, 3, 4, 5}
print(my_set)
內容解密:
上述程式碼展示瞭如何使用Python的基本資料結構。列表是可變的,有序集合;字典是無序的鍵值對集合;集合是無序的唯一元素集合。瞭解每種資料結構的特點和使用方法,可以幫助開發者撰寫出更高效、更易於維護的程式碼。
圖表翻譯:
graph LR A[列表] --> B[字典] B --> C[集合] C --> D[程式碼] D --> E[輸出]
此圖表展示了Python基本資料結構之間的關係,以及如何使用它們撰寫程式碼並取得輸出。
Python資料結構與操作
Python是一種高階程式語言,提供了多種資料結構,包括列表(List)、元組(Tuple)、字典(Dictionary)和集合(Set)。每種資料結構都有其特點和應用場景。
列表(List)
列表是Python中最常用的資料結構之一。列表可以儲存多個值,並且可以進行增刪改查操作。列表的索引從0開始,可以使用負數索引從末尾開始計數。
# 建立一個列表
city = ["Paris", "Mumbai", "New York", "London", "Tokyo"]
# 存取列表元素
print(city[0]) # Paris
print(city[-1]) # Tokyo
# 切片
print(city[1:3]) # ["Mumbai", "New York"]
# 列表操作
city.append("Beijing")
print(city) # ["Paris", "Mumbai", "New York", "London", "Tokyo", "Beijing"]
city.insert(2, "Shanghai")
print(city) # ["Paris", "Mumbai", "Shanghai", "New York", "London", "Tokyo", "Beijing"]
元組(Tuple)
元組與列表類別似,但元組是不可變的,不能進行增刪改查操作。
# 建立一個元組
weekdays = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
# 存取元組元素
print(weekdays[0]) # Monday
print(weekdays[-1]) # Friday
# 切片
print(weekdays[1:3]) # ("Tuesday", "Wednesday")
字典(Dictionary)
字典是一種鍵值對的資料結構,鍵是唯一的,值可以重複。
# 建立一個字典
person = {"name": "John", "age": 30, "city": "New York"}
# 存取字典元素
print(person["name"]) # John
print(person["age"]) # 30
# 更新字典元素
person["age"] = 31
print(person) # {"name": "John", "age": 31, "city": "New York"}
# 刪除字典元素
del person["city"]
print(person) # {"name": "John", "age": 31}
集合(Set)
集合是一種無序的資料結構,元素是唯一的。
# 建立一個集合
fruits = {"apple", "banana", "orange"}
# 存取集合元素
print(fruits) # {"apple", "banana", "orange"}
# 增加元素
fruits.add("grape")
print(fruits) # {"apple", "banana", "orange", "grape"}
# 刪除元素
fruits.remove("banana")
print(fruits) # {"apple", "orange", "grape"}
字串(String)
字串是一種序列型的資料結構,元素是字元。
# 建立一個字串
hello = "Hello, World!"
# 存取字串元素
print(hello[0]) # H
print(hello[-1]) # !
# 切片
print(hello[0:5]) # Hello
# 字串操作
print(hello.upper()) # HELLO, WORLD!
print(hello.lower()) # hello, world!
結合字串
可以使用+
運運算元結合字串。
hello = "Hello, "
world = "World!"
print(hello + world) # Hello, World!
字串格式化
可以使用format()
方法格式化字串。
name = "John"
age = 30
print("My name is {} and I am {} years old.".format(name, age)) # My name is John and I am 30 years old.
Python 函式
當我們撰寫程式來執行一個大任務時,可能會有一些小任務需要反覆使用。為了避免重複撰寫這些小任務的邏輯,我們可以將這些邏輯放在一個程式碼區塊中,並重複使用這個區塊。這樣可以節省時間,同時減少程式檔案的大小。Python 提供了函式(function)來實作程式碼的重用。
建立函式
要建立一個 Python 函式,需要使用 def
關鍵字。函式可以選擇性地接受輸入引數(input arguments),這些引數是用於函式內的變數及其值。函式也可以選擇性地傳回一些值。函式的語法如下:
def 函式名稱(輸入引數):
# 函式邏輯
# 傳回陳述式
更詳細地,函式可以定義輸入引數和傳回值的資料型別:
def 函式名稱(引數: 資料型別) -> 傳回型別:
# 函式邏輯
# 傳回陳述式
函式引數
函式可以設定預設值給輸入引數,如果沒有提供值給引數時,預設值會被使用。另外,函式也可以接受不定數量的引數,使用 *args
來表示,然後在函式內部以 tuple 的形式接受引數。函式也可以接受以 key-value 形式傳遞的引數,使用 **kwargs
來表示,即使引數的順序不正確,函式仍然可以正確地接收到值。
物件導向設計
物件導向程式設計是一種模型,旨在實作真實世界的實體。這些實體被定義為具有唯一屬性和行為的物件。這種模型在處理、擴充套件和組織大型複雜程式方面非常有效。它還提供了易於維護和閱讀的程式碼。 Python 是一種物件導向程式設計語言。任何真實世界的實體都可以被寫成物件,例如球、樹、房子、燈泡、車等。每個物件都有一些唯一的屬性(如形狀、顏色等)和功能。
類別和物件
類別(class)是具有相似屬性和功能的物件集合。類別是一種使用者定義的資料型別,可以被視為物件的藍圖。物件(object)是類別的例項。一旦建立物件,就可以存取類別內定義的變數和函式。
方法
方法(method)是定義在類別內的函式,描述了物件的行為。例如,Animal
類別可能有 make_sound()
函式。
定義類別
在 Python 中,可以使用 class
關鍵字定義類別。相同的類別名稱可以用來建立物件。類別方法的第一個輸入引數用於存取類別變數或屬性,通常使用 self
作為第一個輸入引數。每個 Python 類別都有一個名為 __init__
的函式,這相當於其他物件導向語言(如 Java、C++ 等)的建構函式。這個函式在類別被例項化時總是被執行,因此我們使用這個 __init__
函式來為物件的屬性或功能指定。
以下是示例程式碼:
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def make_sound(self):
print("動物發出聲音")
dog = Animal("狗", 3)
print(dog.name) # 輸出:狗
dog.make_sound() # 輸出:動物發出聲音
圖表翻譯:
classDiagram Animal <|-- Dog Animal : +__init__(name, age) Animal : +make_sound() Dog : -name: string Dog : -age: int
這個圖表展示了 Animal
類別和 Dog
物件之間的關係,以及 Animal
類別的方法和屬性。
物件導向程式設計中的繼承原理
在物件導向程式設計中,繼承是一個非常重要的概念。它允許我們建立一個新類別(子類別),並從現有的類別(父類別)繼承其屬性和方法。這種機制可以幫助我們建立更真實的父子關係,並提高程式碼的可重複使用性。
繼承的實作
在Python中,我們可以使用繼承原理來建立子類別。下面的例子展示瞭如何建立一個名為Birds
的子類別,該類別繼承自Animal
父類別。子類別會繼承父類別的所有方法和屬性,包括父類別的__init__
方法。然而,如果我們在子類別中定義自己的__init__
方法,則會覆寫父類別的__init__
方法。
# 父類別
class Animal:
def __init__(self, num_of_legs, color):
self.num_of_legs = num_of_legs
self.color = color
# 子類別
class Birds(Animal):
def __init__(self, num_of_legs, color, beak_color):
super().__init__(num_of_legs, color) # 呼叫父類別的__init__方法
self.beak_color = beak_color # 增加額外的屬性
def fly(self): # 增加額外的方法
print("鳥可以飛")
# 示例使用
bird = Birds(2, "黑色", "紅色")
print(bird.num_of_legs) # 輸出:2
print(bird.color) # 輸出:黑色
print(bird.beak_color) # 輸出:紅色
bird.fly() # 輸出:鳥可以飛
內容解密:
在上面的例子中,我們定義了一個名為Animal
的父類別和一個名為Birds
的子類別。子類別Birds
繼承自父類別Animal
,並增加了額外的屬性beak_color
和方法fly
。我們使用super().__init__(num_of_legs, color)
來呼叫父類別的__init__
方法,確保父類別的屬性被初始化。這種方式可以幫助我們保持父類別的屬性和方法,並增加子類別特有的功能。
圖表翻譯:
classDiagram Animal <|-- Birds class Animal { - num_of_legs: int - color: str + __init__(num_of_legs: int, color: str) } class Birds { - beak_color: str + __init__(num_of_legs: int, color: str, beak_color: str) + fly() }
此圖表展示了Animal
和Birds
兩個類別之間的繼承關係,同時也顯示了各自的屬性和方法。這種視覺化可以幫助我們更好地理解類別之間的關係和繼承機制。
物件導向程式設計:繼承與多型
繼承的概念
在物件導向程式設計中,繼承是一種機制,允許程式設計師根據已有的類別(父類別)建立新的類別(子類別)。子類別繼承父類別的所有屬性和方法,並可以增加新的屬性和方法或覆寫父類別的方法。
實作繼承
以下是Python中實作繼承的範例:
# 定義父類別 "Animal"
class Animal:
def __init__(self, num_of_legs, color):
self.num_of_legs = num_of_legs
self.color = color
def make_sound(self, sound):
print(f"This animal makes a {sound} sound.")
# 定義子類別 "Bird" 繼承父類別 "Animal"
class Bird(Animal):
def __init__(self, num_of_legs, color, can_fly=True):
self.can_fly = can_fly
# 呼叫父類別的 __init__ 方法
super().__init__(num_of_legs, color)
# 覆寫父類別的 make_sound 方法
def make_sound(self, sound):
print(f"This bird makes a {sound} sound.")
# 建立 Bird 物件
bird = Bird(2, "blue", True)
# 呼叫 make_sound 方法
bird.make_sound("chirp")
內容解密:
- 在上述範例中,我們定義了父類別
Animal
,它有兩個屬性:num_of_legs
和color
,以及一個方法make_sound
。 - 子類別
Bird
繼承了Animal
類別,並增加了自己的屬性can_fly
和方法make_sound
。 - 在
Bird
類別的__init__
方法中,我們使用super().__init__(num_of_legs, color)
呼叫父類別的__init__
方法,以初始化num_of_legs
和color
屬性。 - 子類別
Bird
的make_sound
方法覆寫了父類別的同名方法,實作了多型。
圖表翻譯:
classDiagram Animal <|-- Bird class Animal { - num_of_legs: int - color: str + make_sound(sound: str) } class Bird { - can_fly: bool + make_sound(sound: str) }
圖表說明:
- 上述 Mermaid 圖表描述了
Animal
和Bird
類別之間的繼承關係。 Animal
類別有兩個屬性:num_of_legs
和color
,以及一個方法make_sound
。Bird
類別繼承了Animal
類別,並增加了自己的屬性can_fly
和方法make_sound
。
物件導向程式設計與 NumPy 入門
類別繼承與多型
在物件導向程式設計中,類別繼承是一個重要的概念。它允許子類別繼承父類別的屬性和方法,並且可以新增或覆寫父類別的方法。這使得程式碼更加模組化和可重用。
例如,假設我們有一個父類別 Animal
,它有一個 make_sound
方法。然後,我們可以建立一個子類別 Bird
,它繼承自 Animal
並覆寫 make_sound
方法。這樣,Bird
類別就可以有自己的 make_sound
實作。
class Animal:
def make_sound(self):
print("動物發出聲音")
class Bird(Animal):
def make_sound(self):
print("鳥兒啁啾")
NumPy 入門
NumPy 是一個 Python 函式庫,提供了高效的數值計算和資料處理功能。它是大多數科學計算和資料分析任務的基礎。
安裝 NumPy
要使用 NumPy,您需要先安裝它。您可以使用 pip 安裝 NumPy:
pip install numpy
基本使用
NumPy 的主要資料結構是多維陣列(ndarray)。您可以使用 np.array()
函式建立一個 ndarray。
import numpy as np
# 建立一個 ndarray
arr = np.array([1, 2, 3, 4, 5])
print(arr)
ndarray 屬性
ndarray 有幾個重要的屬性,包括 shape
、size
和 ndim
。
shape
: 傳回 ndarray 的形狀,例如(3,)
表示一個一維陣列,有 3 個元素。size
: 傳回 ndarray 中的元素總數。ndim
: 傳回 ndarray 的維度數。
import numpy as np
# 建立一個 ndarray
arr = np.array([1, 2, 3, 4, 5])
# 印出 shape、size 和 ndim
print(arr.shape) # (5,)
print(arr.size) # 5
print(arr.ndim) # 1
矩陣運算
NumPy 支援多種矩陣運算,包括加、減、乘、除等。
import numpy as np
# 建立兩個 ndarray
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# 進行矩陣加法
result = arr1 + arr2
print(result) # [5 7 9]
轉置
轉置是一種重要的矩陣運算,它可以將矩陣的行和列互換。
import numpy as np
# 建立一個 ndarray
arr = np.array([[1, 2], [3, 4]])
# 進行轉置
result = arr.T
print(result)
# [[1 3]
# [2 4]]
矩陣乘法
NumPy 支援矩陣乘法,您可以使用 @
運運算元或 np.matmul()
函式進行矩陣乘法。
import numpy as np
# 建立兩個 ndarray
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
# 進行矩陣乘法
result = arr1 @ arr2
print(result)
# [[19 22]
# [43 50]]
NumPy 和 Matplotlib 的基礎應用
矩陣乘法
NumPy 支援矩陣乘法,只要兩個矩陣的列數和行數相等即可進行乘法。這種相容性是指第一個矩陣的列數必須與第二個矩陣的行數相同。NumPy 的 dot()
函式可以進行矩陣乘法。另外,Python 3.5 引入了 @
符號來表示矩陣乘法。
import numpy as np
# 定義兩個矩陣
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
# 進行矩陣乘法
result = np.dot(matrix1, matrix2)
print(result)
數字生成
NumPy 提供了多種方式來生成數字序列。例如,arange()
函式可以生成一個指定範圍內的等間距數值序列,linspace()
函式可以生成指定範圍內的等間距數值序列,random.rand()
函式可以生成隨機數值序列,random.randn()
函式可以生成標準常態分佈的隨機數值序列,zeros()
函式可以生成零值序列,ones()
函式可以生成一值序列。
import numpy as np
# 使用 arange() 生成等間距數值序列
numbers = np.arange(1, 10, 2)
print(numbers)
# 使用 linspace() 生成等間距數值序列
numbers = np.linspace(1, 10, 5)
print(numbers)
# 使用 random.rand() 生成隨機數值序列
numbers = np.random.rand(5)
print(numbers)
# 使用 random.randn() 生成標準常態分佈的隨機數值序列
numbers = np.random.randn(5)
print(numbers)
# 使用 zeros() 生成零值序列
numbers = np.zeros(5)
print(numbers)
# 使用 ones() 生成一值序列
numbers = np.ones(5)
print(numbers)
Matplotlib 的基礎應用
Matplotlib 是一個 Python 的資料視覺化函式庫,可以用來建立二維視覺化圖表。它是 Python 程式設計師的一個有用工具,因為它可以將資料轉換為易於理解的視覺化圖表。這些視覺化圖表對於瞭解資料、除錯 AI 模型、衡量模型效能、呈現預測結果等方面非常重要。
import matplotlib.pyplot as plt
# 定義 x 和 y 座標
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 繪製圖表
plt.plot(x, y)
plt.show()
格式化圖表
Matplotlib 提供了多種方式來格式化圖表。例如,可以使用 plot()
函式的格式字串來設定基本格式,例如顏色、標記和線型。另外,可以使用 linewidth
和 markersize
屬性來設定線寬和標記大小。
import matplotlib.pyplot as plt
# 定義 x 和 y 座標
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
# 繪製圖表
plt.plot(x, y, 'bo-')
plt.show()
繪製多個圖表
Matplotlib 提供了多種方式來繪製多個圖表。例如,可以使用 plot()
函式多次來繪製多個圖表。另外,可以使用 subplot()
函式來繪製多個圖表在同一個圖表中。
import matplotlib.pyplot as plt
# 定義 x 和 y 座標
x = [1, 2, 3, 4, 5]
y1 = [1, 4, 9, 16, 25]
y2 = [2, 5, 8, 11, 14]
# 繪製圖表
plt.plot(x, y1, 'bo-')
plt.plot(x, y2, 'ro-')
plt.show()
人工智慧實驗室設定
從Google Colab線上程式碼平臺的介紹、Python程式語言的基礎語法,到物件導向程式設計的核心理念,以及NumPy和Matplotlib資料處理和視覺化工具的應用,本系列文章涵蓋了建構一個基礎人工智慧實驗室的關鍵要素。觀察開發者社群的回饋,Python及其豐富的生態系已成為人工智慧領域的主流工具,其易學易用的特性有效降低了開發門檻。然而,要真正駕馭人工智慧的威力,仍需深入理解演算法原理和模型訓練技巧。對於初學者,建議聚焦於掌握Python基礎語法、熟悉NumPy和Matplotlib的使用,並逐步深入探索機器學習和深度學習的相關知識。隨著技術社群的蓬勃發展,我們預見更多便捷的工具和框架將不斷湧現,進一步簡化人工智慧開發流程,加速人工智慧技術的普及應用。玄貓認為,持續學習和實踐是掌握人工智慧技術的關鍵,唯有不斷精進,才能在這個快速發展的領域保持競爭力。