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中的身份運運算元包括isis not,用於檢查兩個物件是否為同一物件(具有相同的記憶體位置)。這些運運算元在需要判斷兩個變數是否指向同一物件時非常有用。

成員運運算元

成員運運算元用於檢查某個值或變數是否屬於某個序列。Python中的序列可以是列表、元組、字典、集合等。在下一節中,我們將更深入地探討這些資料結構。

條件陳述式

條件陳述式是Python中用於控制程式流程的重要結構。它們允許開發者根據條件執行不同的程式碼塊。Python中的條件陳述式包括ifelifelse

  • if陳述式:用於評估某個條件,如果條件為真,則執行該陳述式塊中的程式碼。
  • elif陳述式:是else if的簡寫形式,當前一個條件不成立時,會評估elif後面的條件,如果成立,則執行該陳述式塊中的程式碼。
  • else陳述式:不需要條件,當所有前面的條件都不成立時,會執行else陳述式塊中的程式碼。

迴圈

迴圈是Python中用於重複執行某段程式碼的結構。Python提供了兩種迴圈:whilefor

  • while迴圈:當某個條件為真時,會重複執行迴圈中的程式碼,直到條件不成立。
  • for迴圈:主要用於遍歷序列(如列表、元組、字典、集合等),對序列中的每個元素執行一次迴圈中的程式碼。

基本資料結構

Python提供了多種基本資料結構,用於組織和儲存資料。這些資料結構包括:

  1. 列表(List):可變的有序集合。
  2. 元組(Tuple):不可變的有序集合。
  3. 字典(Dictionary):無序的鍵值對集合。
  4. 集合(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()
    }

此圖表展示了AnimalBirds兩個類別之間的繼承關係,同時也顯示了各自的屬性和方法。這種視覺化可以幫助我們更好地理解類別之間的關係和繼承機制。

物件導向程式設計:繼承與多型

繼承的概念

在物件導向程式設計中,繼承是一種機制,允許程式設計師根據已有的類別(父類別)建立新的類別(子類別)。子類別繼承父類別的所有屬性和方法,並可以增加新的屬性和方法或覆寫父類別的方法。

實作繼承

以下是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_legscolor,以及一個方法 make_sound
  • 子類別 Bird 繼承了 Animal 類別,並增加了自己的屬性 can_fly 和方法 make_sound
  • Bird 類別的 __init__ 方法中,我們使用 super().__init__(num_of_legs, color) 呼叫父類別的 __init__ 方法,以初始化 num_of_legscolor 屬性。
  • 子類別 Birdmake_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 圖表描述了 AnimalBird 類別之間的繼承關係。
  • Animal 類別有兩個屬性:num_of_legscolor,以及一個方法 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 有幾個重要的屬性,包括 shapesizendim

  • 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() 函式的格式字串來設定基本格式,例如顏色、標記和線型。另外,可以使用 linewidthmarkersize 屬性來設定線寬和標記大小。

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的使用,並逐步深入探索機器學習和深度學習的相關知識。隨著技術社群的蓬勃發展,我們預見更多便捷的工具和框架將不斷湧現,進一步簡化人工智慧開發流程,加速人工智慧技術的普及應用。玄貓認為,持續學習和實踐是掌握人工智慧技術的關鍵,唯有不斷精進,才能在這個快速發展的領域保持競爭力。