# python 編譯(compiler):打完全部轉換 c++、C、objective-C、Visual Basic都屬於**編譯** 直譯(interpreter):打完一行轉換一行 所以python、JavaScript、Ruby屬於**直譯** --- ## python應用 人工智慧(人工智慧是指透過普通電腦程式來呈現人類智慧的技術) 股票 晶片 機器人 (人臉辨識) 互聯網 神經網路 創造人:吉多·范羅蘇姆(荷蘭語:Guido van Rossum,1956年1月31日-),生於荷蘭哈勒姆![](https://i.imgur.com/NWeTRJU.jpg) --- ## python簡介 --- ### 變數與資料型態 變數與資料是所有程式語言共同的基礎。不同程式語言的資料型態稍有差異但大同小異,不外乎是整數、小數、布林值 (boolean-True false)、字串等。而變數(variables)是一個可以存取資料的地方(或是標籤),而存取的目的是為了之後可以被重複使用。 ```python= #整數型態範例: a=123 b=456 print(a+b) #結果:123+456=579 ``` ```python= #字串型態範例: a='123' b='456' print(a+b) #結果:123456 ``` --- ### 數值型態及各項 字串型態:str, chr 容器型態:list(輸出為中括號,可變動) dict(字典型態,大括號,可變動) tuple(輸出為小括號,不可動) --- ## 各項函式 --- ### 換行符號:\n、""" ```python= s = "hello\nWorld!" print(s) #output:Hello # World! ``` 或是 ```python= s = """hello World!""" print(s) #output:Hello # World! ``` --- ### 字串中取得某個位置的字元:(x[2]) ```python= s = "nekopara" # 01234567 對應的位置(index),從0開始 print(s[2]) #output:k ``` --- ### 取得字串中一段子字串:(x[2:4]) ```python= s ="sdfgkhjfjk" # 0123456789 對應的位置(index),從0開始 print(s[2:4]) #output:fg ``` 此項符號後面得數字會取該數減一的數值 輸入4(編號第四位) 會取3(編號第三位) 此處有個額外的小技巧,s[2:]會出現編號2以後(***含***)的數字,s[:5]會出現編號5(***不含***)之前的數字,公式: **(string[begin(include):end(not include)]):** begin不填就是從0開始到end的前一位 end不填就是begin到最後一個 上下兩用法在list都可以使用 --- ### 忽視"的意義:\(印出") ```python= s = "hell"o" print(s) #error #會發現這樣寫跳錯誤,原因就是電腦只讀到"hell",這時候就要把l和o之間的那個"的(效果)去 #掉,只要在前面加上\就可以了(如下) ``` ```python= s = "hell\"o" print(s) #output:hell"o #(l後面的"失去作用,變成一個字元,印出後自動刪掉兩旁的觸鬚,得hell"o) ``` 如果想特別標示o: ```python= s = "hell\"o\""(加一個"跟\) print(s) #output:hell"o" ``` --- ### 型別轉換函式:chr(x) (以 ASCII code 文字代碼轉換當例子) ```python= c = 66 print(chr(c)) # 答案:B # 印出來的結果就是將66這個數字以ASCII code轉換成字元的的結果(B) ``` 這項函式**無法將英文或標點符號轉換回來**,如果需要這麼做,我們需要以下含式: --- ### 型別轉換函式:ord(x) 跟上面那則函式相反,這個函示是把英文以ASCII方法轉換成數字,跟上面那則函式有些微差距,我們要指定一個變數,**並指定變數為某個英文字,且必須為字串**,才可下去做變換,下面為範例: ```python= c="f" print(ord(c)) #答案:102 ``` --- ### 將浮點數轉換為整數:int() ```python= floatNum = 55.0 intNum = int(floatNum) print(floatNum) print(intNum) print(type(floatNum)) print(type(intNum)) #答案:55.0 (floatNum的答案) # 55 (intNum的答案) # <type 'float'> (數字55.0的形式(TYPE)) # <type 'int'> (數字55的形式) ``` 此時 floatNum、intNum可替換任何英文,唯獨第二行右半邊的int()不可換 同理,將**字串**變為整數: ```python= stringNum = "55" intNum = int(stringNum) print(stringNum) print(intNum) print(type(stringNum)) print(type(intNum)) #答案:55 # 55 # <type 'str'> # <type 'int'> ``` 這項函式**無法轉換數字以外的事物** --- ### if敘述 根據某個條件來決定是否執行接下來的動作時,就需要用到 if 敘述: ```python= if condition: statement (縮排) ``` Python 中要去判斷「哪些程式碼屬於某層級之下」不是使用大括號 {} ,而是使用縮排判斷,只要在同一層縮排就是屬於上方「:」下的內容。因此**縮排在 Python 中是十分重要的(按一下tab)**。(if、elif(else if)、esle) 範例: ```python= score = int(input("請輸入成績")) if score >= 60: (注意這裡要打冒號) print("成績及格!") #答案:請輸入成績 #(在後面再次輸入數字代表成績) #例:90 成績及格! ``` 請注意!!!if與法理面 input()這個語法,可以用來**使程式讓使用者輸入內容**。當一個變數被指定為 input() 時,預設的型態為 string 。**中文及英文都必須放為字串。** 這裡的"請輸入成績"只是一個代詞,讓使用者知道這裡該輸入甚麼東西 --- ### else敘述(記得縮排) 程式在 if 條件不成立時,便去執行 else 底下的動作,判斷條件不成立(if)時就做另外一件事。 ```python= if condition: statement1 for True condition else: statement2 for False condition ``` 以下是範例: ```python= score = int(input("score:")) if score >= 60: print("成績及格!") else: print("不及格,被當了!") #答案:score: #(在後面再次輸入數字代表成績) #例:90 成績及格! #例:48 不及格,被當了! ``` input必須打出來,不然電腦無法判斷你的score。第一行的"score:"可以輸入任何事物。 --- ### elif(else if)敘述 有的時候需要判斷的可能狀況有很多種時,這時候就可以使用 if-elif-else 結構來描述我們的需求。 ```python= if condition1: statement1 for True Condition1 elif condition2 : statement2 for True Condition2 elif condition3 : statement3 for True Condition3 else: (無須加condition) statements for Each Condition False ``` elif**無個數上限**,可依照自己需求而定多少數量。 以下以成績高低分成A B C D F: ```python= score = int(input("score: ")) if score >= 90: print('Grade is: A') elif score >= 80: print('Grade is: B') elif score >= 70: print('Grade is: C') elif score >= 60: print('Grade is: D') else: print('Grade is: F') #答案:score: #輸入45 得Grade is: F #輸入90 得Grade is: A ``` --- ### 巢狀if 當我們要在判斷條件中安排更進一步的判斷條件時,就需要用到巢狀 if 結構了。所謂的巢狀 if 敘述是指在 if-else 敘述當中,還有另一組 if、if-else 敘述,例如: ```python= ID = input("請輸入") #在Output輸入 year = int(ID[1:3]) #先把輸入指定為整數數字(int) #看該數的編號1到編號2(從0開始,左邊開始) if year < 4: #例:30356 編號1跟2為03,輸出Graduated print("Graduated") elif year <= 7 and year >= 4:#先立好範圍 if year == 7: #30723 編號1跟2為07,輸出Freshman print("Freshman") elif year == 6:#30623 編號1跟2為06,輸出Sophomore print("Sophomore") elif year == 5:#30523 編號1跟2為05,輸出Junior print("Junior") elif year == 4:#30423 編號1跟2為04,輸出Senior print("Senior") else: #32456 編號1跟2為24 為其他 輸出Not Registered Yet print("Not Registered Yet") #答案:請輸入: #輸入45509,輸出Not Registered Yet #輸入40678,輸出Sophomore ``` --- ### 取得列表長度:len() ```python= l = [12,23,34,56,78] lenth = len(l) print(lenth) #output: #5 ``` 一格數字代表1,從1開始 --- ### 拆解字串set() 把**字串**拆成一個集合,特性是不會出現相同元素,python編譯的順序是隨機出現,每次出現都是不同結果。 ```python= s = set("apple")#(必須放字串)**且為小括號** print(s) #output #{'l', 'e', 'p', 'a'}(出現大括號的答案,因為是集合,答案也會是字串) ``` --- ### 取最大值(max(x,y))(注意兩個小括號) ```python= a=3 b=8 print(max(a,b)) #答案:8 ``` 出現的會是a或b所代表的數,不會出現a或b 相對應,最小值的話,把max改成min --- ### 大寫轉小寫(x.lower) ```python= str = "THIS IS STRING EXAMPLE....WOW!!!" print(str.lower()) #答案:this is string example....wow!!! ``` --- ### 妥善處理例外情況(try與except) 一個基本的 try-except 的結構如下: ```python= try: #嘗試執行的程式碼 except 例外名稱: #當遇到例外時要執行的程式碼 ``` 此則算法的用意是,先嘗試執行 try 底下的程式碼,如果無法順利執行,在過程中產生了例外,就會接著執行 except 下的程式碼。except 的區塊也可以有很多個,可以依照個人需求進行使用。 下面的例子,今天想要簡單地請使用者輸入兩個數字,然後輸出兩者相除的結果時,可能會面對到兩種例外:一、使用者拿 0 作為除數。二、使用者輸入錯誤,將數字輸入成英文字母或是其他無法預測的輸入。那麼,為了妥善地處理這兩種不同的例外情況,我們可能會寫出如下的程式碼: ```python= try: a = int(input("請輸入")) b = int(input("輸入")) print(a/b) except ZeroDivisionError:#代表輸入函式的時候把0當除數了 print("Cannot divide by 0!") except: print("Wrong input") #答案: #請輸入:8 #輸入:4 #答案:2.0 ``` 這邊如果被除數輸入8,除數輸出0,就會跳到第二行的except ZeroDivisionError,答案輸出Cannot divide by 0! 最後一行,我們今天被除數輸入8,除數輸入s,此例外並非上一個區塊指定的例外 ZeroDivisionError,就會印出wrong input --- ### 充分的使用 try-except 的結構(try、except、else、finally) 除了剛才介紹過的 try 和 except 以外,我們也可以再搭配 else 以及 finally 兩個關鍵字。**當 try 當中的程式可以正確地執行**,將會**執行 else 區塊**當中的程式碼;而**無論 try 區塊中的程式碼執行以後有沒有產生例外,都要執行 finally 區塊中的程式碼。**。如果執行的是except,就不會執行else的程式碼 我們再從上面的例子在執行一遍: ```python= try: a = int(input("請輸入")) b = int(input("輸入")) c = a/b#注意這邊新增了一個變數,下面才可以指定輸出這個答案(字串) except ZeroDivisionError: print("Cannot divide by 0!") except: print("Wrong input") else: print("The answer is " + str(c))#這裡 finally: print("Program finished") #答案: #請輸入:8 #輸入:4 #答案: #The answer is 2.0 #Program finished ``` --- ## 宣告(def) 我們會利用 def 這個關鍵字來定義我們的 function ,包含**函式名稱**以及**這個函式所需的參數**。 --- ### def運用 今天我們要一次寫出**分辨平閏年**的含式及**判斷該數乘以9是否等於81**的含式,我們就需要def來指定現在電腦該優先執行哪個: ```python= def f(i): #其後都必須加冒號 if (i % 400 == 0) or (i % 100 != 0 and i % 4 == 0): print("閏年") else: print("平年") def r(o): if (o*9==81): print("ok") else: print("讚") o=int(input("請輸入")) r(o) #答案:"請輸入":9 # 輸出:ok ``` 其中這段含式的最後一行 **r(o)的o必須為我們要更改的變數**,r則可以替換數字以外的東西,倒數第二行則為我們對該含式的指令。 --- ### 宣告的回傳值(return True、False)(單一及多數) 非常注意!!!!**True跟False第一個字都要大寫**,沒有大寫這含式不成立,這次不讓他直接印出結果,而是回傳給我這個年份 “是不是” 閏年,也就是 True 或 False : ```python= def check_leap_year(year): if (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0): return True else: return False #宣告並呼叫 year = int(input()) print(check_leap_year(year)) #前面的print極度重要 #答案:輸入:2019 #輸出:False ``` 還需要特別注意的事情是, return 只能回傳單一的值,它可以回傳一個整數(int) 、一個浮點數(float) 、一個串列(list) 、…等等,他可以回傳許多不同型態的物件,但是都只能回傳一個。 但今天我們想要多回傳一點,也是可以,在return True與return False後面增加一個逗號與你想多回傳的數值,將這些值包成一個元組 tuple 再將之回傳,舉例如下: ```python= def check_leap_year(year): if (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0): return True, "123" else: return False, "456" year = int(input()) print(check_leap_year(year)) #如果你要求回傳True或False的話需要在這邊輸入print,要不然函式不成立 #答案:輸入:400 #輸出:(True, '123') ``` --- ### 宣告的回傳值(2)(分配不同變數與其種類) 今天我們想要兩個值分配給不同的變數,在呼叫的地方增加兩個變數讓電腦輸入,方便查看: ```python=(續上題) year = int(input()) is_leap, a = check_leap_year(year) #右邊看到左邊,is_leap跟a兩個值為check_leap_year(year)運算下來的兩個值 ``` 以下為範例: ```python= def check_leap_year(year): if (year % 400 == 0) or (year % 100 != 0 and year % 4 == 0): return True, "123" else: return False, "456" year = int(input()) x, y = check_leap_year(year) print(x, type(x)) print(y,type(y)) #答案:輸入:2019 #輸出:False <class 'bool'> # 456 <class 'str'> ``` --- ### 將a~z轉換成數字(a=1,z=26)並作相對應的計算 ```python= def word2num(s): total = 0 for x in s.lower(): total += ord(x) - 96 return(total) mylist = ["pen", "pineapplepen", "pineapple", "applepen", "apple"] print(sorted(mylist, key=word2num)) #答案:['pen', 'apple', 'applepen', 'pineapple', 'pineapplepen'] ``` 這邊有幾個重點, 第一,第一行的word2num跟s都可以做更改,當然宣告裡面的也要一起改,這樣函示才會成立。 第二,第三行的迴圈意思是遍歷mylist的各項元素,x把有元素提出,**s.lower是把元素裡可能參雜的大寫在內建裡變成小寫**。 第三,第四行我們要每個字母個別儲存起來,所以必須寫成total=total+ord(x)-96;**-96的原因是經過ASCII的轉換,a是等於97的**,不是我們指定的數字。 第四,第五行的**return是因為要個 別 累 加**,所以必須這樣寫。 --- ### 對相同長度的字串以首字母進行排列 當函數 sorted() 要排序一個 tuple 串列時,會先判斷 tuple 當中第一個元素的優先順序,如果相同,會接著判斷下一個元素的優先順序,所以可能會寫出一個 key function 如下: ```python= def multi_sort(s): return (len(s), s) ``` 這個函式會**回傳字串的長度以及字串本身**,因此 sorted() 得到這個函式的回傳值以後,他會**先比較字串的長度**,若長度相同,會接著依照字母順序比較兩個字串。 ```python= def x(s): return (len(s), s)#這裡相反過來就變成優先看首字母,在依照長度排序,當然如果首字母一樣,長度也一樣也是在看第二位 mylist = ["pen", "papper", "pineapple", "applepens", "apple"] print(sorted(mylist,key=x)) #答案: #['pen', 'apple', 'papper', 'applepens', 'pineapple'] ``` --- ## 引含式 python裡有許多引含式,方便我們做各種簡單的運算,而不用在打多行函式來麻煩自己 我們該如何叫出模組呢,我們要先從math裡面抽出該數學的英文,我們以階乘輸入當範例,該這樣輸出: ```python= from math import xxxxxx #從math這個巨集中提出xxxx這個數學的英文,例如根號為sqrt,階乘為factorial。 print(xxxxxx(數字)) #前面如果需要加字的話應該輸出xxxxx(你想輸出的文字,需要**加字串**,並且加一個**逗號**。 ``` --- ### 階乘(factorial) 階乘為倒敘方法(5,4,3,2,1),無法為正敘(1,2,3,4,5),當今天需要一個大數的階乘,我們可以這樣寫: ```python= from math import factorial #中間需要空一行 print(factorial(4)) #答案:24 ``` 當然有比較簡潔的,我們只需要輸入(import)math就好: ```python= import math print(math.factorial(5)) #答案:120 ``` 當然,factorial這個數學函式是一定要打的,這樣電腦才會知道你要運算甚麼 --- ### 根號(sqrt) ```python= from math import sqrt print("Y",sqrt(4)) #答案:Y 2.0 ``` --- ### 最大公因數(gcd) ```python= from math import gcd print(gcd(40,80)) #答案:40 ``` --- ## list的運用 在list的函式運作裡,有一個非常重要的事,一開始的list必須為中括號,這樣才可以做改變,在後面我們欲加的句子呢,則**必須是tuple**,非常重要。 更重要的是,這些含式**無法指定另一個字母來儲存它的變化**,必須在第二行直接範例輸入x.append --- ### 段落內附加**單一個**字串(list.append(欲增加物件)) ```python= thriller = ['Thriller', 'Billie Jean', 'Beat It'] thriller.append('That Girl is Mine') #這邊輸出元素名,注意是小括號!!!! print(thriller) #答案: #['Thriller', 'Billie Jean', 'Beat It', 'That Girl is Mine'] ``` 此方法會輸出引號,故適合用在本來就有引號的字串框框裡 在這則函式裡,我們不會把我們欲加的元素將它變成一個集合(list),例如e=['That Girl is Mine']**(中括號)**,並輸入append(e),這樣的答案會變成['Thriller', 'Billie Jean', 'Beat It', ['That Girl is Mine']]會多出一個中括號。 那如果我們輸入**小括號**n=thriller.append("fuck you"),接著輸入print(n),答案會變成**None**,需要注意。 該函式無法指定位置,必須使用下一則函式: --- ### 指定欲增加物件插入的位置(list.insert(position,欲增加物件)) ```python= t=["apple","tomato","banana"] t.insert(2,"grape") print(t) #答案: #['apple', 'tomato', 'grape', 'banana'] ``` 需要注意的是,這裡如果我們使用insert指定位置並加入bad_2,會出現**整個list**插進去的答案: ```python= bad_1 = ['Bad', 'Smooth Criminal','Speed Demon'] bad_2 = ['Man in the Mirror', 'Dirty Diana'] bad_1.insert(1, bad_2) print(bad_1) #答案: #['Bad', ['Man in the Mirror', 'Dirty Diana'], 'Smooth Criminal', 'Speed Demon'] ``` 有包含中括號,通常這種答案不會是題目要的 --- ### 兩個或以上list以元素方式加入(list1.extend(list2) 如果一次想加入很多個值、或是想將某個 list 中的元素加到另一個 list 的時候,可以用 extend 這個方法: ```python= bad_1 = ['Bad', 'Smooth Criminal','Speed Demon'] bad_2 = ['Man in the Mirror', 'Dirty Diana'] bad_1.extend(bad_2) #這邊只能輸出集合的名字 print(bad_1) #答案: #['Bad', 'Smooth Criminal', 'Speed Demon', 'Man in the Mirror', 'Dirty Diana'] ``` 此方法也可以直接寫出: ```python= print(bad_1+bad_2) ``` 該函式是把第二段,也就是extend後面括號裡的list加到前面的list裡,**答案是印出前者** 有趣的是,我們如果要extend整串的話會變成這樣: ```python= thriller = ['Thriller', 'Billie Jean', 'Beat It'] thriller.extend('That Girl is Mine') print(thriller) #答案:['Thriller', 'Billie Jean', 'Beat It', 'T', 'h', 'a', 't', ' ', 'G', 'i', 'r', 'l', ' ', 'i', 's', ' ', 'M', 'i', 'n', 'e'] ``` 會變成一個字母一個字母輸出,需要注意一下此則訊息。 --- ### 移除元素(list.remove(元素名) 在 remove 後面的括號中輸入想要移除的元素,即可移除。 下面的例子,我們想要將 "Smooth Criminal" 這首歌從 bad 清單中刪去: ```python= bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana'] bad.remove('Smooth Criminal') print(bad) #答案: #['Bad', 'Speed Demon', 'Man in the Mirror', 'Dirty Diana'] ``` --- ### 移除list的最後一個元素(list.pop()) 該函式也是在不知道列表多長的狀況下,直接選取最後一位: ```python= bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana'] popped = bad.pop() print(bad) #(這裡要注意,Dirty Diana已被移除) print(popped) #(此答案為bad列表最後一個元素) #答案: #['Bad', 'Smooth Criminal', 'Speed Demon', 'Man in the Mirror'] #Dirty Diana ``` --- ### 排序list(正)(list.sort()) 括號內不加字的話,字串會照字母順序排列(首個英文字)、數字則會是遞增排列。 以下為英文字排列:(需放字串) ```python= bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana'] bad.sort() print(bad) #答案: #['Bad', 'Dirty Diana', 'Man in the Mirror', 'Smooth Criminal', 'Speed Demon'] ``` 這則函式需要注意的是,如果**其中一個字串的開頭是小寫,就算他的順序在s前面,他也會被sort在s開頭的字的後面。非常重要** 以下為數字範例: ```python= t=[6,3,7.8,94,56] t.sort() print(t) #答案: #[3, 6, 7.8, 56, 94] ``` --- ### 排序list(反)(list.sort(reverse=True)) 當一個序列很亂的時候,需要快速排列大小,從小排到大在上則函式已講到,這邊提供由大到小: 以下為英文範例:(需放字串) ```python= i=["umbrella","zebra","alarm","cheese","dog"] i.sort(reverse=True) print(i) #答案: #['zebra', 'umbrella', 'dog', 'cheese', 'alarm'] ``` 以下為數字範例: ```python= i=[45,90,34,67,89.9] i.sort(reverse=True) print(i) #答案: #[90, 89.9, 67, 45, 34] ``` --- ### 倒轉list(list.reverse()) 跟由大排到小的函式(list.sort(reverse=True)不一樣,這個函式是把**整個函式倒轉過來**。 ```python= bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana'] bad.reverse() print(bad) #答案: #['Dirty Diana', 'Man in the Mirror', 'Speed Demon', 'Smooth Criminal', 'Bad'] ``` 此方法跟sorted的reverse=True不太一樣,這個是把所有在tuple裡面的元素全部倒轉,**不是sorted一樣會看開頭字母進行倒轉** --- ### list的查找(list.index(element)) 在這個函式,我們必須在element的地方輸入想找的東西,不能輸入編號,以 bad 這個 list 為例,如果想要知道 Dirty Diana 這首歌的索引值: ```python= bad = ['Bad','Smooth Criminal','Speed Demon','Man in the Mirror','Dirty Diana'] print(bad.index("Dirty Diana")) #答案:4 ``` 該答案為**Dirty Diana的位置**,這個含式**必須直接印出來**,不能在第二行先index(x),需要注意。 --- ### list的總和(sum(list)) 此函式跟迴圈不一樣,sum不可用其他字替代: ```python= num = [23, 4, 53, 5 ,35, 6] print(sum(num)) #答案:126 ``` 迴圈方法: ```python= o = [23, 4, 53, 5 ,35, 6] for i in o: print(sum(o)) #答案: #126 #126 #126 #126 #126 #126 ``` 會輸出跟list裡的數值相對應的次數,通常不會是題目要的。 --- ### 同時取得一個元素在一個 list 中的 index 與他的值(*for* i , x *in enumerate*(list)): print(i,x) 此用法較為少見,出現在比較雞婆的題型,會輸出該元素的編號跟元素名: ```python= o=["snake","key","dinner","breakfast","lunch"] for p,g in enumerate(o): print(p,g) #答案: #0 snake #1 key #2 dinner #3 breakfast #4 lunch ``` --- ### 更改index的起始值(enumerate(list,start=1)) 繼上則函式的輸出,初始設定都是從0開始,我們可以在函式的後面再加上start=1來指定電腦優先輸出哪一個數字: ```python= o=["snake","key","dinner","breakfast","lunch"] for p,g in enumerate(o,start=2): print(p,g) #答案: #2 snake #3 key #4 dinner #5 breakfast #6 lunch ``` --- ### 讓list元素變成字串以指定的符號隔開(x=','.join(list)) 如果我們想要把 Dangerous 這張專輯輸出成一個用**逗號所隔開**的字串,可以另外產生一個變數x ,並且令他的值為 ','.join(dangerous) ,把 list 的值用逗號串在一起: ```python= o=["snake","key","dinner","breakfast","lunch"] i="/".join(o) print(i) #答案: #snake/key/dinner/breakfast/lunch #引號內輸出斜線,答案也出現斜線 ``` 該函式引號內為我們指定的標點符號,可根據自己的喜好或便於分類來改變 其中,**這則函式僅限於英文字**,**數字不能使用** --- ### 隔開之後再變回原本的list(list.split("先前指定的符號")) 文章說很常用到,但我她媽想不到哪裡可以使用到,先打以免忘記 上則函式把list變為字串,這則函式則是**把字串重新變為最初的list**,我們使用**split**來把我們指定的分隔符號削掉: ```python= o=["snake","key","dinner","breakfast","lunch"] i="/".join(o) #(空一行方便辨識) j=i.split("/") print(j) #答案:['snake', 'key', 'dinner', 'breakfast', 'lunch'] ``` --- ### 將散落的數字或單字以**字串型態**裝進list(input("請輸入").split()) 可以先把input想成一個字串,並輸入函式,電腦會幫我們input的東西以空白做分隔,分成**一個一個字串**,裝進list中 以下為數字範例: ```python= i= input("請輸入").split()#注意引號 print(i) #答案:請輸入:2 3 4 5 6 #輸出:['2', '3', '4', '5', '6'] ``` 如果現在我們要分割一個詞的每格字,我們要再輸入的時候,每個字之間要**隔一個空白鍵**,才可以輸出每個**單一的**字串。 以下為英文輸出: ```python= #請輸入:a p p l e #輸出:['a', 'p', 'p', 'l', 'e'] ``` --- ### 將散落數字以**整數型態**裝進list list=[int(i) for i in input().split()] 上則函式我們提到把散落數字以**字串型態**裝進list中,這則函式則是以整數型態裝進list中: ```python= i=[int(o) for o in input("請輸入").split()]#(int指定只能輸入數字,後面輸入元素,並split分開) print(i) #答案:請輸入:2 3 4 5 6 #輸出:[2, 3, 4, 5, 6] ``` 注意!!!該格子有**int這個函式**,其輸出一定要為數字,這是跟上則函式不同的原因 --- ## 基本運算 --- ### 加法: ```python= x = 3 y = x + 1 (可以縮減為x+=1) print(y) #這時候x的值是4,因為程式會先做右邊再把答案放到左邊的變數 #output:4 ``` 段落內增加數字: ```python= l = [12,23,34,56,78] print(l) l = l+[33,44] print(l) #output: #[12, 23, 34, 56, 78] #[12, 23, 34, 56, 78, 33, 44] ``` --- ### 減法: ```python= x=5 x=x-7(從右邊運算回來左邊) print(x) #output:-2 ``` --- ### 乘法: ```python= s = "rero!" ss = s * 3 print(ss) #output:rero!rero!rero! ``` 段落內的字增加一倍: ```python= l = [12,23,34,56,78] print(l) l = l*2 print(l) #output: #[12,23,34,56,78] #[12,23,34,56,78,12,23,34,56,78] ``` --- ### 除法:/、//(取整數) ```python= a=7.0/2.0 print(a) #答案:3.5 #(此處必須加小數點,**因有整數除整數獲得整數的設計**) a=7.0//2.0 print(a) #答案:3.0 #(注意此處是3.0,**保留取整數的設計**) ``` --- ### 次方(1):** ```python= a=2**3(2的三次方) print(a) #答案:8 ``` ### 次方(2):pow()(或以上次方) ```python= s=pow(4,3)(4的3次方,逗號記得半形,後面的三代表三次方) print(s) #答案:64 ``` --- ### 開根號:pow(X,0.5) ```python= s=pow(64,0.5)(64開根號,逗號記得半形) print(s) #答案:8.0 ``` --- ## 無函式的操作及較難公式 --- ### 交換位置:swap(僅限中括號,小括號無法更動) ```python= a=[123,234,1,2,3] a[4],a[0]=a[0],a[4] print(a) #答案:a=[3,234,1,2,123] ``` C++的解法: ```cpp= #include <iostream> using namespace std; int main() { int a[5] = {123,234,1,2,3}; int x = a[0]; a[0] = a[4]; a[4] = x; for(int i=0;i<5;i++) cout<<a[i]<<' '; } //答案:a=[3,234,1,2,123] ``` --- ### 直接取得列表的最後一個數值(print(x[-1]) 在我們不知道該列表有多長的情況下,我們可以在編號輸出-1,電腦會幫我們自動選擇該列表的最後一個數字 ```python= x = ['Thriller', 'Billie Jean', 'Beat It'] print(x[-1]) #(外面小括號裡面中括號) #答案:Beat It ``` --- ### 刪除某個(段)元素 ```python= l = [12,23,34,56,78] # 0 1 2 3 4 print(l) l[1:3]=[] print(l) #output: #[12, 23, 34, 56, 78] #[12, 56, 78] ``` 刪除了編號1到編號3(的前一格) 刪除單個選項的話: ```python= l = [12,23,34,56,78] # 0 1 2 3 4 print(l) l[2:3]=[]#(後面數字為前者加一) print(l) #答案:[12,23,56,78] ``` 這個函式不管打英文或數字,**不能只填一個數去刪除一個指定的位置**,一定要打兩個數字 **再行更改的話,必須把立場放在最新的答案中** (續上題) ```python= l=[12,23,56,78] # 0 1 2 3 print[2:3]=[] print(l) #答案:[12,23,78] ``` --- ### 修改某索引的元素值 如果必須修改列表中的某幾個位置,可以直接輸入x[0]=某數 必須注意!!這樣會**直接蓋掉原本的值**。如果要增加更改的數值,可以輸入在l[0] = 69之下再行更改 ```python= l = [12,23,34,56,78] print(l) l[0] = 69 print(l) #答案:[12, 23, 34, 56, 78] # [69, 23, 34, 56, 78] ``` 此則函式也是一樣,要打英文的話必須指定兩個數字的位置,**或者,直接輸入"英文",不要在增加中括號** --- ### 多層列表 列表裡面放列表,取值的話就用兩個[],例子如下: ```python= l = [[123,456,789],[234,567,890]] # 0 1 # 0 1 2 print(l) #第一段 全印 print(l[0]) #第二段,先看最外面的中括號,並對應第一個井字號,得出答案 print(l[0][2]) 注意此處無:的號,必須照著數字取樣 #第三段,取第二段[0]的格子,對應第二個井字號,取出編號2的數字,得出答案 #output: #[[123, 456, 789], [234, 567, 890]] #[123, 456, 789] #789 ``` 小題目: ```python= l = [[123,456,789],[234,567,890]] l[0][0:2] = [5,5,5] print(l[0]) 答案:(5,5,5,789) ``` 第二行解釋:把前半段的第0項[0]跟第1項[0:2]刪去並**改成5,5,5** --- ### 費式數列 ```python= nterms = int(input("How many terms? ")) #輸入我們要取費式數列的第幾位,從1開始 n1, n2 = 0, 1#指定該數列的第一(0)位跟第二(1)位為0跟1,費是數列都是先從0跟1開始。 count = 0#**從0開始**,這樣就不用換算成程式的位置,我們想讓程式輸出多少個數字一目了然,如果今天從1開始,我們輸入3,就只會出現兩個數字 if nterms <= 0: print("Please enter a positive integer") #如果我們輸出0,印出"請輸入正整數"。 elif nterms == 1: print("Fibonacci sequence upto",nterms,":") print(n1)#數列的第一(0)位跟第二(1)位已經被指定好,需印出n1得值,否則答案就只會輸出:Fibonacci sequence upto 1(nterms) :(":") else: print("Fibonacci sequence:")#例:輸入3,輸出Fibonacci sequence: #0 #1 #1 #因為沒有強制不換行,所以輸出是分行的 while count < nterms:#當輸入的數字大於0 print(n1)#輸出0(n1) nth = n1 + n2#第一波n1+n n1 = n2 n2 = nth count += 1 ``` 這則含式有個重點,我們一開始輸入1,會出現一個數字,輸入2出現兩個,以此類推,**不要跟python得從0開始搞混了** --- ## 迴圈 for 和 in 是迴圈的關鍵字,這兩個關鍵字**之間**會放我們自訂的變數(x),而 in的後面則可接一個序列 (Sequence),迴圈會依序從序列 (例如: 一連串清單資料,一組數字或一個名單) 裡按照順序取得元素,並將元素指派給前面自訂的變數(x),然後執行迴圈裡的內容 --- ### 按照順序印出或根據範圍大小印出(for x in x) ```python= for i in x: print(i) ``` 例如,[1,2,3,4,5]此語法可建立1,2,3,4,5共五個元素,下面是一個使用 for-loop 將 list 中的序列性資料**逐一**列印出來的例子: ```python= sequences = [0, 1, 2, 3, 4, 5] for i in sequences: print(i) print(sequences) #答案:0 [0, 1, 2, 3, 4, 5] # 1 [0, 1, 2, 3, 4, 5] # 2 [0, 1, 2, 3, 4, 5] # 3 [0, 1, 2, 3, 4, 5] # 4 [0, 1, 2, 3, 4, 5] # 5 [0, 1, 2, 3, 4, 5] ``` 以下為文字型態: ```python= theBeatles = ['John Lennon', 'Paul McCartney', 'Ringo Starr', 'George Harrison'] for beatle in theBeatles: (i) (x) print (beatle) print (theBeatles) #答案: #John Lennon ['John Lennon', 'Paul McCartney', 'Ringo Starr', 'George Harrison'] #Paul McCartney 以下省略三次 #Ringo Starr #George Harrison ``` 此項函式的作用是**遍歷序列中的元素,不用打每個序列就可以出現全部,可以用在print多個數量**。 一開始,電腦會先執行i=0的編號,執行完之後回去for i in sequences,在執行一次,這次是i=1,重複執行,直到數列結束,這個行為叫迴圈。 跟直接print sequence**不同的是**,直接印出來會把中括號印出來,結果是橫向的,並根據列表內的字元數印出相對的數量,**迴圈的話,答案會是直的。**(除非另加指令,後期會提到) 串列裡面可以是數字以外的文字,但必須放字串(") 如果不需要取某幾位(編號)(此方法也可適用於英文字串): ```python= sequences = [ 1, 2, 3, 4, 5] for i in sequences: if i!=sequences[3]: #(冒號要打)(這裡代表i不等於sequences的編號第三位,出現False,不會印出來) print(i)#(**記得在縮排一次**) #答案: #1 #2 #3 #5 ``` --- ### 有規定次數的迴圈 for x in range() 現在,有個狀況,我們必須印出hello一百次,我們該怎麼做呢: ```python= sequences = "hello" for i in range(100): (冒號記得) print(sequences) (縮排) #答案:hello #下面省略99次 ``` 這邊要注意,我們要的是sequences的次數,如果我們在最下面指定print輸出i的話: ```python= sequences = "hello" for i in range(100): print(i) #答案: #0 #1 #2 #3 . . . #99 ``` 答案會是不同的,這邊輸出的是100個數字是hello的**編號**,而不是單純的0~99 --- ### 建立整數(含遞增減 序列for x in range() print(x, end="") 在 Python 程式語言中,range()函式可以很有效率地協助我們創建一個整數序列,用法為 (起始值, 終止值, 遞增(減)值),例如: range(10):產生從0到9的整數序列。 range(1, 11):產生從1到10的整數序列(未指定遞增值的情況下,其遞增值預設為1)。 range(0, 10, 2):產生從0, 2, 4, 6, **8**的整數序列(遞增值為2)。 利用range() 函式,可以很方便的建立出一個整數序列 純終點值: ```python= for i in range(10):(最重要的冒號) print(i, end=" ") #答案:0 1 2 3 4 5 6 7 8 9 ``` 有起點與終點值: ```python= for i in range(2,12): print(i,end=" ") #答案:2 3 4 5 6 7 8 9 10 11 ``` 含初始值、終點值、遞**減**值 ```python= for i in range(20, 2, -2): print(i, end=" ") #答案:20 18 16 14 12 10 8 6 4 ``` --- ### 巢狀迴圈 特性是在**迴圈裡面又包覆著其他的迴圈。** 內層迴圈只是外層迴圈內所要執行的一段程式敘述而已;因此外層迴圈每動作一次,內層迴圈就會把整個迴圈執行一遍,執行完畢後才跳回到外層迴圈準備下一次的動作。 前面所提到的單層迴圈適用於**單一控制變數的反覆計算**,這個控制變數的意義可以是迴圈執行的**次數**或是任意連續變化的物理量。 如果今天我們所要處理的問題具有**重複執行某段敘述的特性**,而且這些敘述受到**兩個 (或兩個以上) 的變數來分別控制其變化**,此時使用巢狀迴圈的技巧來撰寫功能需求會是最適合的方式。 九九乘法的資料共有九列九行資料,所以這是一個使用兩層巢狀迴圈結構來撰寫的良好案例: ```python= for x in range(1, 10): #直向數據 for y in range(1, 10):#橫向數據 if y == 9: print("\t", x*y) # y == 9時,換行 else: print("\t", x*y, end = '') # y < 9時,不換行 答案: 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81 ``` **這裡的\t為一個tab,用途是使每個數字之間都有適當的距離**。 **那end=""則是規定程式不要換行** --- ### 規則或不規則的迴圈結束(break 和 continue) **規則**的結束方式是當迴圈的判斷條件不再符合時,迴圈自然結束。 而**不規則**的迴圈結束則是在迴圈自然結束前,我們已經得到想要的運算結果,利用強制中斷的方式來結束迴圈。 break:中斷迴圈的執行 continue:不會讓迴圈結束;只跳過迴圈內 continue 後面的剩餘敘述,接著繼續執行下一次的迴圈運作。它的目的是為了讓程式不執行迴圈結構內的某些敘述 以下為break的範例:(break函式無!=的使用) ```python= for i in "Hey Jude":#(冒號) if i == "u":#(冒號)(縮排) break#(再縮一次) print(i)#(縮排*1) #答案: #H #e #y #j ``` 以下為continue的範例: ```python= for i in "hello world": if i =="r": continue print(i) #答案: #h #e #l #l #o #w #o #l #d ``` 如果使用(!=) 可看成與==完全相反的答案 ```python= for i in "hello world": if i !="r": continue print(i) #答案: #r ``` --- ### 重覆某些運算,出現指定的特殊狀況時才停止(while) 一般而言,for-loop(for x in) 比較適用在「已知迴圈數」的問題,而 while-loop 則適用在「無法預知迴圈數」的問題上。 while-loop 在執行其內部敘述之前,都會先檢查條件判斷式,如果**其判斷值為真 (True),則執行迴圈內部的敘述**;**否則就結束 while-loop。** 若我們要產生一筆 1, 2, 3, …, 10 的序列,用 while-loop 可以這樣寫: ```python= i = 1 #(起點數字1) while i <= 10: #(加冒號) print(i, end=" ") i = i + 1 #答案: #1 2 3 4 5 6 7 8 9 10 ``` --- ### 計算一個數列的加總 利用 while-loop 計算 1 加到 10 的和,並將每次累加之後的值列印出來: ```python= sum = 0 #(紀錄累加的結果) i = 1 #(數列的初始值) while i <= 10: sum = sum + i #(須注意是i,不是1) #(第一次運算:0+1=1,記錄到sum) i = i + 1 #(這裡加一) print(sum, end= " ") #(這邊不能縮排) #答案:55 ``` 倒數兩行可直接寫作:print(sum) 如果打出end=""就必須加print() 其中,sum在這裡只是一個代詞,可換成任意字 **以下為使用for 的語法:** ```python= t=0 #(累加的結果) for i in range(1,11): t=t+i print(t) #答案:55 ``` --- ### while與continue、break的合併使用 今天我們一樣要列出1~10的序列,但我們中間想忽略掉某數,該怎麼做: ```python= i = 0 while i < 10: #(運算下來,i+1會等於10,所以無需輸入等於) i = i + 1 if i == 4: continue print (i, end = " ") #答案: #1 2 3 5 6 7 8 9 10 ``` 這邊提供一個遞減的數列:(9~0並跳過4) ```python= i = 10 while i > 0: i = i - 1 if i == 4: continue print(i, end = " ") #答案: #9 8 7 6 5 3 2 1 0 ``` --- ### 階乘(2)第一個在引含式 ```python= v=int(input("請輸入")) total=1 for i in range(1,v+1): total=total*i #total一開始乘i的1,算到右邊的total #設v=5 #1.1(t)*1(i)=1 total等於1 #2.1*2=2 #3.2*3=6 #4.6*4=24 #5.24*5=120 i=i+1 print(total) #答案:120 ``` --- ### 字典裡的指定值迴圈(key) 這裡的答案跟dict.key的答案不一樣,這個答案純粹輸出key,無任何的小括號,而且換行排列: ```python= f={"d":"h","aaaaaaa":"peko","幹":"粉紅jet"} for i in f: print(i) #答案: #d #aaaaaaa #幹 ``` --- ### 字典裡的指定值迴圈(2)(key,value)(for i,j in dict.items()) 這個函式也跟dict.items()不一樣,而且key值跟value值中間會有空格,比較好查看: ```python= f={"d":"h","aaaaaaa":"peko","幹":"粉紅jet"} for i,j in f.items(): print(i,j) #答案: #d h #aaaaaaa peko #幹 粉紅jet ``` 但這個函式有幾個需要注意的地方,因為key值跟value值式兩個變數,我們需要建立**兩個變數儲存它**,還有items**後面要加個裡面無東西的小括號**,才不會出現錯誤。 --- ## 集合、字典的基本運算 dictionary 是一種較為複雜的資料結構,對於資料的查找很方便。 舉例來說,一部電影會有導演、演員、年份、得到的獎項等等資訊,如果要把資訊整合在一起、使寫程式時表示起來比較方便查詢時,我們就會使用 dictionary 來儲存與這部電影相關的資訊。 --- ### 判斷某資料是否在集合中(元素 in 集合)or(元素 not in 集合) ```python= s1 = {6,3,4,2,9} #注意是大括號 print(3 in s1) #這裡是小括號 print(87 in s1) print(3 not in s1) print(87 not in s1) #output: #True #False #False #True ``` 這邊有一個集合s1,我想知道3和87是否在集合中,所以用in這個語法去檢查。 3有,所以會輸出True 87不在集合中,所以會輸出False not in 就是檢查3和87是否不在集合中 3是有在集合中的,所以"3不再集合中"這個敘述是錯誤的,因此輸出False 87確實不在集合中,因此輸出True --- ### 交集(&)(找出重複) 有時必須找出兩個集合的共通數字,此時第一次使用大括號以及& ```python= s1 = {6,3,4,2,9} s2 = {2,3,4,6,1} s3 = s1&s2(&為取共通數字的符號) print(s3) #output: #{2, 3, 4, 6} ``` 明顯的,s1和s2交集(重複的元素)有2,3,4,6這四個元素。 --- ### 反交集(^)(找出不重複) 找出兩個集合裡**沒重複**的數據: ```python= s1 = {6,3,4,2,9} s2 = {2,3,4,6,1} s3 = s1 ^ s2 print(s3) #output: #{1, 9} ``` --- ### 聯集(輸出全部但不重複)(|) 聯集(兩個集合中所有元素,**不會重複**),聯集要用|這個語法。 ```python= s1 = {6,3,4,2,9} s2 = {2,3,4,6,1} s3 = s1|s2 print(s3) #output: #{1, 2, 3, 4, 6, 9} ``` 適合使用在需快速排列兩串數字的排序及大小 --- ### 差集(從s1中刪去**和s2重複**的元素)(-) **從s1中刪去*和s2重複*的元素** 必這邊可以看到s1和s2重複的元素有2,3,4,6,因此s1和s2做差集的運算後會得到~~6~~,~~3~~,~~4~~,~~2~~,9,只剩下{9}, ```python= s1 = {6,3,4,2,9} s2 = {2,3,4,6,1} s3 = s1 - s2 print(s3) #output: #{9} ``` --- ### 指定輸出全部key值(dict.keys()) ```python= d={"carpenter":"wood",'評偉':'你在大聲甚麼拉', '國棟': 'aaaaaaa'} print(d.keys())#須注意key要加s,不管你有幾個key值 #答案:dict_keys(['carpenter', '評偉', '國棟']) #答案輸出前面會自動出現dict_keys ``` 此方法可以使用迴圈完成,地點在迴圈方格裡 --- ### 指定輸出全部value值(dict.values()) 有key就會有value值,重點跟上則函式一樣 ```python= d={"carpenter":"wood",'評偉':'你在大聲甚麼拉', '國棟': 'aaaaaaa'} print(d.values()) #答案:dict_values(['wood', '你在大聲甚麼拉', 'aaaaaaa']) ``` 此方法不可以使用迴圈完成 --- ### 印出字典裡所有元素(集合名.items()) 需要注意的是,這個跟直接print集合名不一樣,此則函式輸出的會是由**小括號框起來**的答案,開頭還會幫你輸出dict_items,適合快速查看key值跟value值關聯 ```python= d={"carpenter":"wood",'評偉':'你在大聲甚麼拉', '國棟': 'aaaaaaa'} print(d.items()) #答案:dict_items([('carpenter', 'wood'), ('評偉', '你在大聲甚麼拉'), ('國棟', 'aaaaaaa')]) ``` 此方法可以使用迴圈完成,地點在迴圈空格裡 --- ### 輸出指定value值(集合名[key值]) 寫法:字典名={“key1值” : “key1值對應到的值”,“key2值” : “key2值對應到的值”,…} 對應到的值可能是字串、整數…等等,不一定只是數字。 (**對應值、KEY值除數字外,都必須加"變字串**) ```python= d = {"ahoy!":"寶鐘瑪琳","peko!":"兔田配可拉","A":"噶嗚·古拉"}#(注意字串) print(d["A"])#(中間是中括號) #output: #噶嗚·古拉 ``` 印出d裡面"A"對應到的值,輸出噶嗚·古拉 輸入對應值,不會出現KEY值,**會出現錯誤** --- ### 輸入錯誤key值並避免出現錯誤(或指定)訊息(list.get("錯誤key")) ```python= d = {"ahoy!":"寶鐘瑪琳","peko!":"兔田配可拉","A":"噶嗚·古拉"} print(d.get("幹"))#這邊有個重點,外部跟內部的括號都是小括號 #output:none ``` 那如果今天我們需要輸出指定的字呢,很簡單,只需要在錯誤的KEY值後面加個逗號並輸入指定的字樣就好。 ```python= d = {"ahoy!":"寶鐘瑪琳","peko!":"兔田配可拉","A":"噶嗚·古拉"} print(d.get("幹","你好")) #答案:你好 ``` 同樣的方法也運用在宣告得回傳值中 --- ### 在字典中新增新的key值跟value值(原集合名[新增的key值]=新增的value值)(少數) 當今天字典需要增加一些元素時,不需要像其他含式一樣在下面撰寫過多的code,只需要直接在集合後面寫key跟=value就可以了,非常的快速跟簡單。 ```python= movie_1 = {'name': 'Saving Private Ryan','year': 1998,'director': 'Steven Spielberg'} movie_1['star'] = "Tom Hank" print(movie_1) #答案:{'name': 'Saving Private Ryan', 'year': 1998, 'director': 'Steven Spielberg', 'star': 'Tom Hank'} ``` --- ### 在字典中新增新的key值跟value值(多數)(original_dict.update(new_dict) 今天我們需要快速合併兩個字典,我們可以使用update這個函式 ```python= h={"name":"hi","a":"gura","gp":"ame"} g={"polite":"ahoy","評偉":"你在大聲甚麼拉","國棟":"aaaaaaa"} h.update(g)#注意後面有一個點 print(h) #答案:{'name': 'hi', 'a': 'gura', 'gp': 'ame', 'polite': 'ahoy', '評偉': '你在大聲甚麼拉', '國棟': 'aaaaaaa'} ``` 在h.update那一行,誰放在前面,**輸出的時候就會在前面**,print也是印**前面的字典名** --- ### 判斷字典中是否存在某key值(in / not in) 這裡只能判斷KEY值,不能判斷對應值 ```python= d = {"ahoy!":"寶鐘瑪琳","peko!":"兔田配可拉","A":"噶嗚·古拉"} print("peko!" in d) print("Watame" in d) print("寶鐘瑪琳" in d)#(不能判斷對應值,出現false) #output: #True #False #False ``` 尋找是否有key值為寶鐘瑪琳,會發現雖然有對應到的值裡面有寶鐘瑪琳,但是key值中並沒有,因此輸出False --- ### 判斷兩個字典的相同相異(==,!=,is) 再分辨兩個字典的差異時,需要注意,前面兩者(==,!=)是不會在乎順序的,如果**key值跟value值互相對應都是一模一樣**,**但順序不同**,輸出還會是**True** 但第三個函式(is)就會看順序了,兩個字串必須一模一樣才會輸出True,下面演示兩個不同的函示: ```python= d={"carpenter":"wood",'評偉':'你在大聲甚麼拉', '國棟': 'aaaaaaa'} h={'評偉':'你在大聲甚麼拉',"carpenter":"wood", '國棟': 'aaaaaaa'} print(d==h) print(d!=h) #答案: #True #False ``` 上面是== !=的輸出答案 下面給is的輸出答案,但我在輸出的時候發現字典不管怎麼改都是false,只有單個字串("l","p")的時候才會出現true,等我考證。 ```python= d={"carpenter":"wood",'評偉':'你在大聲甚麼拉', '國棟': 'aaaaaaa'} h={'評偉':'你在大聲甚麼拉',"carpenter":"wood", '國棟': 'aaaaaaa'} print(d is h) #答案:False ``` --- ### 刪除字典中元素(del 字典名稱[“key值”]) ```python= d = {"ahoy!":"寶鐘瑪琳","peko!":"兔田配可拉","A":"噶嗚·古拉"} print(d) del d["peko!"]#這裡為中括號 print(d) #output: #{'ahoy!': '寶鐘瑪琳', 'peko!': '兔田配可拉', 'A': '噶嗚·古拉'} #{'ahoy!': '寶鐘瑪琳', 'A': '噶嗚·古拉'} ``` 同樣只能刪除key值,對應值會連同被刪,如果想刪除兩段,需在del d["peko!"]下再增加一段 --- ### 刪除字典中的元素並回傳該key值的value(dict.pop(欲刪除的key值)) 跟上面的函式不太一樣的事,此則函式會回傳我們刪除的值,此種用法可避免我們忘記我們刪除甚麼,非常好用 ```python= g={"polite":"ahoy","評偉":"你在大聲甚麼拉","國棟":"aaaaaaa"} y=g.pop("polite") print(g)#g字典的元素已經被刪掉 print(y)#為y(g集合中被刪掉的value)值 #答案:{'評偉': '你在大聲甚麼拉', '國棟': 'aaaaaaa'} #ahoy ``` --- ### 字典生成式(字典名稱 = 變數 : 變數 for 變數 in 列表) ```python= d = {i:i*i for i in [2,3,4]} print(d) #output: #{2: 4, 3: 9, 4: 16} ``` 從右邊開始看(for i in [2,3,4]),意思是i分別入2,3,4進去,使用迴圈(for i in),就會變成2:2x2 , 3:3x3 , 4:4x4 --- ### 字典生成式(2)(dict[l]=l*2) 此方法也是使用迴圈來建立字典,但比較不一樣的事此則是建立在較複雜的迴圈裡面,較推薦上面的函式,下面是建立的函式: ```python= d = {} for i in range(6): d[i] = i*2#讓電腦輸出i=0,1,2,3,4,5,然後value對應前面六個數字,得出結果 print(d) #答案: #{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10} ``` 可以將上面的答案更詳細化: ```python= for i in d: print("key is",i,"value is ",d[i]) #答案: #{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 5: 10} #key is 0 value is 0 #key is 1 value is 2 #key is 2 value is 4 #key is 3 value is 6 #key is 4 value is 8 #key is 5 value is 10 ``` --- ## 排序(sorted) 有時候我們需要對我們所擁有的資料進行排序,以便後續的查找以及使用。和其他語言可能**需要自己寫一個排序演算法不同**,Python 提供了幾個便捷的函式供大家使用。**list.sort()** 以及 **sorted()**,兩者的差別在於,前者需要額外多一行含式: ```python= l=["apple","ant","banana","zoo","nurse"] l.sort() print(l) #答案: #['ant', 'apple', 'banana', 'nurse', 'zoo'] ``` 至於sorted的部分只需直接印出來就好: ```python= l=["apple","ant","banana","zoo","nurse"] print(sorted(l)) #答案: #['ant', 'apple', 'banana', 'nurse', 'zoo'] ``` 這邊讓我們從 sorted() 的用法開始,官方文件上面的使用方法介紹如下: ```python= sorted(串列名稱, reverse=False, key=rule_fn) ``` sorted() 有三個參數,第一個參數是要排序的串列名稱,要注意的地方是,電腦無法判斷整數與字串之間的優先順序,因此,我們要用來**排序的串列內容**必須都是相**同型態的元素**。 第二個參數則是**是否要反轉 reverse**,預設是 False。簡單來說,假如今天我們要排序的是一個整數串列, **reverse=False** 的意思就是由**小到大排**,反之,當 reverse=**True** 時則代表這個串列要由**大到小排**。 而最後一個參數則是 key ,就是指我們所要用來排序的規則。當串列是一個數字串列時(意即元素型態皆為 int 或是 float 這類的數值型態),預設的規則就是依照**數值大小進行排序**;而當串列的元素都是字串 str 時,預設的規則是**字母順序**,也就是英文字典的排序規則。 需要注意的是,reverse跟key都有**內建的參數**,並且中間都以**逗號間隔**,reverse內建為從小到大,如果有**特別指定再行設定即可**。 --- ### (未)設定的sorted(正序)(sorted(list)) 以下為數字版,未經設定就是由小到大: 注意!!一開始的list為中括號,要sorted的時候要用小括號圈住需要分類的list名 ```python= c=[1,5,3,8,6] c=sorted(c) print(c) #答案: #[1, 3, 5, 6, 8] ``` 由大到小: ```python= d=[1,5,3,8,6] d=sorted(d,reverse=True) print(d) #答案: #[8, 6, 5, 3, 1] ``` 英文版: ```python= s=["zebra","banana","cook","gym"] s=sorted(s,reverse=True) print(s) #答案: #['zebra', 'gym', 'cook', 'banana'] ``` --- ### **字典**的key值排序 字典一樣比較特殊,我們排序該字典的key值,有時候我們會希望**依照特定的順序來取用字典中的內容**,這個就很有幫助。 舉一個字典來說: ```python= c={"2017":"haha","2016":"cacac","2015":"lplp","2014":"gygy"} g=sorted(c)#也可以輸入print(sorted(c.keys())) print(g) #答案: #['2014', '2015', '2016', '2017'] ``` 為甚麼這裡不能輸入c=keys()呢?因為sorted內定是有順序的,我們直接輸入c=keys()的話電腦就會照順序輸出出來,必須注意。 可以看見我們讓它排序key值,value值一樣也可以單獨被輸出,我們利用**迴圈**把key值跟value值一起輸出: ```python= c={"2017":"haha","2016":"cacac","2015":"lplp","2014":"gygy"} for i in sorted(c): print(i,":",c[i])#裡面c[i]為中刮號,同時逗號可換成加號 #答案: #2014 : gygy #2015 : lplp #2016 : cacac #2017 : haha ``` --- ### 字典的value值排序 ```python= c={"2017":"haha","2016":"cacac","2015":"lplp","2014":"gygy"} print(sorted(c.values()))#全部都是小括號,需要注意 #答案: #['cacac', 'gygy', 'haha', 'lplp'] ``` 當你要倒轉時,可以把他們寫在一起節省空間: ```python= c={"2017":"haha","2016":"cacac","2015":"lplp","2014":"gygy"} print(sorted(c.values(),reverse=True)) #答案:['lplp', 'haha', 'gygy', 'cacac'] ``` --- ## sorted的key指令 --- ### 對字典的key值測量長度(key=xxxx) 串列名稱, reverse=False 都已經簡單介紹過了,現在就是重頭戲:key=xxx,舉個簡單的例子: ```python= c={"2017333":"haha","20163":"cacac","201111115":"lplp","20178794":"gygy"} c=sorted(c,key=len) print(c) #答案: #['20163', '2017333', '20178794', '201111115'] ``` key=len的意思是依照c字典裡的key值下去比照長度大小,可以看見大小順序為5、7、8、9位數 我們得到了一個由小到大,依照字串長度進行排序的串列。在 sorted() 函數當中,我們會稱呼 key 後面的函數為 key function ,也就是排序依據的函數。當 sorted() 與 key function 搭配使用, sorted() 將會把所要排序的標的串列當中的元素一個一個丟進 key function 當中,然後得到和串列元素一樣多的回傳值,再根據這些回傳值,對原串列進行排序。 --- ### value的排序,同時輸出對應的key值(x.items(),key=lambda x:x[1]) ```python= c= {"2017": "The Shape of Water", "2016": "Moonlight", "2014": "Birdman", "2015": "Spotlight"} print(sorted(c.items(),key=lambda x:x[1]))#其後的x:x[1]的x可隨意調換 #答案: #[('2014', 'Birdman'), ('2016', 'Moonlight'), ('2015', 'Spotlight'), ('2017', 'The Shape of Water')] ``` --- ### 依照字串長度進行排序(list,key=len) 依照單字的長度進行排列,而不是取首個字母,須注意: ```python= mylist = ["pen", "papper", "pineapple", "applepens", "apple"] print(sorted(mylist, key = len)) #答案: #['pen', 'apple', 'pineapple', 'pineapple', 'applepens'] ``` 上則函式我們可以發現到,pineapple跟applepens是同樣長度,電腦依照我們優先輸入哪一個單字下去做排列,如果我們希望相同長度的字串也要進行排列,我們應該要怎麼做呢? **(跳到宣告欄位,對相同長度的字串以首字母進行排列)**