這一點也讓我覺得很不愉快。我是說,當你在照顧草泥馬方面有所小成,而其他人卻開始討論起飼料啦水源啦等等的。他想要讓你覺得,他沒有辦法像你一樣照顧好草泥馬,都只是因為他買錯了飼料。
~節錄自《賴田捕手》第四章
今天想要講的東西包括Python裡的基本元素、資料類型、基本操作,還蠻多的,沒辦法再講其他廢話,那麼就直接開始吧。由於等等會寫出不少的程式碼,想邊看邊操作的朋友可以打開 Jupyter Notebook 囉。另外,我也把等等會出現的範例程式碼寫進 Jupyter Notebook 並放到Github上了(Github 或 nbviewer),想參考的也可以下載下來玩玩。
在 Python 語言裡,所有東西都是物件(object)。有各種類型(type)的物件,最基本的類型如布林物件(boolean)、整數物件(integers)、浮點數物件(float)、以及字串(string)。藉由把物件指定到變數(variable)上,我們可以透過變數更方便的去操作和運用這些物件。說起來很抽象。不囉嗦,直接上程式碼來實際了解一下。
In [1]: variable_a = 1
variable_b = 2
variable_a + variable_b
Out[1]: 3
在上面那個例子裡,variable_a
和variable_b
都是變數,而1
跟2
則是物件。我們把物件1
指定給變數variable_a
,把物件2
指定給變數variable_b
,最後把變數相加,得到結果3。許多程式語言的教材裡,會把變數比喻為標籤,而把物件比喻為物品。➀ 標籤就像便利貼,同一個標籤只能貼到一個物品上。再舉一例:
In [2]: variable_a = True
variable_a = False
variable_a
Out[2]: False
上面那一波操作,一開始我們把variable_a
貼到True
這個物件上,接著又把variable_a
貼到False
這個物件上,那麼問題來了,variable_a
究竟在True
上還是在False
上呢?答案是False
。
在 Python 裡面,物件的類型(type)很重要。我們要清楚手上的物件是什麼類型,才知道能對這些物件做什麼操作。不囉嗦,再上程式碼:
In [3]: a = 'alcapa'
b = 1
a + b
TypeError Traceback (most recent call last)
<ipython-input-9-d4f5f70b13d6> in <module>
1 a = 'alpaca'
2 b = 1
----> 3 a + b
TypeError: can only concatenate str (not "int") to str
喔喔,出錯了。我們把a
這個標籤貼到'alpaca'
上,把b
這個標籤貼到1
上,接著希望把'alpaca'
跟1
加到一起,結果出錯了。Jupyter Notebook 顯示一則錯誤訊息。閱讀錯誤訊息,知道哪裡有問題,再回頭修改程式碼,也是寫程式很重要的一種訓練。我們來讀讀看吧。首先錯誤是屬於類型錯誤(TypeError),接著 Python 貼心的指出發生錯誤的程式碼位置,並詳細的說明為什麼不能執行這行程式碼:因為字串(string, str)只能跟字串用加號連接在一起,而我們卻把字串跟整數(integer, int)加到一塊了。喔,原來如此。
再看另一串程式碼:
In [4]: a = True
b = 2.3
a + b
Out[4]: 3.3
咦,這個沒問題!我們重新把a
貼到True
上,b
貼到2
上,結果 Python 能夠理解我們想做什麼(我們想做什麼?)。True
跟False
是屬於布林(boolean)類型的物件,也是布林類型唯二的物件。當他們跟數字,整數(integer)或浮點數(float),擺在一起的時候,True
會被看作1
,而False
看作0
。
要怎麼知道我們現在操作的物件是哪種類型呢?也不困難,如下所示:
In [5]: boolean = False
integer_number = 24
float_number = 2.4
string = 'alpaca'
type(boolean), type(integer_number), type(float_number), type(string)
Out[5]: (bool, int, float, str)
上面先提過了,整個 Python 屬於布林類型的物件只有兩種,True
跟False
。但我們可以透過一些操作,把其他類型的物件布.林.化。不囉嗦,再上一段程式碼。
In [6]: string = 'alpaca'
booleanfied_string = bool(string)
string, booleanfied_string
Out[6]:('alpaca', True)
解釋一下上面的程式碼。一開始我們把string
這個標籤貼到'alpaca'
上,接著利用bool()
造出一個布林類型的物件,並貼上booleanfied_string
這個標籤。那麼現在,string
這個標籤貼到的物件,到底是什麼呢?答案是,當然還牢牢地貼在可愛的'alpaca'
上囉。
有趣的是,什麼樣的物件經過bool()
作用之後,會產生True
的布林物件,而什麼樣的物件經過bool()
作用之後,會產生False
的布林物件呢?
In [7]: bool('ALPACA'), bool(''), bool(1.5), bool(-3.7), bool(0)
Out[7]: True, False, True, True, False
這次我們不貼標籤,直接把物件丟進bool()
裡面。大家都猜到了嗎?還有什麼我這邊沒試過的東西,大家也可以自己回去試試喔!
整數及浮點數就是大家所熟悉的數字。所有基本的運算方式,都可以用在整數及浮點數物件上,另外還有一些特別的運算符號,這次就不端程式碼上來,而是將資料整理如表一所示。
表一、Python 中的運算符號
運算 | 運算符號 | 範例 |
---|---|---|
加法 | + |
2 + 3 = 5 |
減法 | - |
2 - 3 = -1 |
乘法 | * |
2 * 3 = 6 |
浮點數除法 | / |
13 / 5 = 2.6 |
整數除法(商數) | // |
13 // 5 = 2 |
餘數 | % |
13 % 5 = 3 |
次方 | ** |
2 ** 10 = 1024 |
布林物件可以藉由布林化創造出來,整數物件跟浮點數物件當然也有相對應的方式。首先看一下整數跟浮點數之間簡單的轉換:
In [8]: int(4.5), float(3)
Out[8]: (4, 3.0)
需要注意的是,從浮點數物件創造一個整數物件,小數位數(也就是浮點數的部分)會直接被捨去。當然,int()
和float()
可以做更多:
In [9]: int_string = '4'
float_string = '6.9'
int(int_string), float(float_string), float(int_string)
Out[9]: (4, 6.9, 4.0)
但是但是,
In [10]: int(float_string)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-30-d23a285ce444> in <module>
----> 1 int(float_string)
ValueError: invalid literal for int() with base 10: '6.9'
怎麼辦呢?
In [11]: int(float(float_string))
Out[11]: 6
在 Python 裡,字串可以用兩個雙引號"
或是兩個單引號'
將想要陳述的文字前後標註起來創造出字串。不過對 Python 來說都一樣:
In [12]: 雙引號 = "THIS is created by double quotation mark"
單引號 = 'THIS is created by single quotation mark'
print(雙引號, 單引號)
雙引號, 單引號
THIS is created by double quotation mark THIS is created by single quotation mark
Out[12]: ('THIS is created by double quotation mark', 'THIS is created by single quotation mark')
對了,忘了說,如果你想要的話,也可以用中文來當作變數的名字。如果想在字串中加入雙引號該怎麼做呢?很簡單,用單引號來創造字串,反之亦然。但是在某些神秘的情況之下,也許我們會需要在雙引號創造的字串裡面打上雙引號(不要念繞口令啊),該怎麼做呢?
In [13]: 雙引號中的單引號 = "THIS is created by 'double' quotation mark"
單引號中的雙引號 = 'THIS is created by "single" quotation mark'
雙引號中的雙引號 = "THIS is created by \"double\" quotation mark"
print(雙引號中的單引號)
print(單引號中的雙引號)
print(雙引號中的雙引號)
THIS is created by 'double' quotation mark
THIS is created by "single" quotation mark
THIS is created by "double" quotation mark
在字串內的雙引號之前,加上\
,告訴 Python,這不是用來創造字串的雙引號,而是我們希望當作字串內容的雙引號。這個\
直接翻譯叫做逃避(escape),我也不知道怎麼翻比較傳神,可能可以把它想成,"我要從 Python 的規則裡逃出來的感覺"。大家是不是有在煩惱,要怎麼在字串裡面打出多行的文字呢?其中一個方法,就是在字串中加入換行符號\n
。表二列出了一些常用的逃避方式。
表二、常用的逃避符號
字串 | 逃避符號 |
---|---|
單引號 | \' |
雙引號 | \" |
換行符號 | \n |
tab符號 | \t |
反斜線 | \\ |
你想得沒錯,當然,我們也可以用逃避來逃避逃避。什麼鬼。剛才提到,\n
是用來製造多行字串的其中一種方式。那另一種呢?答案是,用前後各三個引號(單引號、雙引號都可)來創造字串,就可以像在打文字編輯器那樣自由換行囉!
In [14]: paragraph = """
first line
second line
"""
print(paragraph)
first line
second line
相同的,我們可以用str()
來創造出字串文件,這個我就不再贅述了。
那麼接下來,有了字串物件之後,可以做什麼呢?當然是,對它做運算??
In [15]: 大家跟我一起來 = "Pen! Apple! "
print("1.\n", 大家跟我一起來+大家跟我一起來)
print("2.\n", 大家跟我一起來*6)
1.
Pen! Apple! Pen! Apple!
2.
Pen! Apple! Pen! Apple! Pen! Apple! Pen! Apple! Pen! Apple! Pen! Apple!
相信聰明的大家一看就懂。
終於到了最後,再講一樣東西,數(ˇ)數(ˋ)。一個字串裡面究竟有幾個字元,這我一看就知道,電腦當然也一看就知道,而且還看得比我還快。那我也不看啦,讓電腦來看就好啦。當然可以,請用len()
。電腦還可以告訴你,火山矽肺病的第 25 個字母是什麼,第 31 到第 41 個字母是那些,或是倒數第 2 個字母是什麼。請看程式碼:
In [16]: 火山矽肺病 = "pneumonoultramicroscopicsilicovolcanoconiosis"
print("Length\t:", len(火山矽肺病))
print("25\t:", 火山矽肺病[25])
print("31~41\t:", 火山矽肺病[31:41])
print("-2\t:", 火山矽肺病[-2])
Length : 45
25 : i
31~41 : olcanoconi
-2 : i
大致上就像程式碼顯示的那樣,不過有些東西我們要注意一下。
從零開始
一個可以對其數(ˇ)數(ˋ)的物件,我們可以用[x]
把第 x 個單元抓出來。但是 Python 是從 0 開始數的,所以說火山矽肺病的前十個字母,對應到的數字分別是:pneumonoul
0123456789
利用冒號(:
)來切片(slice)
除了可以用[x]
來選擇第 x 個單元之外,還可以用[x:y]
選擇從 x 到 y 的單元,包含開始的 x,不包含結束的 y。
利用更多冒號(:
)來跳著切片(slice)
甚至還可以用[x:y:z]
來選擇從 x 開始,到 y 為止,每間隔 z 取一個單元。抱歉我實在詞不達意,不囉嗦看程式碼:
In [17]: print("A.", "0123456789"[1:2])
print("B.", "0123456789"[::2])
A. 1
B. 02468
上面第一段程式碼用[1:2]
選擇字串"0123456789"
中,從1
開始(包含)到2
結束(不包含)的所有單元,因此得到 1 。第二段程式碼用[::2]
做選擇。從 x 開始,到 y 為止,咦,x、y都沒填,沒關係,Python 很聰明,他知道我們什麼都沒填,代表我們希望用預設的值,也就是從頭到尾。好的,今天說了這麼多,感謝大家耐心看完,希望能讓還不熟悉 Python 的夥伴能對 Python 的基本物件和其運用有多一些些的了解!今天舉例時所寫的相關程式碼我將它放在Github上(Github 或 nbviewer),有興趣的也可以把他們下載下來玩玩!謝謝大家。
➀ Introducing Python、Introducing Python 閱讀筆記第二章
註:對於此系列文有興趣的讀者,歡迎參考由此系列文擴編成書的 LINE Bot by Python,以及最新的系列文《賴田捕手:追加篇》
第 31 天 初始化 LINE BOT on Heroku
第 32 天 快速回覆 QuickReply 介紹
第 33 天 妥善運用 Heroku APP 暫存空間
第 34 天 妥善運用 LINE Notify 免費推播
第 35 天 製造 Deploy to Heroku 按鈕
晚上好,
感謝草泥馬們的悉心指導~~
讓我在下班後又學到一些基礎~
今天,我在下班之後,花了四小時研讀第三天課程。
●其中,我陷入字串類型中有小數點如何轉換成整數的課題,我研究之後是這樣理解的..
#"處理方式:可以先將資料為'6.9'的字串類型,轉換成浮點數類型(得6.9),再把變成浮點數類型轉成整數類型,便可得到6。"
●再來是 len(長度) 的尾聲部分;利用更多冒號(:)來跳著切片(slice)。
print("B.", "0123456789"[::2])
教學中有提到::是從頭到尾,每間隔2取一個單元;得 出02468
這部分也嘗試蠻多次,最後我的理解是這樣...
第0個數會優先被取出來,並且當作起始值
當2被取出來後,又重新開始計算,指2的位置又變成0,往後數2位,又取出4,以此類推。
因此得到02468
應該是長這個樣子..
0 1 2 3 4 5 6 7 8 9
取出變0 1 取出變0 1 取出變0 1 取出變0 1 取出變0 1
不過,我實在不確定我這樣理解是否正確0.0a
又過了很充實的一晚,感謝草泥馬們的努力^^
您好:
感謝您的鼓勵。
關於您提出的兩個討論,我認為第一個討論您的理解是相當正確的。按照您的做法就可以將帶有小數點的字串換成整數了。
關於切片 (slice) 的部分,文章中我好像講得不太清楚,讓我在這邊多做點解釋:
In [1]: 開始 = 1
結束 = 2
print("A.", "0123456789"[開始:結束])
Out[1]: A. 1
這就是 Python 切片的方式,通常都包含開始而不包含結束,這樣在一些數學運算上比較方便。當然我們也可以跳著切片:
In [2]: 開始 = 0
結束 = 10
間隔 = 2
print("B.", "0123456789"[開始:結束:間隔])
Out[2]: B. 02468
事實上,[開始:結束:間隔]
這才是最完整的表示方法。當我們用[開始:結束]
來切片的時候,我們省略了間隔的大小。幸好 Python 很聰明,他知道我們要的間隔是 1,但我們不說。
同樣的道理,當我們要的開始是 0 的時候,我們也可以不說。
In [3]: 結束 = 10
間隔 = 2
print("C.", "0123456789"[:結束:間隔])
Out[3]: C. 02468
再一個同樣的道理,當我們要的結束是 10,也就是切到最後的時候,我們也可以不說。
In [4]: 間隔 = 2
print("D.", "0123456789"[::間隔])
Out[4]: D. 02468
這就是 Python 切片的運作方式。事實上,很多和計數有關的函式都是這樣的運作的,比如說range
:
In [5]: 開始 = 0
結束 = 10
間隔 = 2
for i in range(開始, 結束, 間隔):
print(i)
Out[5]: 0
2
4
6
8
大概補充到這邊,供您參考囉!