那另外還有一些這個 常見的這個操作字串的一些這個 功能。
那我們來大概看一下,那事實上呢這個有些東西
大家之前可能也有遇到過,比如說我們可以用一個這個加號的方式,如果把兩個字串加起來, 它事實上做什麼事情。
加號在字串裡面是串接, 如果是整數,當然就是一般的加法,浮點數也是一般的加法。
那另外呢這個乘號,乘號在字串
裡面是代表重複,對不對?這個就是是一個還蠻直觀的一個延遲嘛,對不對?那
你如果把一個字串乘以三次的話,就是把同樣這個東西重複三次,這樣串接起來,用乘號。
那比如說你如果是 "spam" + "eggs",會怎樣呢?
你猜猜看,那就是把兩個字串串起來,中間沒有任何多餘的東西,這就是 spameggs。
那你如果是 "spam" + "And" + "Eggs" 會怎樣呢?"spam" + "And"
+ "Eggs" 的話呢 一樣就是把這三個字串串起來,就變成 spamAndEggs,中間沒有任何的這個空白。
那你如果是 3 * "spam" 呢,並不是把 3 重複 spam 次,沒有這個
這個沒有意思嘛,應該就是把 spam 重複三次,然後串起來。
對不對?所以是 spamspamspam,對不對?那 "spam" * 5
呢,也一樣,就是把 spam 重複 5 次串起來,那所以 就變成這樣,五個 spam 串起來。
然後呢,比如說你如果是 (3 * "spam")+("eggs" * 5) 的話,會怎樣呢?大家想一下,
那你大概應該猜得到,對不對?就是前面有三個 spam,後面有五個
eggs,然後中間一樣是串起來,中間沒有任何的多餘的 這個東西。
最後這個是引號,這個是 Powerpoint 自己自作主張改的。
這個是單引號,這個不是這個字元。
然後另外就是說有時候我們會想要知道 這個字串有多長,字串有多長,字串有多長做的事情就是你用
len 這個 函數,len,然後你把字串傳進去,它就告訴你,比如說 career
長度是 6,對不對?你可以算一下,1 2 3 4 5 6,對不對?長度 6。
那這大概就是是這個 部分。
那當然就是說呢因為我們是一個這個,字串它本身就是一堆這個
字元的組合,所以你當然就是可以去把一個一個的字元把它抓出來,這件事情。
那你如果,你要怎麼樣把一個一個的字元抓出來呢?你做的事情就是說你可以用 一個這個 for
迴圈的一個方式,我們之前有教過 for 迴圈嘛。
那你如果說呢,去將它去這個 for
假設你把 a1 定義成 career,然後呢你說 for
ch in a1: 會做什麼事情呢?它就會把這個 a1 裡面的一個一個的 character
把它抓出來, 所以呢像這個東西會印什麼呢?"Get a character:",
ch 它就會把 c a r e e r 依序把它印出來。
所以這個是某種程度上就是告訴你說這個 string 它是
一個一個的這個字母、 字元的一個組合,一個字元的組合。
所以它印出來東西就是說,第一個它,你是叫它印出長度是多少嘛,我們這邊長度是 6,對不對?然後呢你如果說
跑一個迴圈,叫它把一個一個 character 把它處理的話呢,然後呢它做事情就是
把每一個這個,每一個這個字元把它抓出來,所以我們看到這邊印出來這個東西。
那總和來說,就是說 string
常用的一些 operation 大概有幾個,我們前面講過我們這邊 統整一下。
加號就是串接, 乘號就是重複幾次,對不對?然後呢你可以把
string 後面用方括號接 整數的方式去做 indexing,就是把某一個這個字元,在那個位置的字元拉出來。
或者說你可以用 slicing,就是用這個冒號就是把開始跟結束
的這個位置丟給它,它就會把那個小 string,把那個子字串把它拉出來。
然後你可以用 len 下去這個計算它的長度,或者你可以用一個 for
的方式呢去把一個一個 的這個字串裡面的字元一個一個拉出來處理它,有時候我們會做這個事情。
那
好,那接下來就是我們說一下這個 string 這個東西
從剛剛的這一些介紹,就大概知道說 string 跟 list 是一個
是兩個還蠻像的東西,對不對?我們之前有接觸過這個 list, 對不對?那事實上呢
string 跟 list 在 python 裡面它們都 是叫做,它都是一種所謂的這個
sequence, 有順序的一堆東西的組合。
那很多時候你可以用在這個 string
上面的操作,你可以用在 list 上面,比如說我們這邊舉個例子。
如果你一個 list 是 1 跟 2,另外一個 list 是 3 跟 4,你把它用加號加起來,它就變成
1,2,3,4,就是串起來嘛, 就是跟 string 做的事情是一樣。
你如果把一個裡面是 1 跟 2 兩個 elements 的 list 乘以 3
會怎樣呢?並不是把 1 乘以 3,2 乘以 3 這樣子,它是把這個 [1,
2] 這個 list 把它重複三次串起來,變成 [1, 2, 1, 2, 1,
2],對不對?這個是要特別注意的,因為你如果 有用別的語言,有的語言它可能不是這樣子的行為,python
是這樣子的行為,所以這個是 這些東西都是 language specific,就是只有 python 是這個樣子。
那比如說 你如果定義一個這個 list 叫做 grades,裡面有
A B C D F 五個這個 string, 第 0 個 element
就是 A 嘛,2 到 4 就是從 就是給你這個 0 1
2 3 的這個 element,就是 C 跟 D,
對不對?所以這個行為也是跟字串一樣,只是說字串呢抓就是一次是抓一個 character,但是就是說
在 list 裡面,就是它是把抓那幾個 element,但規則基本上是一樣。
那這個長度的話呢, 就總共五個嘛,那就是五個。
那 所以這兩個東西就是雖然說它很類似,但是它還有一些不一樣的地方,所以我們
稍微說一下,就是說 string 就是總是是一堆 character
組合起來, 有順序的,對不對?但 list 就是它也是一堆這個有順序的
element 組合起來,但它就不一定是就是 都是 character,它可以是別的東西。
那比如說呢,你可以說一個 list 是 1,是個整數,對不對?spam, 這是一個
string,4 還有 U,對不對? 這是這樣子是可以的。
但是這個是 list 是可以,但是 string 就是不行,string 就是一定是一堆 character 的組合。
那 另外一個東西就是我們之前有提過,就是 mutable 跟 immutable 這個概念。
那這是 python 比較特別的地方,就是說它的這個不同的資料型別,它還分成是 可變的跟不可變的。
那像 list 就是是一個 mutable,它是可變的,比如說呢
這個一個 list,如果你定義像這樣子,34,26,15,10,四個整數,
那你如果要修改這個第二個 element,第二個 element
位置 2 的這個 element,它是 0 1 2,是 15 嘛,那你可以把它變成
你可以把它設成 0,這時候整個 list 就變成 34,26,0,跟 10,這是可以的。
但是 string 雖然說它也是一個 sequence,但是你也可以把其中的那個 element 拿出來,但是你不能只有改這個 element。
那比如說像你如果定義一個東西,就說 Hello World,那位置 2
是 l 嘛,位置 2 是 l,然後你想要把它改成 p 是不行的,python 不讓你做這個事情。
因為它本身在一開始設計的時候,它就是所謂的 immutable,就是你不能去更改
這個整個這個 data structure 裡面的內容。
那你能唯一做的事情就是說你可以做一個新的,取代舊的,整個, 整個
string,你可以用一個新的 string 取代舊的 string,可以做這個事情,但是你不能去改 string 內部的
東西,這個是 immutable 的意思。
那 所以這個介紹完這些基本的東西,那我們來看一個例子,看一個例子,就是說呢
我們看一個簡單的例子,是做這個日期的處理,日期的處理,就是說
這個我們日常生活中,尤其在做資料處理的時候常常遇到一些日期,日期 的資料。
那這個資料,事實上日期資料是一個 很常遇到,但是很令你頭痛的東西。
那在 python 裡面它事實上有一個專門的一個這個 library
在處理這個日期 還有時間,那我們目前還沒有去介紹這個事情,
我們現在就是說舉一些例子,這個例子純粹就是用來 說明這個 string
的 operation,那你如果以後需要 處理日期的話,python 有專門的
library 做這個事情,你去用那個 應該叫 datetime 的這個 library。
那我們這邊就是單純的就是是 介紹這個 operation,那我們的 task 就是說呢
日期常常我們在台灣比較常用的是年月日,就比如說是 YYYYMM dd 就是也就是
20141203,就是 2014 年的 12 月
3 號,這個格式叫做 yyyymmdd 嘛,那另外一種常用的格式是反過來。
好,是 ddmmyyyy,好這邊寫錯了,是 yyyy。
那 如果是這樣子的話呢,就會是
同樣這個東西就會變成 03122014,好,03122014。
那所以我們現在就是說,我們要寫一個函數哦
去處理這個 問題。
好,那怎麼處理這個事情呢? 所以我們現在就是定義一個函數,我們已經講過函數了,對不對。
那函數怎麼定義呢,就是用一個 def 這個關鍵字嘛。
接函數的名字,我們這個函數是做什麼事情的呢?ymd2dmy,對不對。
然後那個傳入的值,就是 dstr,dstring。
那這邊 附帶了一個說明,這是用這個 triple quote 是用三個引號,然後它就說 convert
date format from ymd to dmy,比如說是 20150312 就變成 12032015,好。
那這個說明,有時候你會覺得說,多寫這麼多幹嘛啊,但是這個 東西其實對你是很有用的,
不管是對你,或者是對跟你 同樣這個參與同一個專案的這個人,都是非常有用的。
為什麼對自己有用呢?因為大家的記憶 其實每一個人記性都是很有限的,有些時候呢,就是你今天
就是在一個沉浸在某個這個工作裡面,所以你就寫了一堆這個 函數,對不對。
那這些函數呢,你現在很清楚 但是呢,三個月之後呢,你再回來看你的程式,啊,這些東西是在做什麼?
像我的話呢,我就會全部忘記,就是literally 全部忘記,就要在這邊
東找西找然後東看西看,欸,這個為什麼是寫成這個樣子,這個東西到底是幹什麼的呢?好。
那就要花,可能要花一天的時間讓自己的記憶可以回來,對不對?好。
那你如果要節省這個時間的話呢, 你就是多做一點說明,那剛好
Python 它這個內建的有一個格式就是可以讓你做這個事情。
就是 take advantage of
that,對不對?就是說呢在寫一個,不管你是做什麼事情,就是 盡量能夠留一些蛛絲馬跡,對不對。
讓你之後後續再回來 接續工作的時候,可以不要那麼痛苦。
那 所以這行你不寫也沒關係,但是我建議你就是多多少少寫一些相關的描述啦,好。
然後呢,所以呢 ymd 是什麼了?ymd 前面 4 個 這個 character
這個是 year 嘛,然後再來的兩個 month,再來是 day,然後所以呢,我們就是
y1 是什麼?是 dstring 0 到 4 因為它是 0123 嘛,就是到 4。
對不對。
好,那接下來呢,是從位置 4 到 5,好。
位置 4 跟位置 5,所以它是 4 冒號 6,對不對?因為它是到 6 的前一個。
然後接下來是 6 冒號 8,是因為它是位置是 6 跟 7。
那這邊這個 8 你也可以不要寫,你直接寫 6 冒號,也是可以的。
那但是就是 6 到 8 有一個好處,就是說你萬一傳進來的長度不是剛剛好的話,那就
截取這個 6 跟 7 這個位置,然後呢,所以你有
y1 m1 d1 代表年月日嘛,對不對?這三個 string。
那另外要注意,這邊抓出來的東西都是 string 哦,好。
雖然說我們傳入的東西是 20150312 類似像這樣的東西,但是呢
我們目前是假設它是一個這個所謂的 這個字串的資料型別,而不是整數或者是浮點數。
那所以在這種狀況下面,你要把它怎麼改成 dmy 呢?就是先把
day 改到前面嘛,然後再加上 m1 再加上 y1,這時候,它就把
d1 m1 y1 串起來,好,依照這個次序,所以它就可以把 這個 ymd 的格式改成 dmy。
大概就是這個樣子,好。
那所以呢,希望大家可以理解這個 事情,那我們來看一下一個例子,這就是我們這邊把這個函數的這個定義重新再
寫在右上角,這時候我們就把它註解這個說明拿掉了哈,但是就是說 說明很重要哦,然後呢,比如說我們這個定義
d1 是 20150512,我們希望以它引起來說 它是一個字串,對不對,好。
然後我們把這個 d1 傳入給我們剛剛定義好的 ymd2dmy。
然後呢,把 d1 傳給它,輸出是 d2,好。
然後呢,結果就會是你看是 12052015,剛好就是把這個原來的 ymd 改成 dmy。
那我們再試另外一個,比如說 20171123
然後呢,它就會切嘛,2017 切成 y1,11 切成
m1,23 切成這個 d1,你可以看一下這邊的切割。
好,對照一下,看一看是不是真的是這樣,所以它就會把 d1m1y1
串起來,所以就變成是 23112017,好,23112017。
這是個大概就是是一個一些字串的處理啦,好,字串的處理,那就是說,實際上在處理
這個日期,我們還有各式各樣的事情,然後還需要雜七雜八的事情需要做,然後就是說你如果
真的需要處理日期的話,不要用這種方式,有現成的 library 可以用。