---
# System prepended metadata

title: 基礎語法-3

---

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