Python裡的建築藍圖:了解演算法的基礎結構

Sean Yeh
Python Everywhere -from Beginner to Advanced
9 min readJan 10, 2024

--

Amsterdam, Dutch, photo by Sean Yeh

今天又要來聊聊Python這個超酷的程式語言。大家或許都知道,學會寫Python就像學會了一種魔法,這魔法可以讓電腦按照我們心裡的想法去做事。但是,大家要知道魔法有它的規則,不是隨便亂下咒語就行的。所以,我們要一起來探索,如何寫Python才能讓寫出來的程式既強大又好用。

首先,我們要知道程式是怎麼運作的。就像做菜一樣,有步驟要遵守,不能亂來。在程式世界裡,有三種超重要的基本結構:分別是「依序進行」、「條件分支」與「反覆循環」。你可以在大多數的程式語言中找到這三個基本結構。

在Python中也有這些結構囉?那麼,我們要怎麼寫才能符合呢?別擔心,接下來我們會一一解析,並且提供一些簡單的例子讓大家更容易理解。不管您是不是第一次接觸程式,我相信,看完這一篇,一定能讓您掌握這些魔法的訣竅!

那就讓我們開始這段旅程吧!我們會從最基本的依序進行結構開始講起。

結構化程式設計的基本結構

首先,要知道的是,編寫程式就像是在建造一座房子,需要一個完整的藍圖和明確的結構。而程式的運作方式可以被歸納成三大類:依序進行、條件分支、反覆循環。這三種就像是建造大樓時的鋼筋、水泥和磚塊,每種都很重要。而Edsger Wybe Dijkstra在1965年提出的結構化程式設計(Structured programming)的三種結構正是:「順序結構」、「選擇結構」和「迴圈結構」。這分法正符合我們目前所撰寫的程式運作方式:

  • 依序進行:對應「順序結構」;
  • 條件分支:對應「選擇結構」;
  • 反覆循環:對應於「迴圈結構」。

結構化程式設計主要強調的是程式的易讀性,認為任何程式都可以有這三種基本結構架構出來。希望藉此設計方式來改善電腦程式的清晰度、品質,且避免寫出義大利麵條式的程式碼,進而減少開發時間。

究竟這三種結構具體指的是什麼?我們就分別來看看:

依序進行的「順序結構」

想像有一條直線,程式碼會像跑道上的運動員一樣,從起點一直跑到終點,不會偏離軌道,我們稱這種結構為「順序結構」(Sequence structure)。

簡單來說,就是程式會按照我們寫的順序,一步接著一步執行,中間沒有岔路或彎道。

比如說,當我們需要依序完成幾件事情時,就會用到這個結構。在程式裡,這就好比我們寫了A、B、C三個步驟,程式會先完成A,再來是B,最後才是C,就像接力賽跑一樣,一棒接一棒順利地完成。

接著我們用一個例子來說明,假如有下面的三行簡單的程式碼:

print("執行A程序")
print("執行B程序")
print("執行C程序")

這時,Python會先執行第一行,也就是印出「執行A程序」,接著是第二行的「執行B程序」,最後是第三行的「執行C程序」。這就是所謂的「順序結構」,它讓程式的流程清晰易懂,就像是在讀一本書,從頭到尾一字不漏。

順序結構

條件分支的「選擇結構」

「選擇結構」(Selection structure)會依照條件是否成立,來決定執行的動作。就像是路口的指示牌,會告訴程式根據不同的條件,走不同的道路。這種結構讓程式可以根據某些特定的條件,決定要執行哪一段程式碼。

想像你站在一個路口,如果今天是晴天,你就選擇去公園;如果下雨,你就去圖書館。在Python裡,我們也可以透過幾種不同的「選擇結構」來實現這樣的決定。

單一選擇 if~

這個結構就像是一條單行道。當判斷式成立時,就會走這條路,執行相對應的程式區塊。

if 條件式:
程式區塊

雙重選擇 if~else

這就像是路口的兩條路。如果條件成立,就走一條路;如果不成立,就走另一條路。

if 條件式:
條件成立時執行的程式區塊
else:
條件不成立時執行的程式區塊

假設有程式碼可以分為A、B兩個程序。條件分支是指當條件符合的時候,就處理A程序,反之就處理B程序。

選擇結構

例如,我們有一個驗證密碼的程式,如果輸入的密碼正確,就執行一組操作;如果錯誤,就執行另一組操作。

setted_password = 'a123456'

if input_password == setted_password:
print("您的密碼正確,請繼續")
# ...do A程序
else:
print("密碼錯誤")
# ...do B程序

多重選擇 if~elif~else

這就像是一個多岔路口。根據不同的條件,你可以選擇不同的路去走。

if 條件式1:
條件1成立時執行程式區塊1
elif 條件式2:
條件2成立時執行程式區塊2
elif 條件式3:
條件3成立時執行程式區塊3
else:
所有條件都不成立時執行程式區塊4

當第一個條件成立時可以執行 if 下的程式區塊,不然就看第二個條件是否成立,成立時就執行該 elif 下的程式區塊,以此類推。當所有條件都不成立時就執行 else 下的程式區塊。其中,elif 沒有個數的限制,可以依照自己的需求而定。

巢狀if

這就像是在一個大路口裡,還有更細小的分岔。當需要在已有的判斷條件中加入更多層次的判斷時,我們就會使用巢狀if。

在Python程式中,「選擇結構」不僅讓我們的程式更加靈活,也讓程式能夠針對不同情況做出最合適的反應。因此,學習掌握「選擇結構」是非常重要的。

反覆循環的「迴圈結構」

「迴圈結構」(Loop structure)在條件成立時,會反覆執行動作。就像是一個運動場的跑道。當我們需要重複做同一件事情好幾次時,就會用到這個結構。這種結構讓我們的程式可以在某些條件滿足時,不斷地重複某些動作,直到條件不再成立或達到某個指定次數為止。又可以分為「前測迴路」與「後測迴路」兩種。

迴圈結構

前測迴路: WHILE-DO

前測迴路的特點是,在執行迴圈內容之前,會先檢查條件是否成立。當條件滿足時執行回圈,即先判斷後執行。其迴圈執行的次數最少是0次,最多是無限多次。

後測迴路:DO-WHILE

後測迴路則是先執行迴圈內的動作,然後再檢查條件。從程式的入口處直接執行回圈,在回圈終點處進行條件判斷,此時若條件不滿足,就重新返回入口處繼續執行回圈,直到條件滿足的時候,再退出回圈到達程式的出口處。這意味著迴圈內的動作至少會被執行一次。

下面是Python中最常見的迴圈結構:

for 迴圈

for迴圈是Python中最常見的迴圈之一,特別適合用在需要遍歷序列(如list串列或字串)的場合。這種迴圈會依序從序列中取出元素,並將這些元素賦值給我們指定的變數。

for 變數 in 序列:
迴圈內的程式區塊

while迴圈

while迴圈則是在條件成立的情況下反覆執行某些操作。它適用於那些我們不確定需要執行多少次迴圈的情況。

while 條件式:
迴圈內的程式區塊

回圈結束的控制

想要讓迴圈結束,可以是透過自然的方式,也就是條件不再成立時迴圈自動結束;也可以透過刻意的介入使之不規則的結束,比如我們用一些特殊的指令來強制結束迴圈。例如breakcontinue

break

「break」可以用來立即中斷迴圈,不再繼續執行迴圈內的其他動作。舉例來說:

for i in range(10):
if i == 5:
break
print(i)

由於使用了break,上面這段程式會在數字到達5時,立即中斷for迴圈。

continue

「continue」則是用來跳過當前迴圈的剩餘部分,直接進行下一次迴圈的判斷。舉例來說:

for i in range(10):
if i % 2 == 0:
continue
print(i)

以上面這段程式來說,由於變數 i 被2整除的話,程式就會它會跳過目前迴圈的剩餘部分,回到 for i in range(10): 直接進行下一次迴圈的判斷。因此,使用的結果會跳過所有偶數,只印出奇數。

if i % 2 == 0:
continue

掌握了這些迴圈結構,你就可以在Python的程式設計中自如地處理重複性的工作,並且可以讓你的程式更加有效率和清晰。

結論

經過以上的探索,我們現在知道,在Python程式語言的世界中,都可以透過結構化程式中「順序結構」、「選擇結構」和「迴圈結構」這三種基本的方式來建構您的演算法。這就像是用樂高積木來建造一座城堡,每個不同的積木都有其獨特的位置和功能。

這也讓我們理解到使用結構化程式設計的各種好處。首先,每個程式區塊都相互獨立,就像是在建造房屋時,每個房間都是獨立的。這樣做的好處是,當我們在設計某一個部分時,不需要太擔心其他部分,讓我們可以把一個大問題拆解成許多小問題,逐一解決。

再者,這種設計方式讓我們更容易擴充現有的系統或者建立新系統。讓我們可以像拼搭積木一樣,利用現有的程式區塊來逐步擴充我們的「程式城堡」。

此外,因為有了結構,讓我們目標明確,思路清晰,所以在開發過程中,可以更有系統地規劃和控制整個開發流程。這對於大型專案的管理來說尤其重要。

總之,Python程式語言提供了一個結構化且靈活的平台,熟悉了這三種結構,就相當於掌握了Python程式的骨架。無論是開始一個新的專案或者是改進現有的系統,都不要忘了利用這些基本的程式結構,它可幫助我們用更有效率、更清晰、有條理的方式來解決問題。最後,希望這篇文章能夠幫助大家在Python程式設計的學習過程中邁出堅實的一步。讓我們一起在Python的世界裡,建造出屬於自己的程式大樓。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。