# python基礎語法
## CRC第46屆資訊營
---
# 運算子
----
## 運算子是什麼
運算子可以對資料和變數進行操作。
python裡面有很多種運算子。
----
## 算數運算子
算數運算子可以進行數學運算。
像是:加減乘除、次方、商數餘數。
算數運算子的用法就和平常寫數學一樣,而商數餘數的優先級跟乘除一樣。
----
## 賦予運算子
賦予運算子都是建立在等號 = 上。
而 x = a 就是將x裡面裝的值變成a。
而各種其他的賦予運算子,都是這個的變體,
例如:`x *= a`和` x = x * a`是一樣的。
----
## 優先順序
在python中,同種優先順序下,左邊會優先執行。
運算的優先順序是:
括號>算數>比較>邏輯>賦予
----
## 小括號
就像數學中的括號一樣,小括號內的東西
會被優先執行。
python中要優先只要用小括號就好,
不要用中括號或大括號。
---
# 邏輯判斷
在各種程式語言中,經常會需要判斷一件事情
是否成立,這就是邏輯判斷。
----
## 邏輯值/布林值
如果我們要多次用到同一個比較的結果,
我們可以把比較的結果存起來。
這個存起來的值就叫邏輯值或布林值(boolean),有
「真」(TRUE)和「偽」(FALSE)兩種。
----
## 比較運算子
比較運算子可以比較兩個數字的關係,看它們
有沒有符合這個比較的關係。
比較運算就是數學中常見的大於、小於、等於、
不等於之類的。
----
## 邏輯運算
邏輯運算子可以進行
邏輯運算共有三種:及、或、反。
----
### 及
及的運算子是and,有兩個輸入和一個輸出。
只有當兩個輸入都為「真」的時侯,
才會輸出「真」。
----
### 或
或的運算子是or,有兩個輸入和一個輸出。
只要有其中一個為「真」的時侯,
就會輸出「真」。
----
### 反
反的運算子是not,只有一個輸入和輸出。
當輸入「真」的時候,就會輸出「偽」;
而輸入「偽」的時候,就會輸出「真」。
----
## 串接比較
如果一連串的比較接起來的話,相當於個別拆開,以and連接。
像是`a>b!=c`跟`a>b and b!=c`是一樣的。
----
### 範例
```python
a, b = 1, -5
print(a>b>0, a>0>b, 0>a>b)
```
結果:
```python
False True False
```
----
### 小測驗
如果要`a>b and not (b>c or a>c)`為真的話
,a、b、c的關係要如何?
----
### 解答
`c >= a > b`
---
# python的格式
雖然python是非常不嚴格的程式語言,不過還是有一些規定。
----
## 註解
如果想要寫一段話來解釋這段程式的用途,又
不想讓電腦執行那段文字,就要用註解。
註解的開頭是井字號「#」,在這之後,
一路到行尾的文字都不會被執行。
如果要把大範圍的東西都註解的話,
就可以用多行註解包起來。
----
## 範例
```python
stage = 1 # 初始階段
'''
def test():
print(stage)
因為只是測試用,所以先註解起來以免等一下又有問題
'''
```
----
## python的換行
在python中,換行可以讓電腦區分哪裡是上一句程式、哪裡是下一句。
如果想把同一句拆成好幾行的話,可以在行尾加上反斜線「\\」,這樣電腦就會把它們當作同一行。
----
## python的縮排
python中,縮排是定義結構的方法。
因為不像其他語言有分層的符號,縮排和冒號是電腦判斷分層的方法。
冒號代表開始下一層,相同縮排的會被認為是同一層,上層的縮排會比下層的少。
---
# 條件判斷句
條件判斷句可以依據某個條件,來決定要不要執行一段程式。
----
## if如果
如果要在某件事為真的時候做某件事,就可以用if。
像是這樣:
```python
if a>1:
print(a+1)
```
----
如果我們要讓一個條件為真的時候做某件事,為偽的時候做另一件事,我們可以再寫一個if判斷。
```python
if a==0:
print("No")
if not a==0:
print("Yes")
```
----
## else否則
除此之外,也可以用else來簡化。
```python
if a==0:
print("No")
else:
print("Yes")
```
----
## elif否則如果
如果要分成更多種情況的話,我們可以用elif,
elif是else和if的混合。
當前面的if和elif的條件都是偽的話,
這個elif裡面的東西才會執行。
----
### elif範例:
```python
a = int(input())
if a>0: #看是不是正數
print("+")
elif a==0: #知道不是正數,看是不是0
print(0)
else: #知道不是正數也不是0,所以就是負數了,不用再寫if
print("-")
```
這樣就會告訴我們輸入的數字的正負了。
小測驗:
如果我們把elif改成if,會怎麼樣呢?
---
# 迴圈
有時候,我們會需要重複執行一些一樣或非常相似的程式碼,可以使用迴圈來執行。
使用迴圈可以讓程式更簡潔易懂。
----
## for迴圈
for迴圈是用在有一串的資料的時候,可以從那個集合中一個個取出。
集合通常是List,但也可以是一個字串。
----
## range()
pyhton有內建的range(),可以輸入開始和結束的範圍,會產生一個List。
如果要從0開始的話,也可以不寫開始。
另外,也可以設定每次要加多少,寫在最後面。
----
### 小測驗
像是這樣的程式,會跑出什麼呢?
```python
for i in range(9, -2, -1):
print(i)
```
----
答:會把從9到-1的數字輸出。
因為range的判斷依據不是i<b,而是i!=b,所以如果後面是負的,就會停在b+1。
----
## while迴圈
while迴圈會在某個條件為真的時候,不斷地執行。
----
```python
while a<b:
print(a)
a+=1
```
這段程式會把a到b-1的數字輸出,並且把a變成b。
小問題:
* 如何用for迴圈達到同樣的效果呢?
----
## 巢狀迴圈
巢狀迴圈是指在一個迴圈裡面放入另一個迴圈。
也可以再放更多層,但是太多的話電腦會當掉。
----
這樣就可以做出像是九九乘法表的東西:
```python
for i in range(1, 10): # i從1到9
for j in range(1, 10): # j從1到9
print(i*j, end=" ")
print()
```
補充:end=" "是讓他print之後不要換行,而print()就是直接換行。
----
## 迴圈控制
----
#### 1. break 跳出
迴圈除了自己一遍遍跑完後停下來以外,我們也可以透過「break」在某個時候直接讓它停下來。
在執行break之後,迴圈會直接跳出這一層,也不會執行這一圈後面的東西。
----
#### 2. continue 繼續
如果只是想要讓這一圈後面的東西不要執行,但還是要跑完這一層的其他圈的話,就可以用「continue」來跳過這一圈後面的東西。
----
這兩個迴圈控制的方法,配合前面講到的
邏輯判斷,有時候可以省下很多的時間。
像是這段程式可以儲存1到100的質數:
```python
A=[]
for i in range(2, 100):
ok = True
for j in range(2, i):
if i%j==0: #i被j整除
ok = False
break #確定不是質數就可以跳過了
if not ok:
continue
A.append(i)
```
----
### 停不下來的迴圈
有時候,迴圈會停不下來,這會導致電腦不停的執行,而有可能會程式終止,甚至可能會當機。
因此在執行程式之前,請務必要確認
程式會不會停止。
---
# 函式
----
## 為什麼要用函式
如果在好幾個地方,都要用到長得很像,甚至是
只有變數名稱不同的一段程式的話,我們可以把它
寫成一段「函式」。
除此之外,函式也可以方便修改和理解。
----
## 函式的定義與呼叫
```python
def 函式名稱(函式參數1, 函式參數2, ...): # 定義、宣告函式
一段程式
return 回傳值1, 回傳值2, ...
函式名稱(資料參數1, 資料參數2, ...) # 呼叫函式
```
函式的輸入叫做參數,輸出叫做回傳值。
----
## 函式的輸出
而如果要函式停止並回傳東西,就要使用
`return a, b, c, ...`
如果沒有要回傳東西的話,也可以後面不加東西。
因為輸出就代表要跑回原本的地方,
所以不能輸出又不結束。
----
### 想一想
```python
def function1(a, b):
if a>b: return a, b
else: return b, a
```
這個函式能做什麼呢?
---
# 全域與區域
----
## 變數的範圍
變數可以依據範圍分成全域和區域,全域就是整個程式的範圍,而區域則是各個函式的內範圍,不同函式的區域也不同。
函式也算是一種全域變數。
----
## 存取變數
python在存取變數時,會優先從區域內尋找變數,再來到區域外。
如果還沒有區域宣告的話,可以從函式裡
直接取得相同名稱的全域變數。
----
## 內外分隔
在函式內外有宣告相同名字的變數的話,裡面的改變並不會影響到外面,也不會覆蓋外面的變數。
----
## global 全域宣告
如果要把內外的變數連起來,就要使用global宣告。在全域宣告之後,這個函式內的這個變數就會和全域變數連起來。如果全域中還沒有這個名字的變數的話,就會進行宣告。
----
## globals()和locals()
呼叫globals()會以字典形式回傳全域中的變數,
locals()則是回傳區域中的變數。
如果有個變數已經經過global宣告後,就不會出現
在locals()中。
如果在全域中呼叫locals(),回傳跟globals()一樣。
----
## 範例
這樣會找到哪幾個變數呢
```python
a = 0
def f1():
global b
b=2
c=1
print(locals())
f1()
```
----
結果:
```
{'c': 1}
```
globals()中可能會有很多隱藏的東西,而且不同
編譯器可能有不同結果,所以這裡不問globals()。
---
# 挑戰題
----
# 挑戰題1
給一個數字n和一個字串s,請輸出n行,每行都會比上一行多一個s。
範例:
輸入:`3 hi`
輸出:
```
hi
hihi
hihihi
```
----
# 挑戰題1-解答示範1
```python
n, s = list(input().split()) # 輸入
for i in range(int(n)): # 輸入的都會是字串,要轉換成數字
for j in range(i):
print(s, end="") # 這樣才不會換行
print(s)# 因為i的第一個是0,最後一個是n-1,所以要多跑一次print()
```
----
# 挑戰題1-解答示範2
```python
n, s = input().split()
for i in range(int(n)):
print(s*(i+1)) # 字串乘上數字就是那個字串重複幾次
```
----
# 挑戰題2
有一串字母,其中只有a和b,請輸出
從頭到尾最長的一串a有多長。
範例:
輸入:`aaababbaabbaba`
輸出:`3`
----
# 挑戰題2-解答示範
```python
s = input()
mx, cu = 0, 0 # 最大值和現在的值
for i in s: # 字串裡的每個字
if i=="a": # 那個字是a
cu += 1 # 把現在值加一
if cu>mx: # 如果比最大值大,就把最大值變大
mx = cu
else: # 如果不是a就要重新算長度
cu = 0
print(mx) # 輸出最大值
```
{"title":"python基礎語法","contributors":"[{\"id\":\"00ad9127-6491-4b3d-829b-7847a217f8e5\",\"add\":12348,\"del\":6597}]"}