Day 04 型態轉換及字串基礎:叫你印出來不是叫你開印表機阿!
註:本篇文章同步刊載於iT邦幫忙,為鐵人賽之系列文章。
https://ithelp.ithome.com.tw/articles/10238980
註:本文同步刊載在Medium,若習慣Medium的話亦可去那邊看呦!
我們先來解答一下昨天的問題。
讀者的變數名稱可以自己定義,只要答案正確即可。
(但定義的時候,盡量是能夠表達出這個變數是用來做什麼的會比較好)
第一題的內容很簡單,就是把東西放進去計算,然後print出來。
範例解如下:
| |
請留意到,運算子之間有優先合併順序,這個可以Google一下會有詳盡的列表,
但簡單來說,就像小時候老師教先乘除後加減一樣,
以pi*r**2 這個式子來說,”**”這個運算子會先被優先納入計算,
所以r平方會先算完,再和左邊的pi相乘。
第二題呢?其實也只是加起來而已。
| |
很簡單吧!
接下來第三天的部分,我們要來談一下型態轉換及一些字串的操作。
我們昨天已經提到有一些基本常見的型態:
bool, int, float, str,
也許讀者有想到一個問題:
兩個不一樣的型態是怎麼互相轉換的呢?
比方說我們先前在除法的時候,兩個int相除,
是會產生float的(如果不使用整數除法),
這個就是Python在這當中自動進行了型態轉換的部分。
有些時候,型態轉換則需要我們自己來操作,
比如int和float的互轉,只需要使用int()或float()即可。
我們來看一下int和float轉換的範例:
| |
int轉換成float以後,就是多加.0在後面就對了!
float轉換成int的話,則是將小數點後面的東西全數捨棄 。
四則運算的話,int和float相遇最後結果會變成float,以求保留較多的資料。
那bool和int之間的關係呢?0會被當成偽,1會被當成真,
但是其他的數字(0以外的所有數字)也會被當成真呦!
| |
int還有其他變化,
可以將其轉換成用二進位/八進位/十六進位來表達。
所謂的二進位就是每個位數只有0或1兩種數字,
超過就進一位。
舉例來說,十進位的7等於二進位的111,
因為111等於1 * 2² + 1 * 2¹ + 1 * 2⁰ = 4+2+1=7
(看不懂這段的,可以搜尋一下二進位,這邊不再贅述)
我們一般用X進位來表達數字時,稱這個X為「基數」。
在Python中如果數字用10以外的基數來表達時,
會額外做顯示上的處理:
二進位 -> 0b或0B (b代表binary)
八進位 -> 0o或0O (o代表octal)
十六進位 -> 0x或0X (x代表hexadecimal)
舉例來說:
| |
上面這些有點枯燥我明白,但請記下來,有些東西將來會用上的XD
再來談談字串(str)吧!
在Python中,一個字串的資料,是用兩個單引號或兩個雙引號括起來的,
當int, float, bool等型態要轉為str時,
Python只有做一件事情:把它們加進引號中。(真是偷懶XD)
| |
那反方向呢?
| |
講到這裡,讀者可能會有疑問:
「前面講過print可以將東西印出來,
那我如果要印出字串,但裡面含單引號或雙引號呢?」
問的好!
由於有些特殊字元如單引號,雙引號等會有被拿去用的困擾,
所以當遇到會有特殊含義的字元,
或者要將特定字元轉換用途時,我們可以使用一個反斜線(),
將原先的含義給轉換。
這邊請留意一下,在一般大多數的程式語言來說,
印出(print)通常代表把一些內容,輸出到螢幕上,
可能是程式的命令提示字元,或者別的東西,
但不是印表機!!!
請不要問為什麼我家沒有印表機筆者卻要你印出東西來的問題XD
比如我們想印出’We will rock you!’ (連同單引號),
那麼,我們可以這樣子:
| |
其他還有一些常用的轉義字元,但最常用的就是”\n”了,
可以用來做換行的效果!
舉例來說:
| |
你要多換幾行?那就多打幾個\n吧!
想同時印出多個字串的話,可以用逗號來連接,Python會幫忙在中間加空格。
| |
再來談談Python中字串的一些常見的操作:
+結合、*複製、[]取字元、[start:end:step]切片、len()取長、split()分割、join()結合
以下是範例:
| |
程式碼內的註解應該足夠清楚,除了有幾點需要補充說明。
首先留意到a[3],在單獨中括號加上單一數字時,
代表從頭開始數到索引值(index)為3的地方,取出那個字元。
注意歐!這個算法中是從0開始數的!
也就是’apple’中的’a’是a[0],請讀者務必記得從0開始!
就算沒有在異世界生活也一樣XD
接著看到**[start:end:step]的切片部分,
它代表著我們可以用定好的規則來取出字串的片段。
其中:
start表示開始的位置;
end表示結束的位置,但是不含end這個位置;
step代表每次移動多少單位。
比方說剛剛的a[0:4:1],
就是從0開始,到4結束,每次移動1單位,但因為不包含4,
所以只會取到’appl’。
在step為正的情況下,start不寫的話,預設代表從0開始,
而step不寫的話,預設代表每次移動1單位;
所以a[0:4:1]也可以寫成a[:4:1]或者a[:4]** ,讀者可以嘗試看看。
同理,end不寫的話代表預設到結束(包含尾端),
所以如**a[1:]就會是’pple’**。
此外,slice還有特異功能:當step是負數 的時候,
前面不寫則代表預設從字串尾往字串頭走,
所以如a[::-1]會是’elppa’,相當於將a反轉 ;
而a[4:1:-1]則是’elp’ 。
而當start或end是負數的時候,
Python會將負數視作從尾往頭起算,如-1代表倒數第1個字元。
例如a[-2:0:-1]會是’lpp’ 。
最後留意到split()作用過後,
會產生一個用中括號框起來,及逗號分隔的東西,
我們將其稱為list(串列,或稱列表) ,在接下來的文章中我們會介紹到它,
現在只需要知道,它就是一連串列出來的東西即可:
split會按照分割的字串將目標字串給切分開成列表;
join則會使用給定的字串將一個列表的所有東西按順序連接起來。
好的,最後我們來做個練習吧!
- 給定字串chs = ‘abcdefghijklmnopqrstuvwxyz’,請印出:
1.1. 從z起算往回頭走,每次step為-2的字串
1.2. 將索引值為16的字元,加上(索引值為14的字元重復2次),
並用一個空格將前者和字串’有種果汁真好喝~’連接起來。 - 已知bin()的方法可以將一個int值用二進位表示並轉為字串,
請嘗試給出36的二進位字串,但須去除’0b’的部分。 - 給定a, b, c = ‘pen’, ‘apple’, ‘pine’ ,
(註:沒錯,你可以在一行同時生成多個變數,使用逗號隔開即可)
請用a, b, c組合出’penpineappleapplepen’。
那就明天見囉!
工商時間:
抽獎活動還在繼續累積人數(現在好像沒有人想抽XD)
在Python Taiwan的連結第100篇的文章 底下,
公開分享到你的臉書、按讚該篇文章、並留言告訴我說,
「你最喜歡這一整個系列的哪一篇?為什麼?」或
「除了從LeetCode學演算法系列以外,
你還想要看到關於什麼方向的文章?」
超過20則留言的話 (有完成以上步驟的才算),我們就抽一組
「從Leetcode學演算法|進階篇」+「從Leetcode學演算法|面試篇」
課程的免費兌換券進行贈送!
期限嘛…就延長到滿人數吧XDD (不然也沒辦法哈哈)
容筆者工商一下,
「從Leetcode學演算法|進階篇」 開放預購啦!
這次選了40道難度加深的LeetCode題目,
同樣也會細部解說對應的技巧及須要掌握的演算法!
同時這次購買進階篇的話,
額外還加贈**「從Leetcode學演算法|面試篇」** !
當中包含了面試準備須知分享 ,及訪談國內外不同經驗的工程師 ,
讓你不論是想走前端/後端/一般軟工 或者是想找國外的工作 ,
是初學想轉職 還是正在工作 ,都能夠從中得到收穫呦!
有興趣的朋友可以使用下面的早鳥優惠~
「從Leetcode學演算法|進階篇」+「從Leetcode學演算法|面試篇」 :
https://bit.ly/advleetcode
「從Leetcode學演算法」全套(基礎/進階/面試篇)同捆優惠:
https://bit.ly/allleetcode
