---
# System prepended metadata

title: 基礎語法-2

---

---
title: '基礎語法(迴圈)'
disqus: hackmd
---

# 第二節社課
## 前言

第二節課了，希望大家都有寫作業。

---

# 作業題解

相信你們都有寫作業吧?

## a001 哈囉

字串(str)的運用，把2個要求的字串+起來就行了。

## a014 中華民國萬歲！

大家應該都知道西元年轉民國是要`-1911`吧?

## a021 三人行必有我師 

只要用`if`判斷哪個是最大的就行了。
:::spoiler 假如你特別電:lightning:
你也可以用`max`來解喔owob
:::

## b172 等式(1)
如果你想要，你或許可以遍歷整個`str`然後寫一堆`if`，不過很顯然這樣超麻煩，所以我在這邊推薦個好用的東西：`eval()`
這神奇的東西真是太好用了，可以自己研究一下。

:::warning
:warning: 提醒：eval()會**直接執行字串中的 Python 程式碼**，如果這個字串來自使用者輸入，就會有安全風險，所以最好在可控制輸入的地方用。
:::
:::spoiler 順帶一提
如果你去看`AC`列表，你就會發現都是python(統計至2025/9/22下午9:35)，只能說python還是太強大了。(不排除除了資研社以外沒人寫這題的可能就是了)
:::

---

# 迴圈
為了讓程式運行你想要的次數，我們是時候學習一下迴圈了~
最經典的迴圈有2種：
- `while`
- `for`
:::info
:::spoiler 啊遞迴呢??
如果你已經了解到遞迴了，那我可以告訴你，遞迴本質上是迴圈沒錯，但這要在之後的課程才會提到，所以我知道你很急，但是先別急，總會學到的...吧(?
:::
## while迴圈

`while`迴圈是coder們最常用的迴圈之一，他會在後面的條件(bool)成立(True)時執行後面的程式。

```python=
count = 1                     #宣告一個<class 'int'>的count用來數數
while count <= 5:             #這樣會從1跑到5
    print(count, end = ' ')   #1 2 3 4 5
    count += 1                #讓count變大，否則會變成無限迴圈
```
相信這簡單到我不用多說大家都懂(?
我們再看下一個：
```python=
correct_password = "TEmPTaTiON"    #設定正確的密碼
attempt = 1                        #紀錄嘗試的次數
while attempt <= 3:                #嘗試次數不大於3時執行
    pw = input("請輸入maimai中MASTER譜面現定數為14.7，有ASMR但手感很差的傻逼歌:")
    if pw == correct_password:
        print("welcome to maimai~")
        break
    else:
        print(f"你已經錯{attempt}次了，你到底是不是mai眾啊")
        attempt += 1
else:                              #嘗試超過3次(attempt > 3)
    print("摸摸認證 += 1")
```
^上面的歌曲介紹來自高二3xx班的某位打mai的邱先生^
上面的code讓我們可以在使用者輸入超過3次錯誤密碼的時候，讓他無法再輸入密碼。
~~成功阻止沒打mai的人登入了，附上這首歌的[maimai維基](https://maimai.fandom.com/zh/wiki/TEmPTaTiON?variant=zh-tw)~~


:::info
:::spoiler 至於之前提到的多筆輸入...
相信學到這邊都會知道是什麼意思了吧?
`while True:` : 表示當`True`成立，也就是無限迴圈
`except EOFError:` 表示除了發生`EOFError`以外都會執行前面的`try:`，若是發生`EOFError`則執行下面的`break`

附上`EOF`的[維基百科](https://zh.wikipedia.org/wiki/%E6%AA%94%E6%A1%88%E7%B5%90%E5%B0%BE)，簡單來說就是沒有輸入了。
:::success 
:heavy_check_mark:相信現在的你們都可以看懂了:+1:對吧？嗯？
:::

## for迴圈
```python=
for i in range(1, 7): 
    print(f"現在是第{i}次執行迴圈") #現在是第(1~6)次執行迴圈
```
還記得之前我們說過，str是使用==前閉後開==的方式來判斷位置的，`range()`也是前閉後開。
也就是說，上面的`in range(1, 7)`實際上是由1到6，因為後面是==開==，所以不包含`7`。
:::info 
:information_source: 我知道這樣說怪怪的，但就是這樣
:::spoiler 補充：range()是甚麼
```python=
range(10) -> 0 1 2 3 4 5 6 7 8 9
range(1, 5) -> 1 2 3 4
range(1, 7, 2) -> 1 3 5
```
當`range`只有1個數`(n)`時，會由`0`到`n - 1`
當`range`有2個數`(x, y)`時，會由`x`到`y - 1`
當`range`有3個數`(x, y, z)`時，會由`x`到`y - 1`而且公差是`z`
因為是前閉後開所以結尾要記得`-1`
:::
```python=
s = 'nowob_love_peko'
for i in s: 
    print(i, end = ' ') #n o w o b _ l o v e _ p e k o
```
在上面我們看到，`i`跑過了每個在`s`裡的東西，而且這裡的`i`是`char`。
然後我們輸出所有的`i`，而且結尾用空白間隔開。
:::info
:::spoiler 如果想讓`i`的`ascii`碼`+2`再輸出怎麼辦？
```python=
s = 'nowob_love_peko'
for i in s: 
    print(chr(ord(i) + 2), end = ' ') #p q y q d a n q x g a r g m q 
```
1.用`ord(i)`讓`i`變成`ascii`碼 (這是`int`型態)
2.對`i`的`ascii`碼`+2`
3.再把+完2的數字轉回`char`
這樣我們就成功輸出了對每個`i`的`ascii`碼`+2`的東西了。
:::warning 
話說如果你不知道`ascii`是什麼，這裡有[維基百科](https://zh.wikipedia.org/zh-tw/ASCII)。
:::

---

# 作業題目
基礎題：[a038](http://203.64.191.163/ShowProblem?problemid=a038)、[a191](http://203.64.191.163/ShowProblem?problemid=a191)、[a192](http://203.64.191.163/ShowProblem?problemid=a192)
進階題：[a228](http://203.64.191.163/ShowProblem?problemid=a228)
==ps:a191和a192是多筆測資==
