---
# System prepended metadata

title: python

---

# 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是同樣長度，電腦依照我們優先輸入哪一個單字下去做排列，如果我們希望相同長度的字串也要進行排列，我們應該要怎麼做呢?
**(跳到宣告欄位，對相同長度的字串以首字母進行排列)**
