Python 流程控制起手式  -  了解何為邏輯運算式

圖一、行銷資料科學的「and」和「or」
圖一、行銷資料科學的文氏圖

回想過去在學習統計學時,各位應該對於「條件機率」的觀念並不陌生,而顧名思義,條件機率的設立就會牽涉到如何設定所謂「條件」,在這個時候,邏輯運算子(logic operator)就要派上用場了。除了計算條件機率分配之外,在進行流程控制時,我們也常會用到邏輯運算子來與程式溝通。

邏輯運算其實就是描述資料之間「且(交集)」、「或(聯集)」以及「非(餘集)」的各種關係,若要將其視覺化,我們通常會使用如上圖示的文氏圖來做表示。從上圖的例子中,若要描述何為「行銷資料科學」,則可將其稱為「行銷管理」、「資訊科技」、「數學/統計」三者的交集。透過圖形,我們可以藉此讓我們對於邏輯運算有一個初步的了解,也可以由此認識到程式語言是如何描述這些集合的。

今日的主題,要帶大家了解「關係運算子」、「邏輯判斷式」及「邏輯運算子」之間的關係

以下我們將和各位分享Python中進行基本邏輯運算式的不同變化!

一、布林代數

布林代數(Boolean)或稱布林變數,是程式語言中描述「邏輯」的一個資料型態,會使用在描述「是」或「否」的情境中。因此,布林變數的值只會有「True」以及「False」兩種。而若一個向量中的每個元素都是布林代數,則稱其為布林向量。

二、關係運算子與邏輯判斷式

資料分析經常是由數十行、數百行甚或數千行的邏輯判斷式形成的。而在進行資料分析時,經常會需要不斷地對資料進行比對或是篩選,在這個時候,就更需要使用邏輯判斷式。

在進入邏輯判斷式之前,要先跟大家介紹一些重要的基本關係運算子(Relational operator),因為我們在做資料解析判斷時,常常會下一些條件,而關係運算子,就是組成邏輯判斷式的重要角色。

常見關係運算子~

常見的關係運算子有「>」大於、「<」小於、「>=」大於等於、「<=」小於等於、「==」等於以及「!=」不等於。

以上的關係運算子都很直觀,但是後面的「==」與「=」是不是讓您有點難理解,這也是大多初學者在這裡較易搞混的。特別是後續加上分析後,若是沒有建立好這裡的好觀念,常常會因為設定錯誤,出現小小的 bug,影響甚大。在 Python 的語法中,由於 Python 為了要區別變數宣告和邏輯運算兩個差異,因此特別將變數的比對以兩個等號的「==」型式作為表示。

邏輯判斷式就是將兩個或多個變數透過關係運算子進行比較,以獲得「True」或「False」的結果,也就是說,透過邏輯判斷式所得到的結果會是個布林代數。如下範例,我們宣告一個變數 a 為 3,並且拿它與 7 這個數字進行各種比較。看看不同的比對下,其「True」或「False」的結果,如下程式碼 1。

程式碼 1:

a = 3  # 宣告變數a為3,此式不會有產出print(a > 7)   # 計算3是否「大於」7
print(a < 7) # 計算3是否「小於」7
print(a >= 7) # 計算3是否「大於等於」7
print(a <= 7) # 計算3是否「小於等於」7
print(a == 7) # 計算3是否「等於」7
print(a != 7) # 計算3是否「不等於」7

產出:

False
True
False
True
False
True

三、邏輯運算子

接著,談到邏輯運算子(logic operator),簡而言之,其就是在討論兩個或多個邏輯判斷式之間的關係。

常見邏輯運算子~

可以分為以下三種 :「且(and)」、「或(or)」以及「非(not)」

前面兩個和我們一般的認知相同也非常好理解,其中比較需要特別做說明的為「非(not)」。這個運算子的功能為「反轉」邏輯運算的結果,也就是說,若原本運算的所得之結果為「True」,而我們若在原邏輯運算式的前面加個「not」,就會得到「False」的答案。

邏輯運算子這部分在 Python 中的操作相當直觀,只需要透過輸入邏輯運算子的英文作為指令就可以在在多個邏輯判斷式之間進行運算。只需在「非(not)」的使用下,頭腦特別再轉一下彎,就會運用自如。以下,我們將延續上述「a = 3」的這個例子來為各位做說明,看看二個邏輯運算式的比對,就能理解邏輯運算子在兩個式子中不同的比對功能,如程式碼 2。

程式碼 2:

a = 3  # 宣告變數a為3,此式不會有產出(a > 1) and (a < 5)  #True and True
(a > 1) and (a > 5) #True and False
(a < 1) and (a > 5) #False and False
(a > 1) or (a < 5) #True or True
(a > 1) or (a > 5) #True or False
(a < 1) or (a > 5) #False or False
not(a > 1) #NOT True

產出:

True
False
False
True
True
False
False

在此,我特別挑了初學者很可能會有疑惑的兩條式子:

a = 3  # 宣告變數a為3,此式不會有產出(a > 1) and (a > 5)  #True and False
(a > 1) or (a > 5) #True or False

產出:

False
True

我們首先來看看上面的兩個邏輯命題,可以發現第一個命題(a > 1)為真,但第二個命題(a > 5)不真,對於不真(False)的集合,其實就可以把它當作是一個空集合,那一個空集合與任意集合做交集,肯定會是一個空集合,這就是為何第一個邏輯運算式的產出結果為 False 的原因。

我們在此同樣以「行銷資料科學」的文氏圖來做舉例。比如我們說「行銷資訊系統是資訊科技」「行銷資訊系統是數學/統計」,請問這個命題是 True 還是 False?

我們可以從圖中看出,命題的前半部分是 True,而後半是 False(因為「行銷資訊系統」與「數學/統計」兩者的交集為空集合)。那從前面的討論可以得知,這個命題的答案為 False,因為空集合與任意集合的交集也還會是空集合。

回到上面的第二個邏輯運算式,也就是「聯集」的範例。聯集相較於交集,其成立條件較為寬鬆,只要命題中有一個部分成立,即為成立。同樣以「行銷資料科學」的文氏圖來做舉例。我們說「行銷資訊系統是資訊科技」「行銷資訊系統是數學/統計」,請問這個命題是 True 還是 False?

答案當然為 True,因為從圖中可看出「行銷資訊系統是資訊科技」明顯是對的,即使另外一個部分不成立,整個命題仍是成立的。

圖一、行銷資料科學的「and」和「or」

以上就是簡單的運用關係運算子、邏輯運算式及邏輯運算子的一些小變化,讓大家對於 Python 的邏輯運算有基礎的認識。

透過以上的邏輯運算,我們可以很快速地看到變數之間的關係以及異同,而不只是數值運算,也可以應用於字串的比對。邏輯運算與未來的流程控制、資料篩選等應用息息相關,這些部分有機會,我們也將在後頭的文章與大家介紹,但還是不能忘記本篇基本功的重要性唷!

作者:黃海潮(臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)

更多實戰案例及情境好文推薦

回到頂端