Python 基礎一

Python 簡介

Python 是當前最流行的程式語言之一。由 Guido van Rossum 創建,並於1991年發布。Python 擁有動態型別系統和垃圾回收功能,能夠自動管理記憶體,並且支援包括物件導向、命令式、函數式和程序式程式,其本身擁有廣泛的標準庫,並可以在大部分的作業系統中執行。

Python可用於:

  • Web開發(伺服端)。
  • 軟體開發。
  • 數學。
  • 系統腳本。

Python 的用途:

  • 可以在伺服端上創建Web應用程序。
  • 可以連接資料庫系統,還可以讀取和修改文件,以及在網路上爬取資料。
  • 可以用來處理大數據並進行複雜的數學運算。
  • 可以用於快速原型,或用於套件型軟件的開發。

Python 執行環境

搭積木學 Python

桌機執行環境

  • Anaconda
    Anaconda 為目前最受歡迎的 Python 平台,擁有超過1400個適用於不同作業系統環境下的軟件包和虛擬環境管理器,對於 Python 的安裝、執行及升級都變得簡單快速。

  • Miniconda
    Miniconda 則是精簡版的 Anaconda,可以讓使用者自行加裝所需的軟件包,避免占用過大的硬碟空間,但只適合有經驗的使用者,初學者仍建議安裝 Anaconda。

手機執行環境

  • Pydroid 3
    Pydroid 3是一套在 Android 上執行,易於使用且功能强大的 Python 編輯軟體。

線上執行環境

  • Jupyter Notebook
    Jupter Notebook 是一個方便同時用來編輯 Markdown及HTML文件的編輯器,同時又具有Python等程式語言的編輯及執行環境,可充分利用其直譯式的特性編寫程式,並達到高互動執行結果,且容易呈現視覺化的執行結果。

  • Microsoft Azure Notebooks
    Microsoft Azure Notebooks 則是 Jupter Notebook 加上雲端硬碟的功能,讓使用者可以隨時隨地的編輯 Python 程式,Microsoft Azure Notebooks的操作流程如下:

    1. 登入 Microsoft 帳號 (若無帳號則新增帳號)
    2. 點選 My Project
    3. 點選 + New Project,在Project Name中輸入專案名稱
    4. 點選專案名稱
    5. 點選 + 中的 Notebook
      新增 Python 3.6 Notebook
    6. 點選新增的 .ipynb 檔案,開啓Python 線上執行環境
    7. 鍵入 print('Hello'),按 Ctrl-Enter 開始執行

Jupter Notebook簡介

Jupyter Notebook是一個以Web為基礎的交互式計算環境,可用於創建Jupyter Notebook文檔,該文檔可以轉換為許多的開源標準輸出格式,如HTML、演示幻燈片、PDF、Markdown、Python等。

在Jupyter Notebook裡面,程式是以區塊去執行,程式碼會分成好幾個區塊,每個區塊可以各自去執行,也可以一次執行多個區塊來看執行結果,每個執行區塊可以設定四種狀態:

狀態 説明
Code 用於編輯程式碼,如 Python
Markdown 用於編輯 Markdown1 文件
Raw NBConvert 可用於轉換成另一種格式(如 HTML2) 的命令列工具
Heading 建議使用Markdown的標題功能取代

  1. Markdown 學習課程
  2. HTML 學習課程

Jupter Notebook快捷鍵

Jupyter Notebook 的模式分爲命令編輯執行等模式:

  • 命令模式:區塊會以藍色框線包圍,為預設模式,可以用來操作區塊,包含移動區塊、增刪區塊等。
  • 編輯模式:區塊會以綠色框線包圍,可以在區塊中編輯 Markdown 文件或程式碼。
  • 執行模式:按 Ctrl-Enter 鍵可以顯示執行結果。

使用鍵盤切換模式小技巧(→代表切換模式)

  • 編輯模式:按 Enter 鍵
  • 執行模式:按 Ctrl-Enter 鍵
  • 編輯模式命令模式:按 Esc 鍵

使用滑鼠切換模式小技巧

  • 編輯模式:點選右邊區塊
  • 命令模式:點選左邊空白區塊
    Markdown 執行模式要快點二次
  • 執行模式:點選選單[Cell]→[Run Cells]

一般快捷鍵

快捷鍵 作用
Ctrl-Enter 執行區塊
Shift-Enter 執行區塊,並移到下個區塊
Alt-Enter 執行區塊,並插入新區塊
Ctrl-S 存檔

命令模式快捷鍵Y

快捷鍵 作用
Y 區塊切換為 Code 狀態
M 區塊切換為 Markdown 狀態
R 區塊切換為 Raw NBConvert 狀態
A 在上方插入新區塊
B 在下方插入新區塊
DD 刪除選中的區塊
X 剪下選中的區塊
C 複製選中的區塊
V 貼到下方區塊
Z 恢復最後一個刪除的區塊
Shift-M 合併選中的區塊
Up ↑ 選中上方區塊
Down ↓ 選中下方區塊

編輯模式快捷鍵

快捷鍵 作用
Esc 切換到命令模式
Tab 縮排
Shift-Tab 反縮排
Ctrl-Z 復原
Ctrl-Shift-Z 重做
Ctrl-Left 跳到左邊一個字首
Ctrl-Right 跳到右邊一個字首
Ctrl-Backspace 刪除前面一個字
Ctrl-Delete 刪除後面一個字
Ctrl-Shift - 分割區塊

Python 基本語法

Python 可以在服務器上創建 python(.py)文件,然後在命令行中執行。或直接在命令行中編寫程式碼來執行Python:

In [32]:
print('你好!')
你好!

print()常用於輸出字串或變數,預設會在末尾補上換行符號:

In [2]:
print('你好!')
print('你好!')
你好!
你好!

如果不想要換行,可以使用參數end:

In [34]:
print('你好!', end=' ') #改爲空格
print('你好!')
你好! 你好!

print()裡若放多個字串,預設會使用空白來串接,使用 sep 參數可以變更分隔符號。

In [35]:
print('How','are','you')
print('How','are','you',sep='_')
How are you
How_are_you

input 輸入

In [36]:
num = input("請輸入一的幸運數字:")
print("您的幸運數字是: " + num)
請輸入一的幸運數字:5
您的幸運數字是: 5

指派運算子

指派運算子(=)用於為變數設值,例如下列程式宣告了變數x,並將x設定為5,然後顯示其内容:

In [37]:
x = 5
print(x)
5

單行註解功能

Python 註解以 # 開頭,Python 執行時,註解列會被忽略:

In [41]:
# 這是註解
print("Hi!")
Hi!
Hi!

變量

變量是儲存資料的容器,與其他程式語言不同,Python 變量不需經過宣告,而是於第一次設定值時創建。

In [44]:
x = 5
print(x)
5

變量及函數命名

變量可以具有短名稱(如 x 和 y)或更具描述性的名稱(如 Year,carName,total_volume)。

Python 變量及函數命名規則:

  • 名稱必須以字母或底線字元開頭,例如:A4
  • 名稱也可以是中文,例如:面積
  • 名稱不能以數字開頭,例如:不可以是4A
  • 名稱只能包含字母、數字、底線或中文(A-z,0-9和_)
  • 名稱區分大小寫
  • 不能使用保留字及關鍵字
  • 當名稱是由二個或多個單字連結在一起時,建議利用「駝峰式大小寫」來表示,可以增加可讀性:
    1. 小駝峰式命名法:例如:carNametotalVolume
    2. 大駝峰式命名法:例如:CarNameTotalVolume

變量的輸出

變量的輸出可以採用 print 語句,透過逗號將多個變數或常數串接,例如:

In [4]:
x = 5
print(x)  #顯示變數内容
5
In [2]:
x = 5
y = 10
z = x + y  #數值相加
print(z)
15
In [5]:
x = 'Python'       
y = '你好'
print(x, y, '這是輸出')
Python 你好 這是輸出

Python 資料類型

變數可以儲存不同類型的資料,Python 變數具有以下的資料類型:

字串: str
數值: intfloat、complex
布林: bool
序列: listtuplerange
字典: dict
集合: set、frozenset
二進制:bytes、bytearray、memoryview

字串

Python的字串可以是用單引號(')或雙引號(")括起來的文字。

"Hello" 與 'Hello' 是相同的。

可以使用 print() 函數來顯示字串。

In [51]:
print("Hello")
print('Hello')
Hello
Hello

字串的串接

字串的串接可以使用 + 號,例如:

In [52]:
x = 'Python '       
y = '你好'
z = x + y #字串串接
z
Out[52]:
'Python 你好'

但 + 符號,不可以混合不同形態的資料運算,例如:

x = 'Python'       
y = 10
z = x + y #字串+整數
print(z)
      1 x = 'Python'  
      2 y = 10  
----> 3 z = x + y  
      4 print(z)  
TypeError: can only concatenate str (not "int") to str  
類型錯誤:只能連接字串(不是“整數”)到字串

重複的字串

重複的字串可以使用 * 號,例如:

In [53]:
print("重複" * 3)
print(3 * "重複")
重複重複重複
重複重複重複

跳脫字元

要在字串中插入特殊字元或已被語法使用的符號,須使用跳脫字元。跳脫字元是以反斜線\ 加上要插入的字元構成。例如要在雙引號包圍的字串中使用雙引號,則會出現錯誤,要解決此問題,須使用跳脫字元 \"
常用的跳脫字元列表如下:

程式碼 結果 説明
\' ' 單引號
\" " 雙引號
\\ \ 反斜線

常用的跳脫字元(控制字元)列表如下:

程式碼 結果 ASCII縮寫
\n 換行 LF
\r 歸位 CR
\t 水平Tab HT
\v 垂直Tab VT
\f 跳頁 FF
\b 退格鍵 BS

要在字串中使用引號會出現錯誤,須使用跳脫字元\"或\'

In [7]:
print("這是要用\"引號\"的内容")
print('這是要用\'引號\'的内容')
這是要用"引號"的内容
這是要用'引號'的内容

如要顯示多行文字,不可以使用Enter鍵

print("這是第一行
這是第二行")
SyntaxError: EOL while scanning string literal

必須透過跳脫字元\n,或是使用三個引號```

In [8]:
print("這是第一行\n這是第二行")
這是第一行
這是第二行

訪問字串的字元

透過方括號可用於訪問字串中的字元:

In [1]:
# 獲取位置 1 的字元
# 請注意第一個字元的位置為 0
a = "快樂學程式語言"
print(a[1])

切片語法

切片語法用在返回一定範圍的字串,指定開始索引和結束索引,並以冒號分隔,可取得指定範圍的字串。

In [58]:
#截取從位置 2 到位置 5(不包括 5 在內)的字串:
a = "快樂學程式語言"
print(a[2:5])
學程式

負索引

使用負索引從字串末尾開始切片:

In [59]:
#從倒數位置 5 到 3(不含2)截取字串:
a = "快樂學程式語言"
print(a[-5:-2])
學程式
In [60]:
#截取末尾 2 位字串(:後留空白)
a = "快樂學程式語言"
print(a[-2:])
語言

字串方法

In [9]:
# len():獲取字串的長度 
a = "快樂學程式語言"
print(len(a))
7
In [10]:
# 空字串的長度=0 
a = ''
print(len(a))
0
In [11]:
# strip():刪除開頭或結尾所有空格
a = " 快樂學程式語言 "
print(a.strip())
快樂學程式語言
In [12]:
# upper():返回字串的大寫形式
# lower():返回字串的小寫形式
a = "Hello, World!"
print(a.lower())
hello, world!
In [13]:
# replace():將字串替換為另一組字串
a = "Hello, World!"
print(a.replace("He", "Ja"))
Jallo, World!
In [14]:
#split(分隔符):透過分隔符將字串分割為清單
a = "Hello, World!"

# 透過分隔符 "," 分割為清單
print(a.split(","))
['Hello', ' World!']
In [15]:
#in:檢查字串中是否存在特定的子字串
#not in:檢查是否不存在特定的子字串
txt = "快樂學程式語言"
print("程式" in txt)
print("Python" not in txt)
True
True

數值

Python中有三種數值類型:

  • 整數(int)
  • 浮點數(float)
  • 複數(complex)

在為數字類型的變數賦值時會創建變數:

In [16]:
x = 1    # 整數 int
y = 1.68 # 浮點數 float
z = 1j   # 複數 complex

Int 整數是一個無限制長度的正整數或負整數(無小數):

x = 1
y = 3567891023456789
z = -3215566

浮點數是一個正數或負數,並包含一個或多個小數的數值:

x = 1.10
y = 1.0
z = -3.1416

浮點數也可以是帶有 “e” 的科學數字,以表示10的次方:

x = 35e2
y = 12E4
z = -87.8e100

集合(陣列)

Python 語言中有四種集合類型:

  • List (清單、串列):是有序且可更改的集合,允許重複的成員。
  • Tuple (序對、元組):簡單來説就是唯讀的List清單,不允許更改内容。
  • Set (集合):是無序,且無索引的集合,不可有重複的成員。
  • Dist (字典):是無序,具有索引的集合,不可有重複的成員。

選擇集合類型時,必須要了解該類型的屬性。為特定資料集選擇正確的集合類型可以提高程式的效率及安全性

清單(List)

In [17]:
fruits = ["香蕉", "蘋果", "鳳梨"]
print(fruits)
['香蕉', '蘋果', '鳳梨']
In [18]:
#通過索引號來訪問清單項目
fruits=["香蕉","蘋果","鳳梨"]
print(fruits[0])

#清單項目數 len()
print(len(fruits))
香蕉
3
In [19]:
#通過索引號來訪問清單項目
fruits=["香蕉","蘋果","鳳梨"]

#更改特定清單項目的值
fruits[2]="xxx"

#負索引, -1指的是最後一項,-2指的是倒數第二項,依此類推 
print(fruits[-1])
xxx

指定索引範圍:通過指定範圍的起點和終點來指定索引範圍。指定範圍時,返回值將是包含指定項目的新清單

In [20]:
fruits=["香蕉","蘋果","鳳梨"]

# 從索引 1 到索引 3(不包括 3)
# 第一項的 "香蕉" 的索引為 0
print(fruits[1:3])

# 省略起始值,範圍將從第一項開始
print(fruits[:2])

# 負指數範圍, 從清單末尾開始搜索
print(fruits[-2:-1])

# 從清單末尾開始搜索
print(fruits[-2:])
['蘋果', '鳳梨']
['香蕉', '蘋果']
['蘋果']
['蘋果', '鳳梨']

遍歷清單:透過 for 迴圈指令來遍歷清單所有項目

In [ ]:
fruits=["香蕉","蘋果","鳳梨"]
for fruit in fruits:
  print(fruit)

組合清單:透過 join 指令來組合所有項目成單一字串

In [22]:
fruits=["香蕉","蘋果","鳳梨"]
print(' '.join(fruits)) 
print(','.join(fruits)) 
香蕉 蘋果 鳳梨
香蕉,蘋果,鳳梨

檢查項目是否存在:透過 in 指令來確任列表中是否存在指定的項目

In [23]:
fruits=["香蕉","蘋果","鳳梨"]
if '香蕉' in fruits:
  print("有")
else:
  print("沒有")
Yes

清單項目編輯

清單項目的新增、刪除、清空

In [24]:
fruits=["香蕉", "蘋果"]

# append():將項目添加到列表的末尾
fruits.append("芒果")
print(fruits)
['香蕉', '蘋果', '芒果']
['香蕉', '奇異果', '蘋果', '芒果']
In [25]:
fruits=["香蕉","蘋果","鳳梨"]

# del:刪除索引指定的項目
del fruits[1]
print(fruits)
['香蕉', '鳳梨']
['香蕉']
In [26]:
fruits=["香蕉","蘋果","鳳梨"]

# pop(索引):刪除索引指定的項目
fruits.pop(0)
print(fruits)

# pop():如果索引空白,則刪除最後一項
fruits.pop()
print(fruits)
['蘋果', '鳳梨']
['蘋果']
In [27]:
fruits = ["香蕉", "蘋果", "鳳梨"]

# del:完全刪除列表
del fruits

# mylist已不存在,下列程式會引發錯誤
# print(fruits)  
[]

合併清單:連接兩個或多個清單,最簡單的方法是使用 + 運算子或 .extend()

In [30]:
ListA = ["a", "b", "c"]
ListB = [1, 2, 3]

ListC = ListA + ListB
print(ListC)
['a', 'b', 'c', 1, 2, 3]
In [ ]:
ListA = ["a", "b", "c"]
ListB = [1, 2, 3]

ListA.extend(ListB)
print(ListA)

清單索引值:返回指定項目的索引值(index())

In [32]:
fruits = ["香蕉","蘋果","鳳梨"]
print(fruits.index("鳳梨"))
2

反轉清單:返回反轉的清單

In [33]:
ListA = [1, 2, 3, 4]
ListA.reverse()
print(ListA)
[4, 3, 2, 1]

字典(Dict)

字典是無序,可變和具有索引的集合,以大括號括起來,具有鍵(Key)和值(Value)。

In [47]:
person = {"名字": "强森", "電話": "03-543210", "出生年": 1964 }

print(person)

# 異動項目
person["名字"]="xxx"
print(person)

# 訪問單一項目
print(person["名字"])
{'名字': '强森', '電話': '03-543210', '出生年': 1964}
{'名字': 'xxx', '電話': '03-543210', '出生年': 1964}
xxx

遍歷字典項目(for in)

In [48]:
person = {"名字": "强森", "電話": "03-543210", "出生年": 1964}

# 印出的所有值 (兩種語法)
for key in person:
  print(person[key], end=' ')

print("\n----")

for value in person.values():
  print(value, end=' ')
强森 03-543210 1964 
----
强森 03-543210 1964 
In [49]:
person = {"名字": "强森", "電話": "03-543210", "出生年": 1964}

#印出所有的索引
for key in person:
  print(key)
名字
電話
出生年

字典的下列的方法類似清單:

  • 遍歷字典鍵名(for)
  • 檢查鍵名是否存在(in)
  • 確定項目數量(len())
  • 刪除整個字典(del)
  • 清空字典(clear())
  • 複製字典(copy())

字典的下列的方法使用上有差異:

  • 新增項目,通過使用新的索引鍵並為其分配值
  • 要刪除項目,請使用 del 或 pop()
  • 連接兩個或多個集合,須使用 update()
In [52]:
person = { "名字": "强森",  "電話": "03-543210",  "出生年": 1964}

person["郵遞區號"]="300"
print(person)
{'名字': '强森', '電話': '03-543210', '出生年': 1964, '郵遞區號': '300'}
In [53]:
person = { "名字": "强森",  "電話": "03-543210",  "出生年": 1964}

#刪除具有指定鍵名的項目
person.pop("電話")
print(person)
{'名字': '强森', '出生年': 1964}
In [54]:
person = { "名字": "强森", "電話": "03-543210", "出生年": 1964}

del person["出生年"]
print(person)

# 清空項目
person.clear()
print(person)
{'名字': '强森', '電話': '03-543210'}
{}
In [55]:
person = {  "名字": "强森",  "電話": "03-543210",  "出生年": 1964}

# 製作副本
person_copy=person.copy()
person_copy["名字"]="xxx"

print(person)
print(person副本)
{'名字': '强森', '電話': '03-543210', '出生年': 1964}
{'名字': 'xxx', '電話': '03-543210', '出生年': 1964}

數學函數模組

Python 内建有許多模組,其中 math 模組内建許多數學常數及函數:

常數 説明
math.pi 圓周率
math.e 自然對數e
math.nan Not a Number
(非數值)

|math.inf|無限大|

平方根 $y = \sqrt{x}$

In [ ]:
import math
x = math.sqrt(100)
print(x)

$y = \sqrt{a^2 + b^2}$

In [67]:
import math
a = 3
b = 4
y=math.sqrt(a**2 + b**2)
print(y)
Out[67]:
5.0

y=$(\sin x)^2 + (\cos x)^2$

In [68]:
import math
x = 10
y=math.sin(x)**2 + math.cos(x)**2
print(y)
Out[68]:
1.0

溫度換算

攝氏換算華氏:$^\circ F=^\circ C \times {9 \over 5}+32$

In [ ]:
C=float(input("攝氏溫度:"))
F=C*9 / 5 + 32
print('華氏溫度=', F)

身高體重指數 (BMI) 範例

BMI值計算公式:

BMI = 體重(kg) / 身高²(m²)
正常範圍為  BMI=18.5~24
In [ ]:
# 輸入體重及身高
W=input("體重(公斤):")
H=input("身高(公分):")

W=float(W)

# 將公分轉爲公尺
H =float(H) / 100

# 計算BMI
BMI=W / pow(H, 2)
print('BMI=', BMI)

#顯示判斷結果
if(BMI < 18.5):
  print("體重過輕")
elif(BMI > 24):
  print("體重過重")
else:
  print("體重正常")

整存整付 (年)

試算公式: $\displaystyle 本利和 = 本金\times(1+年利率)^{期數}$

In [ ]:
M=float(input("請輸入本金"))
R=float(input("請輸入年利率"))
P=int(input("請輸入期數(年)"))

F=round(M*(1+R/100)**P)
print(F)

布林值

  • 布林值只有兩個值: True 或 False
  • 比較運算式運算結果會返回布林值
In [ ]:
#比較運算式
print(10 > 9)
print(10 == 9)
print(10 < 9)
  • 在 if 語句中運行的比較運算式,當結果為 True 或 False,分別會執行 if 及 else 後面的程式區塊
  • 程式區塊是以縮排來展現,不正確的縮排會造成語法或邏輯的錯誤
In [ ]:
a = 200
b = 33

if a > b:
  print("a > b")
else:
  print("a <= b")

運算子

運算子用於對變數和值執行運算,Python 將運算子分為以下幾類:

  • 算術運算子
  • 指派運算子
  • 比較運算子
  • 邏輯運算子
  • 身份運算子
  • 會員運算子

算術運算子

算術運算符與數值一起使用以執行常見的數學運算,包含:

 +(加) -(減) *(乘) /(除) %(求餘數) //(求商數) **(次方)
In [ ]:
x = 3
y = 2

print(x + y)
print(x - y)
print(x * y)
print(x / y)
In [ ]:
x = 3
y = 2

print(x % y)  #求餘數 
print(x // y) #求商數
print(2 ** y) #次方

指派運算子

指派運算子包含

運算子 範例 説明
= x = 2 x 填入 2
+= x += 2 x值加2
-= x -= 2 x值減2
*= x *= 2 x值變2倍
/= x /= 2 x值減半
%= x %= 2 x為除以2的餘數
/= x //= 2 x為除以2的商數
**= x **= 2 x=x2

指派運算子用於為變數設定值,例如:

In [ ]:
x = 5
x = x + 3
print(x)
In [ ]:
x = 5

x += 3  #相當於 x=x+3
print(x)

x -= 3  #相當於 x=x-3
print(x)
In [ ]:
x = 5

x *= 3  #相當於 x=x*3
print(x)

x /= 3  #相當於 x=x/3
print(x)
In [ ]:
x = 5
x %= 3  #除以3的餘數
print(x)
In [ ]:
x = 5
x //= 3  #除以3的商數
print(x)

比較運算子

比較運算子用於比較兩個值,包含 ==(等於) !=(不等於) >(大於) <(小於) >=(大於或等於) <=(小於或等於)

In [ ]:
x = 5
y = 3

print(x == y)
print(x != y)
In [ ]:
x = 5
y = 3

print(x > y)
print(x >= y)
In [ ]:
x = 5
y = 5

print(x < y)
print(x <= y)

邏輯運算子

邏輯運算子用於組合多個條件語句,包含 and、or、not,執行結果為布林值:

  • and 為必須所有條件都符合,才會是True
In [ ]:
print(True and True)
In [ ]:
print(True and False, end=' ')
print(False and True, end=' ')
print(False and False)
In [ ]:
x = 6
print(x > 3 and x < 10) 

or 為任一條件符合,就會是True

In [ ]:
print(True or True, end=' ')
print(True or False, end=' ')
print(False or True)
In [ ]:
print(False or False)
In [ ]:
x = 6
print(x < 3 or x > 10)
  • not 為目前結果的反向
In [ ]:
print(not True)
print(not False)
In [ ]:
x = 6

#下列兩者結果是相同的
print(not(x < 3))
print(x >= 3)

成員運算子

成員運算子 in 用於測試對像中是否存在序列中

In [ ]:
fruits = ["香蕉", "蘋果"]

print("香蕉" in fruits)
print("鳳梨" not in fruits)

條件與流程控制

條件判斷式

項目 條件判斷式
等於 a == b
不等於 a != b
小於或等於 a <= b
大於 a > b
大於或等於 a >= b

條件判斷式主要是由比較運算子構成,最常用在 if流程控制 及 while 迴圈中使用。

if 流程控制

單一條件 if

選擇結構 if 的語法如下:

if 條件式:
   縮排的程式碼(至少一列)
   縮排的程式碼

當條件式結果為True時,執行縮排的程式碼,例如:

In [1]:
score = 80
if score >= 60:
  print("及格")
及格

雙條件 if...esle

if...esle 選擇結構的語法如下:

if 條件式:
   縮排的程式碼(至少一列)
else:
   縮排的程式碼(至少一列)

當條件式結果為True時,執行 if 後縮排的程式碼,若爲 False 執行 else 後縮排的程式碼。

In [3]:
score = 80
if score >= 60:
  print("及格")
else:
  print("不及格")
及格

多條件 if...elif...else

if...elif...else 選擇結構的語法如下:

if 條件式A:
   縮排的程式碼(至少一列)
elif 條件式B:
   縮排的程式碼(至少一列)
elif 條件式C:
   縮排的程式碼(至少一列)
else:
   縮排的程式碼(至少一列)

elif 區塊的數量可以是無、1個或數個,其執行流程為由上而下逐一比對條件式,只要條件式結果為True時,便執行其後的縮排的程式碼,然後條離整個 if 區塊;若所有條件式都不滿足,則執行 else 後的程式碼。

In [5]:
score = 80
if score > 60:
  print("及格")
elif score == 60:
  print("剛好及格")
else:
  print("不及格")
及格

邏輯運算子and / or

if 搭配第三章所探討的邏輯運算子,可以完成更複雜的條件控制。

In [7]:
a = 200
b = 33
c = 500

if a > b and c > a:
  print("True")
else:
  print("False")

if a > b or a > c:
  print("True")
else:
  print("False")
True
True

迴圈

Python有兩個迴圈命令:

  • while 迴圈
  • for 迴圈

迴圈使用建議:

  • while 迴圈適用在一個條件成立下
  • for 迴圈適用在一個範圍之內

while 迴圈

while 迴圈的語法如下:

while 條件式:
   縮排的程式碼(至少一列)
else:
   縮排的程式碼(至少一列)

當條件式結果為True時,重複執行 while 後縮排的程式碼,直到條件式結果為False。 else: 區塊可以省略,當離開迴圈時執行。

In [8]:
i = 0
while i < 5:
  print(i)
  i += 1
0 1 2 3 4 
In [9]:
i = 0
while i < 5:
  print(i)
  i += 1
else:
  print("迴圈已結束")
0 1 2 3 4 迴圈已結束

for 迴圈

for 迴圈的語法如下:

for 變數 in 可迭代物件:
   縮排的程式碼(至少一列)
else:
   縮排的程式碼(至少一列)

當 for 迴圈開始遍歷可迭代物件的每一項目,並將該項目指派給變數,然後執行 for 後縮排的程式碼,直到可迭代物件遍歷到最後的項目。 else: 區塊可以省略,當離開for迴圈時執行。

range( ) 函數

可迭代物件可透過range()函數產生,range()函數預設從 0 開始遞增。

In [10]:
for x in range(5):
  print(x)
0 1 2 3 4 
In [11]:
# range(起始值, 終止值)
for x in range(2, 5):
  print(x, end=' ')
2 3 4 
In [12]:
# range(起始值, 終止值, 增量值)
for x in range(2, 10, 2):
  print(x, end=' ')
2 4 6 8 
In [13]:
for x in range(5):
  print(x, end=' ')
else:
  print("迴圈已結束")
0 1 2 3 4 迴圈已結束

遍歷清單及字串

可迭代物件也可以是list、tuple、dict、set或字串。

In [14]:
myLlist = ["香蕉", "蘋果", "鳳梨"]
for x in myLlist:
  print(x)
香蕉 蘋果 鳳梨 
In [15]:
for x in "奇異果":
  print(x)
奇 異 果 

break 及 continue

  • break 語句用在强制停止迴圈
  • continue 語句用在停止當前迭代,然後繼續下一個
In [16]:
i = 0
while i < 5:
  if i==3: 
    break
  print(i)
  i += 1
0 1 2 
In [17]:
i = 0
while i < 5:
  if i==3: 
    i += 1
    continue  
  print(i)
  i += 1
0 1 2 4 
In [18]:
for i in range(5):
  if i==3: break
  print(i)
0 1 2 
In [19]:
for i in range(5):
  if i==3: continue  
  print(i)
0 1 2 4 

無窮迴圈

  • 下列程式碼當 i==3 時, i += 1 永遠都不會被執行,會造成條件式永遠滿足,迴圈將不會終止(因 i 永遠等於 3)
  • 無窮迴圈屬於嚴重的邏輯錯誤,應當要避免發生
i = 0
while i < 5:
  if i==3: continue  
  print(i, end=' ')
  i += 1

Python 内建模組

模組(module)式一個以.py為副檔名的檔案,其中會定義了變數、函數或類別,當要使用模組的功能時,可以透過import 模組名稱指令來載入。

隨機亂數

Python 內建 random 模組,可用於產生隨機亂數:

In [20]:
import random

#語法:random.randint(開始,結束)
#顯示 0 到 9 之間的隨機整數
print(random.randint(0, 9))

#語法:
#random.randrange(開始,結束,間距)
#顯示 0 到 9 之間的隨機數偶數
print(random.randrange(0, 9, 2))

#顯示 0 到 1 間的隨機數浮點數
print(random.random())
5
8
0.1896871038511676

隨機選取清單項目

In [72]:
import random
mylist=['小明', '小王', '小陳', '小黃', '小珍']
x=random.choice(mylist)
print(x)
Out[72]:
'小珍'

隨機洗牌

In [1]:
import random

nameList=['小明', '小王', '小陳', '小黃', '小珍']
random.shuffle(nameList)
print(nameList)
['小王', '小黃', '小珍', '小明', '小陳']

抽籤程式

In [74]:
import random

Start = int(input("請輸入起始值:"))
End = int(input("請輸入結束值:"))
No = int(input("請輸入抽獎人數:"))

print("獲獎名單為:")
for i in range(No):
  print(random.randint(Start, End))
請輸入起始值:1
請輸入結束值:10
請輸入抽獎人數:5
獲獎名單為:
3
8
6
3
8

抽籤程式改良版

上一個範例會有重複中籤的問題,本例子進一步將已中籤者移除,避免重複中籤

In [75]:
import random

Start = int(input("請輸入起始值:"))
End = int(input("請輸入結束值:"))
No = int(input("請輸入抽獎人數:"))

# 候選清單
Candidates=list(range(Start, End+1))

print("獲獎名單為:")
for i in range(No):
  # 隨機抽籤
  Winner=random.choice(Candidates)
  print(Winner)

  # 移除已中籤者
  Candidates.remove(Winner)
請輸入起始值:1
請輸入結束值:10
請輸入抽獎人數:5
獲獎名單為:
4
1
9
2
5

猜數字遊戲

In [76]:
import random

answer = random.randint(0, 10)
print("請輸入 Q 跳離程式")
while True:
    guess = input("請猜一個數字(0-10):")
    if guess == "Q" or guess == "q":
        break
    elif int(guess) == answer:
        print("恭禧你,猜中了")
        break
    elif int(guess) > answer:
        print("你猜的數字太大了")
    else:
        print("你猜的數字太小了")

print("歡迎下次再來玩!")
請輸入 Q 跳離程式
請猜一個數字(0-10):1
你猜的數字太小了
請猜一個數字(0-10):5
你猜的數字太大了
請猜一個數字(0-10):4
你猜的數字太大了
請猜一個數字(0-10):3
恭禧你,猜中了
歡迎下次再來玩!

函數

函數使用 def 關鍵字定義,是在被呼叫時才會運行的程式區塊,並可以選擇性的傳遞參數給函數,也可以選擇性的回傳參數。 函數具有以下的優點:

  • 可重複使用,同樣的程式邏輯不需要重複撰寫。
  • 可以將同樣的程式邏輯整理成函數,讓程式更精簡,也會提供程式的可讀性。
  • 將程式拆解成函數後,可以提供程式的邏輯性及正確性,已除錯完成的函數便可不需要在重複除錯,可以簡化程式開發及維護流程。
In [77]:
def my_function():
  print("Welcome")

# 呼叫函數
my_function()
Welcome

參數

在函數名稱後的括號內可指定參數,可以根據需要添加任意數量的參數,只需用逗號分隔即可:

In [78]:
def my_function(p):
  print(p)

# 呼叫函數(傳遞參數 p)
my_function("樂活學程式")
樂活學程式

未知數量的參數

如果不知道函數將傳遞多少個參數,可以在函數定義的參數名稱前添加*,函數將接收到一個清單參數:

In [79]:
def my_function(*p):
  for item in p:
    print(item)

# 呼叫函數(傳遞未知數量的參數)
my_function("樂活", "學", "程式")
樂活
學
程式

傳遞清單參數

任何資料類型皆可作爲參數傳送到函數(例如字串、數字、列表、字典等):

In [82]:
def my_function(p):
  for item in p:
    print(item)

# 呼叫函數(傳遞 list 參數)
my_function(["樂活", "學", "程式"])
樂活
學
程式

回傳值

要讓函數回傳值,請使用 return 語句

In [83]:
def my_function(x):
  return 5 * x

print(my_function(3))
print(my_function(6))
15
30
In [84]:
def my_function(): 
  # 回傳清單
  x=["樂活", "學", "程式"]
  return x

#回傳的清單將指派給 y
y=my_function() 
print(y)
['樂活', '學', '程式']

全域變數與區域變數

在函數外部創建的變數稱為全域變數,全域變數可以在函數內部和外部使用。在函數内部創建的變數或傳遞的參數稱為區域變數,區域變數只可以在函數內部使用。

In [91]:
def my_function():
  print(x)

x = "我是全域變數"
my_function()
我是全域變數

函數內部創建的變數是區域變數,只能在函數內部使用。

def my_function():
  區域變數 = "我是區域變數"

print(區域變數)
   
NameError: name '區域變數' is not defined  
名稱錯誤:名稱 "區域變數" 未定義**

具有相同名稱的全域變數與區域變數將在各自獨立記憶體執行。

In [92]:
def my_function():
  x = "我是區域變數"
  print(x)

x = "你好"
my_function()
我是區域變數

要在函數內部創建全域變數,可以使用 global 關鍵字。

In [93]:
def my_function():
  global x
  x = "這是全域變數"
  print(x)

my_function()
print(x)
這是全域變數
這是全域變數

異常處理

當發生錯誤或異常時,Python通常會終止執行並產生錯誤訊息。為避免程式意外的終止執行,這些異常可以使用 try..except機制來處理:

In [26]:
# 因 xx 變數未定義,將生成異常
# 觸發 except:區塊的程式執行
try:
  print(xx)
except:
  print("異常")
異常

多重異常處理

In [27]:
# xx變數尚未定義, 
# 將生成一個 NameError異常
try:
  pxrint(xx)
except NameError:
  print("NameError異常:變數未定義")
except:
  print("其他異常")
NameError異常:變數未定義

else及finally

try..except機制還包含:

  • else:當無異常時執行
  • finally:不論有無異常都會執行
In [28]:
try:
  print("Hello")
except:
  print("異常")
else:
  print("無異常")
finally:
  print("finally一定會執行 ")
Hello
無異常
finally一定會執行 

抽籤程式再改良版

在抽籤程式中,若輸入非數值或起始/結束值,將會造成程式執行錯誤,因此透過異常處理機制來避免程式意外停止執行:

In [2]:
import random

while True:
  try:
    Start = int(input("請輸入起始位置:"))
    End = int(input("請輸入結束位置:"))
    No = int(input("請輸入抽獎人數:"))
  except:
    print("請輸入正確的整數")
  else:
    if No < 0 or Start > End:
       print("人數必須為正數,起始值要小於結束值")
       continue
    break

# 候選清單
Candidates=list(range(Start, End+1))

print("獲獎名單為:")
for i in range(No):
  # 隨機抽籤
  Winner=random.choice(Candidates)
  print(Winner)

  # 移除已中籤者
  Candidates.remove(Winner)
請輸入起始位置:1
請輸入結束位置:5
請輸入抽獎人數:3
獲獎名單為:
3
5
4

以上的範例還是有可能因異常造成程式意外停止,請你再進一步改良,避免任何的意外停止執行!

turtle (海龜繪圖模組)

繪製一正方形

In [1]:
import turtle as tu

tu.showturtle()

# 繪製邊長 100
tu.forward(100)

# 轉 90度
tu.left(90)

tu.forward(100)
tu.left(90)
tu.forward(100)
tu.left(90)
tu.forward(100)

加入紅色及畫筆變粗

In [2]:
import turtle as tu

tu.showturtle()

# 加入紅色及畫筆變粗
tu.color('red')
tu.pensize(3)

# 繪製邊長 100
tu.forward(100)

# 轉 90度
tu.left(90)

tu.forward(100)
tu.left(90)
tu.forward(100)
tu.left(90)
tu.forward(100)

太陽花

In [ ]:
import turtle
import turtle as tu

tu.showturtle()
tu.color("red", "yellow")
tu.begin_fill()
for x in range(50):
    tu.forward(100)
    tu.left(170)
    tu.end_fill()
    turtle.done()

五角星

In [ ]:
import turtle
import turtle as tu

tu.showturtle()
tu.pensize(5)
tu.pencolor('yellow')

for x in range(5):
    turtle.forward(200)
    turtle.right(144)

tu.pencolor('red')
turtle.penup()
turtle.goto((-150), (-120))
turtle.write('完成', font = ('Arial', 40, 'normal'))
turtle.done()

正方形

In [ ]:
import turtle
import turtle as tu


def drawSpiral(turtle):

    tu.speed(10)
    for i in range(1, 360):
        tu.forward(i)
        tu.right(91)

tu.showturtle()
holan = tu.Turtle()
tu.pencolor('violet')
drawSpiral(holan)

六角形

In [ ]:
import turtle

colors = ['red', 'purple', 'blue', 'green', 'yellow', 'orange']
turtle.bgcolor('black')
for x in range(360):
    turtle.pencolor(colors[(x % 6)])
    turtle.pensize((x / 100 + 1))
    turtle.forward(x)
    turtle.left(59)

圓形

In [ ]:
import random
import turtle as tu

tu.speed(10000)
for i in range(20):
    col = random.randint(1, 5)
    if (col == 1):
        tu.pencolor('orange')
    elif (col == 2):
        tu.pencolor('blue')
    elif (col == 3):
        tu.pencolor('green')
    elif (col == 4):
        tu.pencolor('purple')
    elif (col == 5):
        tu.pencolor('dark blue')
    else:
        pass
    tu.circle(50)
    tu.left(20)
In [ ]:
# 載入turtle模組
import turtle as tu

# 顯示畫布
tu.showturtle()

# 畫右半部直線
tu.color('blue')
tu.forward(150)

# 畫右半部的空心圓
tu.setheading(270)
tu.color('red')
tu.pensize(2)
tu.circle(50)

# 回到中心點
tu.pensize(1)
tu.color('blue')
tu.setheading(180)
tu.penup()
tu.forward(150)
tu.pendown()

# 畫左半部直線
tu.forward(150)
tu.setheading(90)

# 畫左半部空心圓
tu.color('red')
tu.pensize(2)
tu.circle(50)
tu.pensize(1)

# 回到中心點
tu.setheading(0)
tu.penup()
tu.forward(150)

# 畫中央實心三角形
tu.setheading(180)
tu.color('green')
tu.pendown()
tu.begin_fill()
tu.circle(50, 360, 3)
tu.end_fill()# turtle (海龜繪圖模組)
🏠