--- title: '基礎語法(常用容器)' disqus: hackmd --- # 第三次社課 # 前言 終於來到了段考完的第一次社課,我們資研社的段考會在第5次社課的時候考,只要好好寫作業就可以寫出很好的成績,有獎品喔~(應該啦 --- # 作業題解 ## a038 用個迴圈重複輸出`n`次即可。 ## a191 ==注意是多筆測資== 我們觀察到,要輸出的是三角形,而且每層都比上一個多一個`%`。 因為要輸出的是三角形,所以我們需要1個`for`迴圈來判斷我們要輸出多少層, 又觀察到每層需要的`%`數剛好是`層數(i)`個, 所以可以用上之前教過的,對輸出`* i`,輸出`i`個`%` ## a192 邏輯和上面一樣,只是變成判斷要輸出多少個`空格`。 而且我們觀察到每一行輸出都是`n`個字元, 所以可以在判斷完要多個空格後輸出"`n - 空格數`"個`%`。 ## a228 雖然題目全英文好像很可怕,但其實就是教你數有多少個單字而已。 觀察到就算是`,`後面也都有空格,所以我們可以把它全部存進一個`str`, 然後找出有多個空格就好了。(注意他要求的是單字數,所以空格數要記得`+ 1`) 最後再`if`判斷他的字數夠不夠,要輸出的答案是什麼就可以了。 # 常用容器 # ## list(串列/陣列) ## 陣列就像是把很多個`int`串起來,變成一個長長的資料結構。 ```python= lst = [1, 4, 5, 1]#想讓使用者輸入的話就lst = input().split() (會是str) #如果想要是int的話要lst = list(int, input().split()) lst.append(4) # 加東西到最後面 print(lst) # [1, 4, 5, 1, 4] print(lst[0]) # 1(是前閉後開,相信我不用再教一次) lst.pop() # 把最後一個刪除 print(lst) # [1, 4, 5, 1]刪去了第二行加進去的4 ``` 和之前教的迴圈結合起來就可以遍歷了,例如: ```python= lst = [1, 4, 5, 1, 4] for i in lst: #讓i依序跑過每個lst裡的東西 print(i, end = ' ') #1 4 5 1 4 ``` 就像這樣~ ## dict(字典) ## 類似C++的map,可以用==唯一的==`key`值對應特定的`value`,拿來查東西很方便。 ```python= score = {"peko": 100, "miko": 90} #以前面的str對應到後面的int(注意是大括號) score["peko"] += 10 #peko得分+10 print(score) # {'peko': 110, 'miko': 90} for name in score.keys(): #.keys()來拿出前面的key print(name, score[name]) #peko 110 #miko 90 ``` :::info :::spoiler 至於剛剛提到的`.keys()` 我們都知道dict有2種值,而個別提出來的方式有3種。 1.`.keys()`抓出來的是前面的索引值。 2.`.values()`抓出來的是後面的特定值。 3.`.items()`會把兩個都抓出來。 實際使用長這樣: ```python= score = {"peko": 100, "miko": 90} for name in score.keys(): print(name, end = ' ') #peko miko print() #換行 for name in score.values(): print(name, end = ' ') #100 90 print() #換行 for name in score.items(): print(name, end = ' ') #('peko', 100) ('miko', 90) #(順帶一提這是tuple) print() #換行 for name, score in score.items(): #用name代表key,用score代表value print(name, score, end = ' ') #peko 100 miko 90 ``` ::: :::warning 注意:開頭的str雖然可以使用int存成`int : int`的形式,但不管是`str`或是`int`都是不能更動的,例如: ```python= score = {1: 100, 2: 90} #1號100分、2號90分 score[100] = score[100] + 1 #不能直接讓1號變成2號 print(score[100]) ``` 會報錯:`KeyError: 100` 因為你沒有定義`100 : x`,沒有`100`這個索引值,所以他認為`score[100]`是個不存在的東西。 ::: 那我們要怎麼對一個`dict`增加索引值呢? ```python= score = {1: 100, 2: 90} #我們有2種方法 #1. score[100] = 1 #python會很聰明的自己開一個新的索引值100 #2. score.update({200: 2}) #告訴python你要一個叫做200的索引值而且值是2 print(score[100], score[200], end = ' ') #1 2 print(score[100] + score[200]) #3 ``` 不過第2種有點毒可以不用記沒關係。 那要是我不知道這個索引值有沒有被定義要怎麼找呢? ```python= #我們可以用.get()~ score = {"peko": 100, "miko": 90} print(score.get("neko")) #None(沒有這個 key,回傳None) print(score.get("neko", 0)) #0(可以設定你想回傳的值) print(score.get("peko", 0)) #100 ``` 這樣就可以避免前面提到的沒有定義過這個索引值的問題了。 :::info :::spoiler 那我們前面的`score[100] = score[100] + 1`要怎麼改呢? 我們可以先開一個`100`的索引值: ```python= score = {1: 100, 2: 90} #1號100分、2號90分 score[100] = 1 #先讓100號得1分 score[100] = score[100] + 1 #這樣就能+1了 print(score[100]) #2 ``` 這樣就不會報錯了。 ::: ## set(集合) ## 用來存==不重複==的東西,像數學裡的集合。 存到一樣的東西會==自己刪掉== ```python= s = set() s.add(3) s.add(3) s.add(4) s.add(2) print(s) # {2, 3, 4}(3只會有1個,重複的會自己刪除) s.remove(3) # 移除'3' if 3 in s: print(s) else: print('3不在集合裡') #輸出這個 ``` 因為`set`不能存重複的東西,所以當我們移除`3`時,`s`變成了空的`set`,導致輸出了`3不在集合裡` :::info 如果你自己去嘗試可能會看到`set`看起來是排序過的,但其實`set`是無序(`unordered`)的,輸出出來的順序是由內部雜湊演算法決定的,==不一定是排序好的==。 至於雜湊是什麼,這太難了現在不適合教,所以有興趣的我可以給你[維基百科](https://zh.wikipedia.org/zh-tw/%E6%95%A3%E5%88%97%E5%87%BD%E6%95%B8)的連結。 若是想要保證排序過的話,請自己用`sorted()`函式。 ```python= s = set() s.add(3) s.add(3) s.add(4) s.add(2) print(sorted(s)) #{2, 3, 4} ``` ::: --- # 作業 基礎題:[a168](http://203.64.191.163/ShowProblem?problemid=a168)、[a707](http://203.64.191.163/ShowProblem?problemid=a707)、[a699](http://203.64.191.163/ShowProblem?problemid=a699) 進階題:[a890](http://203.64.191.163/ShowProblem?problemid=a890)