---
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)