# 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}]"}
    90 views