Try   HackMD

輕鬆學會程式交易 | 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裏面會自動變色的,就是保留字。

a = 4 a_1 = 5 5_a = 6 # 左邊會顯示"X",表示發生錯誤,記得不可以將數字放於開頭

2-3-1 int整數(Integer)

顧名思義,就是整數。
print()內建函式,用於印出資料。
type()是內建函式,用來取得變數的型態。

a = 4 print(a) print(type(a)) b = 5 print(a+b) c = a + b print(c) print(type(c))
out: 4
out: int
out: 9
out: 9
out: int

運算子

我們可以用運算子讓變數彼此互動,這裡是常見的數學運算子。

1-4
2-5
2+5
2/4
2*2
3**3

一直以來在用的=也是一種運算子,叫作「設定運算子」,功能是把右邊的變數指派給左邊。

a = b
a = a + 1

2-3-2 float浮點數

浮點數是電腦儲存、計算小數的一種方法。

宣告

a = 0.13 print(type(a))
out: float

浮點數的誤差

a = 0.1 print(a*3 == 0.3) # 這裡的==馬上就會提到
out: False

布林邏輯、條件語句

布林邏輯是電腦科學裡一個重要的代數系統。
在python中,我們用True以及False來表達邏輯真假。
使用條件語句>, <, ==, >=, <=, !=, not來生成。

a = 5 print(a>1) print(a<2) print(a>5) print(a==5) # 使用 == 來表示邏輯等於, # 單一的 = 是設定、指派(assignment)。 # ex:“指派”你為小老師
out: True
out: False
out: False
out: True
# 你也可以計算的數值放進變數裡 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)
out: False
out: True
out: False
out: False

2-3-3 自動宣告變數型態

python會自動辨識變數,以將其用最好的型態儲存。

a = 0.1 b = 3 print('a:', type(a)) print('b:', type(b)) c = a + b print('c:', type(c), c)
out: a: <class 'float'>
out: b: <class 'int'>
out: c: <class 'float'>

2-3-4 cast 轉型

如果想要把一個變數轉成另一個資料型態,可以使用轉型。這些能把變數轉換成其他資料型態。

a = 123.5 a = int(a) print(a) #會做無條件捨去 b = 4 b = float(4) print(b)
out: 123
out: 4.0

除了0以外,所有的數字,都是邏輯真

bool(0) # False
bool(1) # True
bool(0.1) # True

2-4 python基礎語法(中)- 序列與字典

除了一個一個的數字,我們需要更有效率的作法來存取一整筆的資料,這時候python的序列就派上用場了。

2-4-1 列表 list

宣告

列表使用中括號來宣告,裏面每個欄位都可以放上不同資料型態的變數,甚至可以把列表放在列表裡。

a = [123, 5, 3.3, 6, 22] b = ['b', 13, '台積電', a]

空列表

在這次的作業會用到。

empty = [] print(empty)
out: []

長度

可以顯示資料長度的方法

len(a) len(b)
out: 5
out: 4

索引

列表的索引是從0開始,所以如果你未來會很常聽到第0項這個說法,這需要一些時間來習慣。
你可以隨時改變列表裡的值。負號代表倒數第n個元素。

print(a[0]) print(a[-1])
out: 123
out: 22
print(b[-1][0])
out: 123

slice分割

可以使用冒號來連續取得列表中的元素。

print(a[1:4])
out : [5, 3.3, 6]

重複列表

如果把一個列表乘以二,代表重複兩次。

print(a*3)
out: [123, 5, 3.3, 6, 22,123, 5, 3.3, 6, 22,123, 5, 3.3, 6, 22]

改變元素

a[2] = 10 print(a)
out: [123, 5, 10, 6, 22]

長度

可以使用len()函式來取的列表的長度,也就是元素的數量。
要注意一個長度為n的列表,最後一項其實是第(n-1)項。

print(len(a))
out : [123, 5, 10, 6, 22]

append

使用append函式

print(a) a.append(-1) print(a) a.append([-1])
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

宣告

元祖跟列表很像,唯一的差別是他無法改變。不管是長度或是裡面的元素。
使用括號來宣告。

c = (123, 13, 5) d = (22,) # 單一元素要加豆號 print(type(c))
out : tuple
c[0] = 123 # 產生error

但是如果元祖裏面有一個列表,改動那個列表的元素是合法的。

c = (123,3,67,22,a) print(c) c[-1][2] = 1000000000 print(c)

2-4-3 字串 string

字串用來儲存一連串的文字,用單雙括號來宣告。
因為字串也是序列的一種,所以也可以索引。
字串的元素也是不可變的。

a = '我愛台積電' print(a) print(a[0]) a[0] = '不愛' #Error
out: '我愛台積電'
out: '我'

連接

字串可以用+來連接。

a = '我愛台積電' b = '2330' c = a + b print(c)
out : '我愛台積電2330'

2-4-4 字典 dictionary

字典是一個映射。他將鍵值(key)應射到另外一塊記憶體位置來儲存資料。

宣告、索引

使用{key1:value1, key2:value2}來做宣告。
可以隨時新增鍵值,只要直接指派就可以了。
使用鍵值索引

symbol = {"台積電": '2330'} print(symbol['台積電']) print(symbol['台達電']) # 不存在的key會出錯 symbol['台泥'] = '1101' # 這裡新增了一個新的key print(symbol['台泥'])
out: '2330'
out: KeyError
out: '1101'

keys 鍵

可以使用keys()方法來知道有哪些鍵值。
也可以使用in來確認一個key是否存在

# continuous print(symbol.keys()) print('台達電' in symbol.keys()) print('台積電' in symbol.keys())
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條件式會在「條件滿足」的情況下,執行內部區塊。否則跳過。

a = 15 if a > 10: print('大於10') print('在if的外面囉')
'大於10'
'在if的外面囉'
a = 13 if a > 15: print('>15') else: print('小於或等於15') print('在if的外面囉')
'小於或等於15'
'在if的外面囉'
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.')
'a is between 10 and 15.'
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.')
out: 

2-5-2 while迴圈

While迴圈會在「條件滿足」的情況下,重複執行內部區塊。

a = 0 while a <= 3: print(a) a = a + 1 print('while外面囉')
0
1
2
3
'while外面囉'
while True: #執行這些東西 print('我要一直印下去囉') print('while外面囉')
'我要一直印下去囉'
'我要一直印下去囉'
'我要一直印下去囉'
...

強制中斷執行

鍵盤壓住 crtl + c

常見的控制法

  1. 無窮迴圈
while True: print('我要一直印下去囉')
  1. 使用counter
counter = 0 while counter <= 5: print(counter) counter = counter + 1
0
1
2
3
4
5
  1. 第2種counter的用法
counter = 0 while True: print(counter) if counter == 5: break counter += 1
0
1
2
3
4

比較看看,上下兩者會有什麼差別?

counter = 0 while True: print(counter) counter += 1 if counter == 5: break

2-5-3 for迴圈

for迴圈是程式語言中更常出現的種類,我個人喜歡把他想像成遍歷,按照順序一個一個的造訪。
執行以下程式碼,可以很快的理解他。

a = ['台積電', '台達電', '聯電, '台泥'] # 對於每個 Names 裡面的元素,將他們各自暫時命名為i for i in a: print(i)
'台積電'
'台達電'
'聯電'
'台泥'

range

range是python的內建函式,搭配for迴圈來生成連續的數字,常用的方法有三種。

  1. 設定上界:
for i in range(10): print(i)
  1. 設定下界以及上界:
for i in range(5,10): print(i)
  1. 設定下界、上界以及步長:
for i in range(5, 15, 2): print(i)

二層for

for i in range(5): for j in range(3): print('i:', i, ', j:',j) print('----我是分隔線----')
'i:, 0,    j:0'
'i:, 0,    j:1'
'----我是分隔線----'
...
'i:, 4,    j:1'
'i:, 4,    j:2'
'----我是分隔線----'

2-6 函式與模組

函式

程式語言中,函式就像是一個「功能」,print()函式是列印的功能,int()函式是把變數轉換為整數的功能,type()函式是取得變數型態的功能。

除了這些內建的函式,你也可以自己定義函式。

定義

使用def來定義函式

# def 是define的縮寫 def square(x): result = x * x return result def show(x): print('value: ', x, ',type: ', type(x))

小括號裡的x叫作引數,是函式為了達到功能必須要用的資料,就像我今天希望有個函式可以幫我把數字平方,我就必須告訴這個函式這個數字是什麼。

函式可以return(回傳)資料,也可以不。

呼叫

再我們定義完函式之後,就可以呼叫它了。

a = 4 a = square(a) print(a)
out: 16

在呼叫函式的時候,我們把眼光轉移到函數的定義,我們將a作為square函式的第一個引數x傳入,這時候這個x就會是我們傳入的a,也就是4,接下來回傳一個16並結束函式。
回到呼叫的那一行,b會被設定為square函數的回傳值。也就是16。

透過函式,我們可以很有效率的重複使用同一段的程式碼,並且讓程式更可讀。

不要重複造輪子
作業很明顯跟同學一模一樣的學生

下課來找我
助教

模組

如果我們寫程式時,必須將所有內容寫在同一個檔案裡,那麼程式就會又臭又長,既不美觀又難整理。這時候我們就會把程式碼按照功能分開為各個模組,需要時再從其他檔案引入就好了。

模組內可以有函式,變數。

python有很多內建的模組,這裡舉幾個例子。

import math a = math.sqrt(16) #square root的縮寫 print(a) print(math.pi)
out: 4.0
out: 3.141592653589793
import time print('time to sleep.....') time.sleep(3) print('wake up!!!') from os import listdir print(listdir())

我們這邊先不學怎麼建立模組,會再之後的課程提到。

2-7 第一次作業

作業1

做出一個函式,叫作duplicate(),
功能是輸入a, b兩個列表,他要輸出一個包含重複元素的列表。

a = [1, 2, 3, 5, 8, 13]
b = [1, 3, 6, 8]
print(duplicate(a, b))
# 應該要印出[1, 3, 8]

作業2

將下列日期按照[[YYYY/MM/DD],...]格式重新整理

dates = [['2019', '11', 12], 
         ['2019', '11', 13]]
# 提示1:使用str()來把整數轉成字串
# 提示2:建立空字串,一次一次把新的日期append進去

Answer:

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']