[TOC] # 輕鬆學會程式交易 | Chapter 2 | Python 基礎教學 ## 2-1 python的特色是什麼 python是近年來快速崛起的語言 ### 直譯式語言: python是個直譯式的語言,你可以把他想像成**一行一行的命令**,程式語言中我們習慣叫他腳本,寫一行,電腦執行一行。 ### 高階程式語言: 他是一個高階語言。這邊的高階不是一般意義上的高等低等。而是再電腦科學中,我們會把電腦語言分成多個層級。簡單來說,底層接近機器語言,效率高同時難懂。上層接近自然語言,人類易懂易學。 ### 工具取之無盡: 為python的擴展性極好,世界上許多人在使用python的同時也再開發其功能,為python開發了大量的工具,又或者是將其他語言的函式庫移植至python。 - 數據分析工具: Pandas - HTTP工具: Requests - 基於matlab的繪圖工具: Matplotlib - 科學計算工具: scipy, numpy - 深度學習工具: Tensorflow ## 2-2 安裝 anaconda 連結:https://www.anaconda.com/products/individual windows用戶請注意電腦位元數 ## 2-3 Python基礎語法(上)- 數字 首先第一個動作,我們試著在python中宣告變數。 **宣告變數**, 什麼是變數?變數就是你的資料在程式語言中存在的形式。它們有不同的形式,分別滿足不同的需求,像是「整數」、「小數」、「列表」……等,我會陸陸續續的介紹。 而**宣告**變數,指的就是我告訴電腦「我需要一塊儲存空間,用來紀錄我要寫入的這個變數」。 ### 變數名稱 變數需要有一個名稱,基本上除了python的保留字以外都是可以取的名字,不過方便起見我們常用英文加上底線來取名,像是counter, length_of_list, graduate_year...... 怎麼知道是不是保留字? **只要打在spyder裏面會自動變色的,就是保留字。** ```python= a = 4 a_1 = 5 5_a = 6 # 左邊會顯示"X",表示發生錯誤,記得不可以將數字放於開頭 ``` ### 2-3-1 int整數(Integer) 顧名思義,就是整數。 `print()`內建函式,用於印出資料。 `type()`是內建函式,用來取得變數的型態。 ```python= a = 4 print(a) print(type(a)) b = 5 print(a+b) c = a + b print(c) print(type(c)) ``` ```python out: 4 out: int out: 9 out: 9 out: int ``` #### 運算子 我們可以用運算子讓變數彼此互動,這裡是常見的數學運算子。 ```python 1-4 2-5 2+5 2/4 2*2 3**3 ``` 一直以來在用的`=`也是一種運算子,叫作「設定運算子」,功能是把右邊的變數指派給左邊。 ```python a = b a = a + 1 ``` ### 2-3-2 float浮點數 浮點數是電腦儲存、計算小數的一種方法。 #### 宣告 ```python= a = 0.13 print(type(a)) ``` ```python out: float ``` #### 浮點數的誤差 ```python=+ a = 0.1 print(a*3 == 0.3) # 這裡的==馬上就會提到 ``` ```python out: False ``` ### 布林邏輯、條件語句 布林邏輯是電腦科學裡一個重要的代數系統。 在python中,我們用`True`以及`False`來表達邏輯真假。 使用條件語句`>, <, ==, >=, <=, !=, not`來生成。 ```python=+ a = 5 print(a>1) print(a<2) print(a>5) print(a==5) # 使用 == 來表示邏輯等於, # 單一的 = 是設定、指派(assignment)。 # ex:“指派”你為小老師 ``` ```python out: True out: False out: False out: True ``` ```python=+ # 你也可以計算的數值放進變數裡 b = a<10 print(not True) print(not False) print(not not not not not not not not not not not not not not not not not True) ``` ```python out: False out: True out: False out: False ``` ### 2-3-3 自動宣告變數型態 python會自動辨識變數,以將其用最好的型態儲存。 ```python= a = 0.1 b = 3 print('a:', type(a)) print('b:', type(b)) c = a + b print('c:', type(c), c) ``` ```python out: a: <class 'float'> out: b: <class 'int'> out: c: <class 'float'> ``` ### 2-3-4 cast 轉型 如果想要把一個變數轉成另一個資料型態,可以使用轉型。這些能把變數轉換成其他資料型態。 ```python= a = 123.5 a = int(a) print(a) #會做無條件捨去 b = 4 b = float(4) print(b) ``` ```python out: 123 out: 4.0 ``` 除了0以外,所有的數字,都是邏輯真 ```python bool(0) # False bool(1) # True bool(0.1) # True ``` ## 2-4 python基礎語法(中)- 序列與字典 除了一個一個的數字,我們需要更有效率的作法來存取一整筆的資料,這時候python的序列就派上用場了。 ### 2-4-1 列表 list #### 宣告 列表使用中括號來宣告,裏面每個欄位都可以放上不同資料型態的變數,甚至可以把列表放在列表裡。 ```python= a = [123, 5, 3.3, 6, 22] b = ['b', 13, '台積電', a] ``` #### 空列表 在這次的作業會用到。 ```python=+ empty = [] print(empty) ``` ```python out: [] ``` #### 長度 可以顯示資料長度的方法 ```python=+ len(a) len(b) ``` ```python out: 5 out: 4 ``` #### 索引 列表的索引是從0開始,所以如果你未來會很常聽到第0項這個說法,這需要一些時間來習慣。 你可以隨時改變列表裡的值。負號代表倒數第n個元素。 ```python=+ print(a[0]) print(a[-1]) ``` ```python out: 123 out: 22 ``` ```python=+ print(b[-1][0]) ``` ```python out: 123 ``` #### slice分割 可以使用冒號來連續取得列表中的元素。 ```python=+ print(a[1:4]) ``` ```python out : [5, 3.3, 6] ``` #### 重複列表 如果把一個列表乘以二,代表重複兩次。 ```python=+ print(a*3) ``` ```python out: [123, 5, 3.3, 6, 22,123, 5, 3.3, 6, 22,123, 5, 3.3, 6, 22] ``` #### 改變元素 ```python=+ a[2] = 10 print(a) ``` ```python out: [123, 5, 10, 6, 22] ``` #### 長度 可以使用`len()`函式來取的列表的長度,也就是元素的數量。 要注意一個長度為`n`的列表,最後一項其實是第`(n-1)`項。 ```python=+ print(len(a)) ``` ```python out : [123, 5, 10, 6, 22] ``` #### append 使用append函式 ```python=+ print(a) a.append(-1) print(a) a.append([-1]) ``` ```python out : [123, 5, 10, 6, 22] out : [123, 5, 10, 6, 22, -1] out : [123, 5, 10, 6, 22, -1,[-1]] ``` ### 2-4-2 元祖 tuple #### 宣告 元祖跟列表很像,唯一的差別是他無法改變。不管是長度或是裡面的元素。 使用括號來宣告。 ```python= c = (123, 13, 5) d = (22,) # 單一元素要加豆號 print(type(c)) ``` ```python out : tuple ``` ```python=+ c[0] = 123 # 產生error ``` 但是如果元祖裏面有一個列表,改動那個列表的元素是合法的。 ```python=+ c = (123,3,67,22,a) print(c) c[-1][2] = 1000000000 print(c) ``` ### 2-4-3 字串 string 字串用來儲存一連串的文字,用單雙括號來宣告。 因為字串也是序列的一種,所以也可以索引。 字串的元素也是不可變的。 ```python= a = '我愛台積電' print(a) print(a[0]) a[0] = '不愛' #Error ``` ```python out: '我愛台積電' out: '我' ``` #### 連接 字串可以用`+`來連接。 ```python=+ a = '我愛台積電' b = '2330' c = a + b print(c) ``` ```python out : '我愛台積電2330' ``` ### 2-4-4 字典 dictionary 字典是一個映射。他將鍵值(key)應射到另外一塊記憶體位置來儲存資料。 #### 宣告、索引 使用`{key1:value1, key2:value2}`來做宣告。 可以隨時新增鍵值,只要直接指派就可以了。 使用鍵值索引 ```python= symbol = {"台積電": '2330'} print(symbol['台積電']) print(symbol['台達電']) # 不存在的key會出錯 symbol['台泥'] = '1101' # 這裡新增了一個新的key print(symbol['台泥']) ``` ```python out: '2330' out: KeyError out: '1101' ``` #### keys 鍵 可以使用keys()方法來知道有哪些鍵值。 也可以使用`in`來確認一個key是否存在 ```python=+ # continuous print(symbol.keys()) print('台達電' in symbol.keys()) print('台積電' in symbol.keys()) ``` ```python=+ out: dict_key(['台積電', '台泥']) out: False out: True ``` ## 2-5 python基礎語法(下)- 流程控制 程式就像腳本一樣,是由上而下逐行執行的。 但是如果只是這樣的話,那麼在實務上會很難應用他。所以有所謂的流程控制。 使用一些條件(statement)去做判斷,使得程式分支來應對所有狀況。 這些陳述句有「if else」、「while loop」、「for loop」。 ### 2-5-1 if elif else statement if條件式會在「條件滿足」的情況下,執行內部區塊。否則跳過。 ```python= a = 15 if a > 10: print('大於10') print('在if的外面囉') ``` ```python '大於10' '在if的外面囉' ``` ```python=+ a = 13 if a > 15: print('>15') else: print('小於或等於15') print('在if的外面囉') ``` ```python '小於或等於15' '在if的外面囉' ``` ```python=+ a = 13 if a > 20: print('a is larger than 20.') elif a > 15: print('a is between 15 and 20.') elif a > 10: print('a is between 10 and 15.') else: print('a is less than or equal to 10.') ``` ```python 'a is between 10 and 15.' ``` ```python=+ a = 9 if a > 20: print('a is larger than 20.') elif a > 15: print('a is between 15 and 20.') elif a > 10: print('a is between 10 and 15.') ``` ```python out: ``` ### 2-5-2 while迴圈 While迴圈會在「條件滿足」的情況下,重複執行內部區塊。 ```python= a = 0 while a <= 3: print(a) a = a + 1 print('while外面囉') ``` ```python 0 1 2 3 'while外面囉' ``` ```python=+ while True: #執行這些東西 print('我要一直印下去囉') print('while外面囉') ``` ```python '我要一直印下去囉' '我要一直印下去囉' '我要一直印下去囉' ... ``` #### 強制中斷執行 鍵盤壓住 `crtl` + `c` #### 常見的控制法 0. 無窮迴圈 ```python= while True: print('我要一直印下去囉') ``` 1. 使用counter ```python= counter = 0 while counter <= 5: print(counter) counter = counter + 1 ``` ```python 0 1 2 3 4 5 ``` 2. 第2種counter的用法 ```python=+ counter = 0 while True: print(counter) if counter == 5: break counter += 1 ``` ```python 0 1 2 3 4 ``` 比較看看,上下兩者會有什麼差別? ```python=+ counter = 0 while True: print(counter) counter += 1 if counter == 5: break ``` ### 2-5-3 for迴圈 for迴圈是程式語言中更常出現的種類,我個人喜歡把他想像成遍歷,按照順序一個一個的造訪。 執行以下程式碼,可以很快的理解他。 ```python= a = ['台積電', '台達電', '聯電, '台泥'] # 對於每個 Names 裡面的元素,將他們各自暫時命名為i for i in a: print(i) ``` ```python '台積電' '台達電' '聯電' '台泥' ``` #### range range是python的內建函式,搭配for迴圈來生成連續的數字,常用的方法有三種。 1. 設定上界: ```python= for i in range(10): print(i) ``` 2. 設定下界以及上界: ```python=+ for i in range(5,10): print(i) ``` 3. 設定下界、上界以及步長: ```python=+ for i in range(5, 15, 2): print(i) ``` #### 二層for ```python=+ for i in range(5): for j in range(3): print('i:', i, ', j:',j) print('----我是分隔線----') ``` ```pyhton 'i:, 0, j:0' 'i:, 0, j:1' '----我是分隔線----' ... 'i:, 4, j:1' 'i:, 4, j:2' '----我是分隔線----' ``` ## 2-6 函式與模組 ### 函式 程式語言中,函式就像是一個「功能」,`print()`函式是列印的功能,`int()`函式是把變數轉換為整數的功能,`type()`函式是取得變數型態的功能。 除了這些內建的函式,你也可以自己定義函式。 #### 定義 使用`def`來定義函式 ```python= # def 是define的縮寫 def square(x): result = x * x return result def show(x): print('value: ', x, ',type: ', type(x)) ``` 小括號裡的`x`叫作引數,是函式為了達到功能必須要用的資料,就像我今天希望有個函式可以幫我把數字平方,我就必須告訴這個函式這個數字是什麼。 函式可以return(回傳)資料,也可以不。 #### 呼叫 再我們定義完函式之後,就可以呼叫它了。 ```python=+ a = 4 a = square(a) print(a) ``` ```python out: 16 ``` 在呼叫函式的時候,我們把眼光轉移到函數的定義,我們將a作為square函式的第一個引數`x`傳入,這時候這個`x`就會是我們傳入的`a`,也就是`4`,接下來回傳一個16並結束函式。 回到呼叫的那一行,b會被設定為square函數的回傳值。也就是16。 透過函式,我們可以很有效率的重複使用同一段的程式碼,並且讓程式更可讀。 >不要重複造輪子 >[name=作業很明顯跟同學一模一樣的學生][color=#80ffa0] >> 下課來找我 >> [name=助教][color=#ff0000] ### 模組 如果我們寫程式時,必須將所有內容寫在同一個檔案裡,那麼程式就會又臭又長,既不美觀又難整理。這時候我們就會把程式碼按照功能分開為各個模組,需要時再從其他檔案引入就好了。 模組內可以有函式,變數。 python有很多內建的模組,這裡舉幾個例子。 ```python= import math a = math.sqrt(16) #square root的縮寫 print(a) print(math.pi) ``` ```python out: 4.0 out: 3.141592653589793 ``` ```python=+ import time print('time to sleep.....') time.sleep(3) print('wake up!!!') from os import listdir print(listdir()) ``` 我們這邊先不學怎麼建立模組,會再之後的課程提到。 ## 2-7 第一次作業 ### 作業1 做出一個函式,叫作duplicate(), 功能是輸入`a, b`兩個列表,他要輸出一個包含重複元素的列表。 ```python a = [1, 2, 3, 5, 8, 13] b = [1, 3, 6, 8] print(duplicate(a, b)) # 應該要印出[1, 3, 8] ``` ### 作業2 將下列日期按照`[[YYYY/MM/DD],...]`格式重新整理 ```python dates = [['2019', '11', 12], ['2019', '11', 13]] # 提示1:使用str()來把整數轉成字串 # 提示2:建立空字串,一次一次把新的日期append進去 ``` Answer: ```python= new_dates = [] for date in dates: string_date = (date[0] + '/' + date[1] + '/' + str(date[2])) new_dates.append(string_date) ['2019/11/12', '2019/11/13'] ```