--- title: Review tags: sprouts slideOptions: theme: solarized transition: 'fade' --- # Review 搭上複習快車ㄅ!!! --- # Input 篇 燃燒你的IO魂 ---- ## Mission 1 吃甚麼吐什麼 ---- ## Input & Output ```python= # Input hello sprout # Output hello sprout ``` ---- ## Answer ```python= word = input() print(word) ``` ---- ## Caution - input吃進來永遠是字串 ---- ## Mission 2 Eat an integer and print add 1 ---- ## Input and output ```python= #input 1 #output 2 ``` ---- ## Answer ```python= a = int(input()) print(a+1) ``` ---- ## Caution - Input進來會是字串,要用int強制轉型 ---- ## Mission 3 吃很多個整數,每個都加1 ---- ## Input & Output ```python= # Input 3 4 6 # Output 4 5 7 ``` ---- ## Answer ```python= # 吃進input然後以空白分割 # list of string nums_str = input().split() # 用map把裡面每個元素都轉型成int nums = list(map(int,nums_str)) ans = [] for i in nums: # 為了之後用join做準備,所以先轉型 ans.append(str(i+1)) print(" ".join(ans)) ``` ---- ## Caution - 別忘了split - 別忘了轉型 ---- ## 預測未來 ```python a = input("安安") ``` a = ? ---- ## Ans 使用者輸入r,"安安"只是問候語。 ![](https://i.imgur.com/on1NLPi.png) --- # Output篇 ---- ### print(1.1,"23",16,sep=".",end='') ---- ## sep 每筆資料中間銜接的部分。 ```python= print(1,2,3,4) # 1 2 3 4 print(1,2,3,4,sep="*") # 1*2*3*4 ``` ---- ## end 結尾的字元,default '\n' ```python= print("安安") print("Rilak") # 安安 # Rilak print("安安",end='r! ') print("Rilak") # 安安r! Rilak ``` ---- ## 練習 - 3057 : DEBUG 來印三角形吧 --- ## Boolean 布林 ---- ## True vs False ---- ## 運算 - and/or ![](https://i.imgur.com/1iZZJfc.png) ---- ## 運算 - not ```python= not False # True ``` ```python= not True # False ``` ---- ## 運算 - 比較 ```python= 1 > 3 # =>False 1 != 3 # => True 1 == 3 # => False 2 <= 3 # => True 9 > 3 > 2 >1 #=> True ``` ---- ## 運算 x 字串 x 外傳 ```python= "Sprout" == "忠毅" # False ``` ---- ## 運算 x 字串 x 意外 ```python= "123" > 12 ``` ---- ## Python2 ```python "123" > 12 # True ``` ## Python3 ```python "123" > 12 #Traceback (most recent call last): # File "<stdin>", line 1, in <module> #TypeError: unorderable types: str() > int() ``` --- # if 分枝篇 ---- ## if x 基礎 x 格式 ```python= if 條件1: # 做某些事 # 別忘記縮排 elif 條件2: # 若不符合條件1 # 但是符合條件2 # 做某些事 else: # 否則做某些事 ``` ---- ## if x 基礎 x 範例 ```python= Rilak_has_answer = True if Rilak_has_answer: print("Rilak快教教我r") else: print("Rilak快想想r") ``` ---- ## if x 基礎 x 解說 如果Rilak_has_answer,就輸出"Rilak快教教我r",不然就輸出"Rilak快想想r"。 ---- ## if x 變化 x 巢狀 ```python= if 條件: if 條件: #做某些事 else: #做某些事 else: #做某些事 ``` ---- ## if x 變化 x 範例 輸出1-50間所有是3的倍數但不是2的倍數的數字? ---- ## if x 巢狀 x 解法 ```python= for i in range(1, 51): if i % 3 == 0: if i % 2 != 0: print (i) ``` ---- ## if x 巢狀 x 醜 - and ```python= for i in range(1, 51): if i % 3 == 0 and i % 2 != 0: print (i) ``` --- # 迴圈篇 ---- ## 迴圈 x 基礎 x while 只要滿足條件,就繼續。 ```python= while 條件: # 做某件事 # 要記得縮排喔!!! ``` ---- ## 迴圈 x 基礎 x break 一個蘿蔔一個坑。 一個break一個迴圈。 ```python= n = 0 while True: if n > 3: break n+=1 ``` ---- ## 迴圈 x 進階 x break ```python= n = 0 while True: for i in range(5): if n > 10: break n+=3 n+=1 if n > 20: break print(n) ``` 問n = ? ---- ## 迴圈 x 解說 x break <iframe width="800" height="500" src="https://pythontutor.com/iframe-embed.html#code=n%20%3D%200%0Awhile%20True%3A%0A%20%20%20%20for%20i%20in%20range%285%29%3A%0A%20%20%20%20%20%20%20%20if%20n%20%3E%2010%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20%20%20%20%20n%2B%3D3%0A%20%20%20%20n%2B%3D1%0A%20%20%20%20if%20n%20%3E%2020%3A%0A%20%20%20%20%20%20%20%20break%0Aprint%28n%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=0&heapPrimitives=false&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false"> </iframe> ---- ## 迴圈 x 進階 x continue 有時,你會不想跑剩下的東西 ```python= for i in range(10): if i % 3 == 0: continue print(i) ``` --- # 迴圈篇 - 2 ---- ## 迴圈 x 基礎 x for ---- ## 迴圈 x for x Usage 配合range或是其他可以iter東西。 ---- ## 迴圈 x for x 例子 print 1 到 100 ---- ## 迴圈 x for x while解 ```python= k = 1 while k < 101: print(k) k += 1 ``` ---- ## 迴圈 x for x for解 ```python= for i in range(1,101): print(i) ``` ---- ## 迴圈 x range x 基礎 ```python= range(起始值,終止值,變化值) ``` ---- ## 迴圈 x range x 變異 ```python range(起始值,終止值) # 等價於 range(起始值,終止值, 1) ``` ---- ## 迴圈 x range x 孤單 ```python= range(中止值) # 等價於 range(0,終止值, 1) ``` ---- ## 迴圈 x range x 預測 ```python= print(list(range(9,3,5))) ``` --- ## List !!! 很重要!很重要!很重要! ---- ## List x 範例 x 製造 ```python= a = ['rilak',666] # a[0] 是 'rilak' # a[1] 是 666 ``` ---- ## List x 三寶 x len ```python= a = ['rilak',666] print(len(a)) # 2 ``` ---- ## List x 三寶 x 遍歷 b會依序迭代a裡的元素,第一次是'rilak'第二次是666。 ```python= a = ['rilak',666] for b in a: print(b) ``` ---- ### List x 三寶 x 遍歷 x 變異 ```python= a = ['rilak',666] for i in range(len(a)): print(a[i]) ``` ---- ### List x 三寶 x 雜 x min ```python= min([9,4,8,7]) # 4 ``` ---- ### List x 三寶 x 雜 x max ```python= max([9,4,8,7]) # 9 ``` ---- ### List x 三寶 x 雜 x sum ```python= sum([9,4,8,7]) # 28 ``` ---- ### List x 三寶 x 外傳 string也可以比min,max,按照字典序。 ```python= min(['a','b','c','d']) # 'a' ``` ---- ## List x 方法 x append ```python= a = [] print(a) # [] a.append(1) print(a) # [1] ``` ---- ## List x 方法 x pop ```python= a = [1,2,3,4] a.pop(1) print(a) # [1,3,4] ``` ---- ## List x 方法 x insert ```python= a = [1,2,3,4,5,6] a.insert(3,1000) print(a) # [1,2,3,1000,4,5,6] ``` ---- ## List x 方法 x sort ```python= a = [1, 2, 8, 7, 5, 6] a.sort() print(a) # [1,2,5,6,7,8] ``` ---- ## List x 方法 x reverse ```python= a = [1,2,8,7,5,6] a.reverse() print(a) # [6,5,7,8,2,1] ``` ---- ## List x 方法 x reverse 變異 ```python= a = [1,2,8,7,5,6] print(a[::-1]) ``` ---- ## List x 方法 x 比較 ```python= a = [1,2,8,7,5,6] print(a[::-1]) # [::-1]會製造一個新的list a = [1,2,8,7,5,6] print(a.reverse()) # a.reverse() 只會改變自己 # Nothing print(a) # [6,5,7,8,2,1] ``` --- ## 中場休息 - 3058 : ANIHC式排隊 - 3205 : 海捌樂愛的幸運數字 --- ## 字串 x 基礎 x 建立 ```python= a = "Sprouts" ``` ---- ## 字串 x 基礎 x list ```python= a = ['S','p','r','o','u','t','s'] # S a = "Sprouts" a[0] # S ``` ---- ## 字串 x 基礎 x 注意 immutable : 不能被修改 ```python= a = "123456" a[0] = "3" # Error ``` ---- ## 字串 x 三寶 x replace - replace(src, goal) - 因為string是immutable,replace回傳的會是新的string ```python= a = "hortune" print (a.replace("hortune", "rilak")) # rilak print (a) # hortune ``` ---- ## 字串 x 三寶 x split - split(sep,n) - n 代表要split幾個 ```python= a = "hortune rilak" k = a.split() print(a) # hortune rialk print(k) # ["hortune","rilak"] ``` ---- ## 字串 x 三寶 x find - find(target) - 尋找第一個符合target的位置 ```python= a = "hello moto" print(a.find("moto")) # 6 ``` ---- ## 練習 - 3059 : 黑人問號-問號黑人 --- # 字典篇 ---- ## dict x 基礎 x 建立 ```python= a = {"123" : 123, "bbb" : "ccc"} ``` ---- ## dict x 基礎 x 觀念 - 一個key對一個value - key要是immutable ---- ## dict x 基礎 x 插入 ```python= grade = {} grade["rilak"] = 666 ``` ---- ## dict x 基礎 x 遍歷 ```python= temp = {"a":1,"b":2} for i in temp: print(i,temp[i]) ``` ---- ## dict x 基礎 x 查詢 ```python= temp = {"a":1, "b":2} "a" in temp # True "c" in temp # False ``` ---- ## 練習 - 3208 : 海捌樂愛的大冒險 -- 異世界篇 --- # 函數篇 ---- ## 函數 x 基礎 x 定義 ```python= def hello(): pass # 別忘記縮排 ``` ---- ## 函數 x 基礎 x 參數 ```python= def c_sum(a,b,c): return a+b+c ``` ---- ## 函數 x 進階 x 參數 ```python= def pprint(a,b): print(a,b) pprint(1,2) # 1 2 pprint(b=1,a=2) # 1 2 ``` ---- ## 函數 x 變化 x 參數 ```python= def weird(q): q+=1 a = 1 weird(a) print(a) # 1 ``` ---- ## 函數 x 變化 x 參數 ```python= def weird(q): q.append(1) a = [] weird(a) print(a) # [1] ``` ---- ## 函數 x 變化 x 差異 - Immutable type - 傳入後不會影響原本的 - e.g. int, float, str - mutable type - 傳入後會影響原本的 - e.g. list, dict ---- ## 函數 x 變化 x 綜合 <iframe width="800" height="500" frameborder="0" src="https://pythontutor.com/iframe-embed.html#code=def%20qaq%28v_int,v_float,v_str,v_dict,v_list%29%3A%0A%20%20%20%20v_int%20%3D%201%0A%20%20%20%20v_float%20%3D%200.0%0A%20%20%20%20v_str%20%3D%20%22Lucky%22%0A%20%20%20%20v_dict%5B%22hi%22%5D%20%3D%200%0A%20%20%20%20v_list.append%28%22gogo%22%29%0A%0Av_int,%20v_float,%20v_str,%20v_dict,%20v_list%20%3D%200,%201.1,%20%22ykcuL%22,%20%7B%7D,%20%5B%5D%0Aqaq%28v_int,%20v_float,%20v_str,%20v_dict,%20v_list%29%0Aprint%28v_int,%20v_float,%20v_str,%20v_dict,%20v_list%29&codeDivHeight=400&codeDivWidth=350&cumulative=false&curInstr=10&heapPrimitives=false&origin=opt-frontend.js&py=3&rawInputLstJSON=%5B%5D&textReferences=false"> </iframe> ---- ## 函數 x 參數 x default ```python= def weird(a = 1): print(a) weird(2) weird() ``` ---- ## 函數 x 參數 x default - default : 只能在後面 ```python= def weird(a=1,b): print(a) # SyntaxError: non-default argument follows default argument ``` ---- ## 函數 x 參數 x 未知 - 沒有指定名字的參數會被args收走 - 有指定名字會被kwargs收走 ```python= def weird(*args, **kwargs): print(args) print(kwargs) weird(6,6,6,name="rilak") # (6,6,6) # {"name":"rilak"} ``` ---- ## 函數 x 變數 x Scope - 訂在函數外的變數 - 大家都是全域變數 - 平安喜樂 ```python= b = 2 def q(): print(b) q() # 2 ``` ---- ## 函數 x 變數 x Scope - 函數裡的變數 - 只有函數裡能存取QQ ```python= def a(): q = 1 a() print(q) # NameError: name 'q' is not defined ``` ---- ## 函數 x 變數 x Scope - 這樣會如何呢? - 變數的scope在指定時確立 ```python= q = 2 def a(): q = 1 print(q) # 2 ``` ---- ## 函數 x 變數 x 怪異 - 因為python define時是以一個closure去確立變數關係 ```python= b = 2 def q(): print(b) b = 3 q() #Traceback (most recent call last): # File "<stdin>", line 3, in <module> # File "<stdin>", line 4, in q #UnboundLocalError: local variable 'b' referenced before assignment ``` ---- ## 函數 x 怪異 x 發想 - 想讓函數內改變global? - keyword : global ```python= b = 2 def q(): global b print(b) b = 3 q() print(b) # 3 # 3 ``` ---- ## 函數 x 區域 x 尋找 - locals ```python= print(locals()) #{'__spec__': None, '__builtins__': <module 'builtins' (built-in)>, '__loader__': <class #'_frozen_importlib.BuiltinImporter'>, '__package__': None, '__name__': '__main__', '__doc__': None} def qq(): a = 1 print(locals()) qq() # {'a':1} ``` ---- ## 函數 x 函數 x ? ```python= def a(): b = 5 print(locals()) def q(): c = 3 print(locals()) q() a() # {'b':5} # {'c':3} ``` --- # THE END