Karinoya 學習室

證照 · Cloud / AI / Python 合格實驗室

Python的型別與字串

可以用繁體中文閱讀題目與解說。講義(解說文章)僅有日文版。

查看日文版(含講義) →

第1題 | 主教材

Python 3 工程師認定基礎考試的主教材,正確的書籍是哪一項?

  1. 歐萊禮日本(オライリー・ジャパン)出版的『Pythonチュートリアル』(Python教學)
  2. 翔泳社出版的『あたらしいデータ分析の教科書』(新資料分析教科書)
  3. Impress出版的『Pythonデータ分析 実践ハンドブック』(Python資料分析實戰手冊)
  4. 技術評論社出版的『Python実践レシピ』(Python實戰食譜)
正確答案A. 歐萊禮日本(オライリー・ジャパン)出版的『Pythonチュートリアル』(Python教學)

基礎考試的主教材是歐萊禮日本(オライリー・ジャパン)出版的『Pythonチュートリアル』(Python教學),官方頁面標示自2021年9月1日起對應第4版。出題範圍也是以這本書的章節編號與章節名稱公開,因此準備方式就是依各章的配分比重來掌握本書內容。技術評論社的『Python実践レシピ』是實戰考試、翔泳社的『Pythonによるあたらしいデータ分析の教科書』是資料分析考試、Impress的『Pythonデータ分析 実践ハンドブック』是資料分析實戰考試各自的主教材,都是同一協會所辦理的其他考試用書。若把教材搞錯,就會一直讀範圍外的內容,最好一開始就確認清楚。

第2題 | 題數最多的章

在基礎考試的出題範圍中,主教材裡出題數最多的章節是哪一項?

  1. 第5章「資料結構」
  2. 第4章「控制結構工具」
  3. 第3章「輕鬆入門篇」
  4. 第8章「錯誤與例外」
正確答案B. 第4章「控制結構工具」

出題數最多的是第4章「控制結構工具」,40題中分配了9題。其次是第5章「資料結構」7題,第3章「輕鬆入門篇」6題,第8章「錯誤與例外」則是4題。光是第3、4、5章這3章就合計22題,超過整體的一半。因此把學習時間也集中分配在這3章是合理的,尤其若把處理for陳述式與函式定義的第4章往後拖延,會很難補救。

第3題 | 各章的配分

在基礎考試的出題範圍中,第4章「控制結構工具」所佔的比例是哪一項?

  1. 17.5%
  2. 10.0%
  3. 22.5%
  4. 15.0%
正確答案C. 22.5%

第4章「控制結構工具」在40題中佔9題,換算比例是22.5%。以各章來看這是最大值,其次是第5章「資料結構」的7題,17.5%。15.0%相當於第3章「輕鬆入門篇」的6題,10.0%則相當於第8章「錯誤與例外」及第10章「標準函式庫巡禮」各4題的比例。這個配分並非運用上的數字,而是以出題範圍本身公開的,因此可作為學習計畫的依據。

第4題 | 第13章的配分

在基礎考試的出題範圍中,第13章「接下來呢?」被分配的題數是哪一項?

  1. 0題
  2. 1題
  3. 4題
  4. 2題
正確答案A. 0題

第13章「接下來呢?」是0題,是出題範圍中唯一完全不出題的章節。由於內容是引導學習的下一步,作為測驗文法的考試,這一章被排除在對象之外。被分配1題的是第1、2、7、11、12、14章,2題的是第6、9章,4題的則是第8章「錯誤與例外」與第10章「標準函式庫巡禮」。除了第13章以外全都至少有1題,因此配分較少的章節,也最好稍微瀏覽一下用語作準備。

第5題 | print的sep

執行下列程式時,畫面上輸出的字串是哪一項?

print('Python', 3, 'exam', sep='/')
  1. Python3exam
  2. Python 3 exam
  3. Python/3/exam/
  4. Python/3/exam
正確答案D. Python/3/exam

print() 會用關鍵字引數 sep 把收到的引數連接起來並排列。sep 的預設值是1個半形空格,若不指定就會是 Python 3 exam,但這裡指定了 sep='/',因此會以斜線連接成 Python/3/exam。Python3exam 是把 sep 設為空字串時的輸出。選擇末尾也帶有分隔符的 Python/3/exam/,是誤以為 sep 會加在每個元素之後的情況,實際上它只會加在引數與引數之間。會加在末尾的是 end。

第6題 | print的end

由上而下依序執行以下3行時,畫面上出現的內容是哪一項?

print('A', end='')print('B', end='')print('C')
  1. AB與C分2行輸出
  2. 只輸出1行 ABC
  3. 只輸出1行 A B C
  4. A、B、C分3行輸出
正確答案B. 只輸出1行 ABC

print() 會在輸出末尾加上關鍵字引數 end。預設值是換行字元,因此若不指定,每呼叫一次 print() 就會換行。這裡前2個都設定了 end='',阻止了換行,因此 A 與 B 會連續輸出,最後一個 print() 則加上預設的換行,因此只會輸出1行 ABC。像 A B C 那樣中間帶空格的情況,是在1次 print() 中傳入3個引數的情況;分成3行的情況,是完全沒有指定 end 的情況;分成2行的情況,則是只拿掉其中一個 end='' 的情況。

第7題 | 解包輸出

下列展開列表並顯示的程式,其輸出是哪一項?

nums = [10, 20, 30]print(*nums, sep=', ')
  1. 輸出 10, 20, 30
  2. 輸出 102030
  3. 輸出 [10, 20, 30]
  4. 輸出 10 20 30
正確答案A. 輸出 10, 20, 30

加上星號的 print(*nums) 會把列表的各個元素,分別作為個別的引數傳給 print()。因此3個引數會以 sep 連接,由於 sep=', ',結果是 10, 20, 30。若不加星號寫成 print(nums),列表會作為單一引數傳入,因此會原樣輸出帶方括號的 [10, 20, 30]。若不指定 sep,會以預設的半形空格輸出 10 20 30;若 sep='',則會緊密輸出成 102030。

第8題 | 註解符號

關於Python的註解,下列說明何者正確?

  1. 被 /* 與 */ 包圍的範圍會被當作註解忽略
  2. 從 # 到行末會被當作註解忽略
  3. 從 -- 到行末會被當作註解忽略
  4. 從 // 到行末會被當作註解忽略
正確答案B. 從 # 到行末會被當作註解忽略

Python的註解以井字號書寫,從該處到行末都會被忽略。放在行首則整行都是註解對象,放在中途則其後的部分成為對象。並沒有能一次涵蓋多行的專用語法,因此要逐行加上井字號。有時會用三重引號包起來當作區塊註解使用,但那在語法上其實是字串字面值,若放在函式或類別的開頭,執行時會被當作docstring保留下來。雙斜線在Python中是整除運算子,斜線與星號的組合、或雙連字號則是其他語言的註解寫法。

第9題 | 縮排

把下列程式存成檔案後執行,會發生什麼事?

if True:    print('one')        print('two')
  1. 只輸出 two 後處理結束
  2. 只輸出 one 後處理結束
  3. 依序輸出 one 與 two
  4. 發生 IndentationError 而停止
正確答案D. 發生 IndentationError 而停止

Python以縮排的深度來表示區塊,因此屬於同一區塊的敘述,縮排寬度必須一致。這裡只有第3行縮得比較深,而且前一行並非導入新區塊的行(以冒號結尾的行),因此會發生 IndentationError: unexpected indent。由於這是在執行前的語法解析階段就偵測到的,因此連第2行的 print 也不會執行,連 one 都不會輸出。若在該縮排處卻沒有縮排,會出現 expected an indented block;若途中縮排寬度不一致,則會出現 unindent does not match any outer indentation level 這樣不同的訊息,但兩者都屬於 IndentationError。

第10題 | 字元編碼

關於Python 3原始檔案的字元編碼,下列說明何者正確?

  1. 預設為Shift_JIS,宣告後可以變更
  2. 預設為UTF-8,可直接寫入日文
  3. 預設為EUC-JP,可直接寫入日文
  4. 預設為ASCII,若要包含日文需要宣告
正確答案B. 預設為UTF-8,可直接寫入日文

Python 3的原始檔案預設以UTF-8讀取,因此不論是註解或字串字面值都能直接寫入日文。Python 2的預設是ASCII,若要包含日文,需要在檔案第1行或第2行寫上coding宣告,但在Python 3中已不再需要這個宣告。只有在想讀取以UTF-8以外的字元編碼儲存的檔案時,才需要寫上宣告。順帶一提,識別字(變數名或函式名)雖然也能使用日文,但基於可讀性考量並不建議。

第11題 | 除法的型別

下列處理整數相除的程式,第1行輸出數值,第2行輸出型別名稱。其組合是哪一項?

print(9 / 3)print(type(9 / 3).__name__)
  1. 數值為 3.0,型別為 int
  2. 數值為 3.0,型別為 float
  3. 數值為 3,型別為 int
  4. 數值為 3,型別為 float
正確答案B. 數值為 3.0,型別為 float

單一斜線的 / 是真除法,結果一定是 float。即使能整除也不例外,因此 9 / 3 不是 3 而是 3.0,型別也是 float。若以為整數相除就會得到 int,就會選擇 3 與 int,但若想要 int,必須改用整除寫成 9 // 3,這時才會得到 3 與 int。像 3 與 float、3.0 與 int 這種數值外觀與型別不一致的組合,並不會由這個算式產生。

第12題 | 負數的整除

下列排列了整除運算的程式,其輸出是哪一項?

print(9 // 4)print(-9 // 4)
  1. 第1行為 2.0,第2行為 -3.0
  2. 第1行為 2,第2行為 -3
  3. 第1行為 2.25,第2行為 -2.25
  4. 第1行為 2,第2行為 -2
正確答案B. 第1行為 2,第2行為 -3

雙斜線的 // 是整除,會把商往下方,也就是往數線上較小的方向捨去。9 / 4 是 2.25,所以 9 // 4 是 2;-9 / 4 是 -2.25,所以 -9 // 4 不是 -2 而是 -3。重點在於它不是朝0靠攏的方向,選擇 -2 是誤以為像C語言那樣朝0方向捨去的情況。2.25 與 -2.25 是使用 / 而非 // 時的值,2.0 與 -3.0 則是在運算元中混入 float、寫成 9.0 // 4 時的值,若兩邊都是 int,結果也會是 int。

第13題 | divmod

divmod(-11, 3) 回傳的值是哪一項?

  1. (-4, 1)
  2. (-3, -2)
  3. (-4, -2)
  4. (-3, 2)
正確答案A. (-4, 1)

divmod(a, b) 會回傳 (a // b, a % b) 這個元組。由於Python的 // 是往下方捨去,因此 -11 // 3 是 -4,餘數的符號會與右邊一致,所以 -11 % 3 是 1。因此結果是 (-4, 1)。若以朝0方向捨去的方式思考,商會是 -3、餘數是 -2,因而選擇 (-3, -2),但Python並不採用這種方式。商與餘數之間永遠保持「除數乘以商加上餘數等於原值」的關係,因此 3 乘以 -4 加上 1 等於 -11,可以用這個方式驗算。用這個關係去確認的話,(-3, 2) 與 (-4, -2) 都無法還原成 -11。

第14題 | int的捨去

下列比較捨去方向的程式,其輸出是哪一項?

print(int(-2.7))print(-2.7 // 1)
  1. 第1行為 -2,第2行為 -2.0
  2. 第1行為 -3,第2行為 -3.0
  3. 第1行為 -2,第2行為 -3.0
  4. 第1行為 -3,第2行為 -2.0
正確答案C. 第1行為 -2,第2行為 -3.0

內建函式 int() 會捨去小數部分、朝0方向捨入,因此 int(-2.7) 不是 -3 而是 -2。另一方面 // 是往下方捨去,因此 -2.7 // 1 會落在 -3 那一側,且由於運算元含有 float,結果也是 float 的 -3.0。若是正數,int(2.7) 與 2.7 // 1 都會落在 2 那一側,看不出差異,但負數時方向就會分歧。兩者都不是四捨五入,因此若想把 -2.7 變成 -3,要使用 round(-2.7)。

第15題 | 小數的誤差

下列以2行輸出真假值的程式,其輸出是哪一項?

print(0.1 + 0.7 == 0.8)print(round(0.1 + 0.7, 2) == 0.8)
  1. 第1行為 False,第2行為 False
  2. 第1行為 True,第2行為 True
  3. 第1行為 True,第2行為 False
  4. 第1行為 False,第2行為 True
正確答案D. 第1行為 False,第2行為 True

float以二進位保存小數,因此在十進位中簡潔的 0.1 或 0.7 無法被精確表示。實際顯示 0.1 + 0.7 會得到 0.7999999999999999,與 0.8 有些微差異,因此第1行是 False。第2行則是先用 round() 四捨五入到小數點以下2位再比較,因此兩邊都變成 0.8,結果是 True。這並非Python特有的缺陷,而是IEEE 754二進位浮點數的性質,0.1 + 0.2 會變成 0.30000000000000004、1.1 + 2.2 會變成 3.3000000000000003 也是同樣的原因。應避免對float做相等比較,改用四捨五入到所需位數後再比較,或比較誤差絕對值與容許誤差,若像金額這種需要精確的場合,則使用 decimal 模組。

第16題 | round的捨入

下列把捨入後的值排成1行的程式,其輸出是哪一項?

print(round(1.5), round(2.5), round(3.5))
  1. 2 2 4
  2. 2 3 4
  3. 1 3 3
  4. 1 2 3
正確答案A. 2 2 4

Python的 round() 採用最接近偶數捨入法,也就是所謂的銀行家捨入法。只有在剛好是一半的值時,才會靠向較近的偶數,因此 1.5 變成 2、2.5 變成 2、3.5 變成 4,輸出是 2 2 4。若是學校教的四捨五入會變成 2 3 4,但Python不採用這種方式。1 2 3 是單純捨去小數點以下的值,1 3 3 是靠向奇數一側的值,都與實際行為不同。順帶一提,省略第2引數的 round() 會回傳 int,若像 round(2.5, 0) 那樣指定位數,則會回傳 float 的 2.0。

第17題 | bool即int

下列把真假值當作數值處理的程式,其輸出是哪一項?

print(True + True)print(isinstance(True, int))
  1. 第1行為 True,第2行為 True
  2. 第1行為 2,第2行為 False
  3. 第1行為 2,第2行為 True
  4. 第1行為 True,第2行為 False
正確答案C. 第1行為 2,第2行為 True

bool是繼承自int的型別,因此 True 可直接當作整數1、False 可直接當作整數0用於數值運算。True + True 就是1加1等於2,isinstance(True, int) 會回傳 True。若把第1行想成 True,是把 + 誤認為邏輯或的情況,Python的邏輯或是 or,True or True 會是 True。issubclass(bool, int) 也是 True,sum([True, False, True]) 會是 2 也是同樣的原因。這個性質常被用來計算滿足條件的個數。

第18題 | 整數的精度

關於Python 3的int型別,下列說明何者正確?

  1. 位數沒有上限,只要記憶體允許就能處理很大的值
  2. 超過32位元的值有時會溢位變成負值
  3. 位數超過上限時會拋出 OverflowError
  4. 超過64位元會自動轉換成float來計算
正確答案A. 位數沒有上限,只要記憶體允許就能處理很大的值

Python 3的int是任意精度,位數沒有上限。3 ** 40 能精確求出 12157665459056928801,這已超過帶符號64位元的範圍,但型別仍是int。也能處理像 2 ** 1000 這樣的值,用 len(str(2 ** 1000)) 數位數會得到302位。它不像C語言那樣是固定長度整數,因此不會溢位變成負值,也不會擅自切換成float。OverflowError是在float能表示的範圍被超過等情況下才會出現,僅僅是int位數增加並不會發生。不過位數越多,計算時間與記憶體用量也會增加。

第19題 | bytes的索引

下列處理位元組序列的程式,第2行與第3行的輸出是哪一項?

b = 'abc'.encode()print(b[0])print(b[0:1])
  1. 第1行為 b'a',第2行為 b'a'
  2. 第1行為 97,第2行為 b'a'
  3. 第1行為 97,第2行為 97
  4. 第1行為 a,第2行為 b'a'
正確答案B. 第1行為 97,第2行為 b'a'

以整數索引存取bytes時,會回傳該位置位元組值的int。把 'abc' 以UTF-8編碼後得到的 b'abc',其開頭位元組是 'a' 的碼位,因此是 97。另一方面,用切片取出則會回傳長度為1的bytes,因此 b[0:1] 是 b'a'。若是str,s[0] 與 s[0:1] 都會是同樣的str 'a',這正是str與bytes形成對比之處。顯示成 b'a' 而非 a,是因為 print() 會以repr的形式輸出bytes,若想轉回字串則使用 b.decode()。

第20題 | 進位與字元

下列並列進位轉換與字元編碼轉換的程式,其輸出是哪一項?

print(int('1010', 2), bin(10), hex(255), ord('A'))
  1. 10 0b1010 0xff 65
  2. 10 0b1010 0xFF 65
  3. 10 0b1010 0xff 97
  4. 1010 0b1010 0xff 65
正確答案A. 10 0b1010 0xff 65

int() 的第2個引數是基數,因此 int('1010', 2) 會把字串當作2進位讀取,回傳 10。若以為會直接輸出 1010,是忽略了基數指定的情況。bin() 會回傳帶有前綴 0b 的字串,因此是 '0b1010';hex() 會回傳帶有 0x 的小寫字串,因此是 '0xff'。不會變成大寫的 0xFF,若想要大寫表示,要使用 format(255, 'X')。ord() 會回傳字元的碼位,大寫的 A 是65。97是小寫a的碼位,反向轉換寫成 chr(65) 就會回到 'A'。

第21題 | 切片

下列處理字串切片的程式,其輸出是哪一項?

s = 'Pythonic'print(s[2:5])print(s[-3:])
  1. 第1行為 tho,第2行為 nic
  2. 第1行為 tho,第2行為 ic
  3. 第1行為 thon,第2行為 nic
  4. 第1行為 yth,第2行為 nic
正確答案A. 第1行為 tho,第2行為 nic

s[2:5] 會從索引2的位置開始,取到索引5之前為止。'Pythonic' 的索引2是 t,因此取到 t、h、o 這3個字元,變成 tho。由於不包含終點的位置,不會是 thon。若把索引從1開始數,理解成「從第2個字元開始」,就會誤選相當於 s[1:4] 的 yth。s[-3:] 是負索引,因此從末尾數起,以倒數第3個字元 n 為起點取到最後,結果是 nic。若把 -3 誤讀成「到倒數第3個字元為止」,就會誤選相當於 s[-2:] 的 ic。只要掌握「索引從0開始、負索引以末尾為 -1 往前數」這2點,就不會混淆。

第22題 | 超出範圍與in

下列顯示2個判斷結果的程式,其輸出是哪一項?

s = 'Python'print(s[100:200] == '')print('py' in s)
  1. 第1行為 True,第2行為 False
  2. 第1行為 True,第2行為 True
  3. 第1行為 False,第2行為 True
  4. 第1行為 False,第2行為 False
正確答案A. 第1行為 True,第2行為 False

即使切片的範圍超出字串長度,也不會產生例外,只會回傳重疊的部分。'Python' 只有6個字元,因此 s[100:200] 會是空字串,與空字串比較的結果是 True。這與單獨的索引 s[100] 會產生 IndexError 形成對比。第2行的 in 運算子用來檢查是否包含子字串,但會區分大小寫,因此小寫的 'py' 並不包含在 'Python' 之中,結果是 False。若是 'Py' 或 'th' 則會是 True。

第23題 | 字串是不可變的

把下列程式寫入檔案並執行,結果會是什麼?

s = 'abc's[0] = 'z'print(s)
  1. 發生 TypeError,無法賦值
  2. 被替換成 zbc 後輸出
  3. 發生 IndexError,無法賦值
  4. 維持 abc 不變並輸出
正確答案A. 發生 TypeError,無法賦值

str是不可變(immutable)的型別,也就是產生後無法變更內容,因此無法用索引改寫其中一部分字元。s[0] = 'z' 會產生 TypeError: 'str' object does not support item assignment,並在此停止,print 也不會執行。IndexError是索引超出範圍時才會出現的錯誤,這裡的 0 屬於正確範圍內,因此是另一回事。若想改變內容,要像 s = 'z' + s[1:] 這樣建立新字串再重新綁定。列表由於是可變的,用相同寫法就能改寫元素。

第24題 | 方法的回傳

下列呼叫字串方法的程式,其輸出是哪一項?

s = 'exam's.upper()print(s)print(s.replace('e', 'E'))
  1. 第1行為 EXAM,第2行為 Exam
  2. 第1行為 EXAM,第2行為 EXAM
  3. 第1行為 exam,第2行為 exam
  4. 第1行為 exam,第2行為 Exam
正確答案D. 第1行為 exam,第2行為 Exam

字串方法不會改寫原本的字串,而是建立新字串後回傳。第2行的 s.upper() 會建立 'EXAM',但由於沒有賦值給任何變數,該值就被丟棄,s 仍維持 'exam'。因此 print(s) 的輸出是 exam。第4行是直接顯示 s.replace('e', 'E') 的回傳值,因此會輸出 Exam,但這同樣沒有改變 s 本身。若想保留結果,要像 s = s.upper() 這樣重新賦值。這與像列表的 sort() 那樣就地排序並回傳 None 的方法形成對比。

第25題 | f-string

下列指定格式後顯示的程式,其輸出是哪一項?

n = 2.71828print(f'{n:.2f}')print(f'{"ok"!r}')
  1. 第1行為 2.71,第2行為 'ok'
  2. 第1行為 2.72,第2行為 ok
  3. 第1行為 2.718,第2行為 ok
  4. 第1行為 2.72,第2行為 'ok'
正確答案D. 第1行為 2.72,第2行為 'ok'

f-string的格式指定 :.2f 會把小數點以下四捨五入到2位後顯示,因此 2.71828 會變成 2.72。由於不是捨去,不會是 2.71;2.718 則是寫成 :.3f 時的值。第2行的 !r 是轉換指定,會以 repr() 的形式顯示該值。對字串使用時會帶上引號,因此是 'ok';若不加 !r,就只會輸出 ok。格式指定的語法與 str.format() 相通,因此寫成 '{n:.2f}'.format(n=2.71828) 也能得到同樣的 2.72。

第26題 | split

下列分割字串的程式,其輸出是哪一項?

print('a b  c'.split())print('a,b,c'.split(',', 1))
  1. ['a', 'b', 'c'] 與 ['a', 'b', 'c']
  2. ['a', 'b', '', 'c'] 與 ['a', 'b,c']
  3. ['a', 'b', 'c'] 與 ['a', 'b,c']
  4. ['a', 'b', '', 'c'] 與 ['a', 'b', 'c']
正確答案C. ['a', 'b', 'c'] 與 ['a', 'b,c']

不帶引數呼叫 split() 時,會把連續的空白視為一個整體的分隔符,不會產生空元素。因此 'a b c'.split() 會是3個元素的 ['a', 'b', 'c']。若明確指定分隔字元寫成 'a b c'.split(' '),則會以每個空白逐一切分,因此會留下空字串,變成4個元素的 ['a', 'b', '', 'c']。第2個引數是 maxsplit,表示分割次數的上限,傳入1的話只會切第一次,因此結果是 ['a', 'b,c'],剩下的部分不再切分、合併成一個元素。若省略則會像 ['a', 'b', 'c'] 那樣全部切開。

第27題 | strip

下列削去兩端字元的程式,其輸出是哪一項?

print('xxabxx'.strip('x'))print('xxabxx'.lstrip('x'))
  1. 第1行為 abxx,第2行為 ab
  2. 第1行為 ab,第2行為 abxx
  3. 第1行為 xabx,第2行為 abxx
  4. 第1行為 ab,第2行為 xxab
正確答案B. 第1行為 ab,第2行為 abxx

strip() 的引數是「要移除的字元集合」,只要兩端出現屬於該集合的字元,就會持續削去。它並不是只消除1個作為子字串的 'x',因此 'xxabxx'.strip('x') 會把兩端所有的x都去掉,變成 ab。若以為只會消除1個字元,就會誤選 xabx。lstrip() 只以左端為對象,因此是 abxx;rstrip() 只以右端為對象,因此是 xxab。若省略引數,則會削去空白字元。由於是以集合方式處理,若寫成 'xxabxx'.strip('xa'),就會連左端的xx與a都被去除,只剩下b。

第28題 | join與重複

下列連接字串的程式,其輸出是哪一項?

print('-'.join('abc'))print('ab' * 3)
  1. 第1行為 -a-b-c-,第2行為 ababab
  2. 第1行為 abc,第2行為 ababab
  3. 第1行為 a-b-c,第2行為 ab ab ab
  4. 第1行為 a-b-c,第2行為 ababab
正確答案D. 第1行為 a-b-c,第2行為 ababab

join() 會以呼叫端的字串作為分隔符,連接傳入的可迭代物件中的各個元素。字串本身也是能逐字取出的可迭代物件,因此 '-'.join('abc') 會把 'a'、'b'、'c' 以連字號連接,變成 a-b-c。分隔符只會加在元素與元素之間,不會加在開頭或末尾,因此不會是 -a-b-c-。變成不帶分隔符的 abc,是寫成 ''.join('abc') 的情況。* 運算子會把字串重複指定的次數,因此 'ab' * 3 是 ababab,中間不會加入空白。若想要 ab ab ab,要寫成 ' '.join(['ab'] * 3)。

第29題 | find與index

下列搜尋子字串的程式,其輸出是哪一項?

print('banana'.find('z'))print('banana'.index('n'))
  1. 第1行為 -1,第2行為 2
  2. 第1行為 -1,第2行為 3
  3. 第1行為 -1,第2行為 4
  4. 第1行為 0,第2行為 2
正確答案A. 第1行為 -1,第2行為 2

find() 找不到子字串時會回傳 -1,不會產生例外。由於 'banana' 中沒有 'z',因此是 -1。0是在開頭找到時的值,不要與找不到的情況搞混。index() 在找到時的回傳方式與 find() 相同,'banana' 中 'n' 第一次出現的索引是2,因此是2。變成3是把索引從1開始數、理解成「第3個字元」的情況;4則是最後出現的位置,若想取得這個值,要使用 rfind() 或 rindex()。兩者的差異只在於找不到的情況:index() 會拋出 ValueError: substring not found 並中止處理。

第30題 | raw字串

下列計算字元數的程式,其輸出是哪一項?

print(len(r'a\nb'), len('a\nb'))
  1. 3 4
  2. 4 4
  3. 3 3
  4. 4 3
正確答案D. 4 3

在字面值前加上 r 的raw字串中,反斜線不會被解讀為轉義的開始。r'a\nb' 是 a、反斜線、n、b共4個字元,因此len是4。另一方面,一般字串 'a\nb' 中的 \n 會被替換成1個換行字元,因此是 a、換行、b共3個字元,len是3。若把兩者都當作轉義來數會得到 3 3,都當作原始字元來數會得到 4 4,但重點在於是否有 r 會改變處理方式。即使加上r,型別仍維持一般的str,並不會變成特殊型別。順帶一提,len('\\') 是1,為了寫出1個反斜線字元才重複了2個。

練習:作答本頁的題目

這是隨機出題的練習工具(在啟用 JavaScript 時運作)。即使不使用此工具,也能閱讀上方的所有題目與解說。

※ 解說是供學習用的資訊。考試的出題範圍與制度每年可能變動,請務必確認主辦機構的官方公告。

本頁面譯自日文原文。若譯文與原文內容不一致,以日文版為準。 查看日文原文