---
# System prepended metadata

title: 輕鬆學會程式交易 | Chapter 2 | Python 基礎教學

---

[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 # 左邊會顯示"Ｘ"，表示發生錯誤，記得不可以將數字放於開頭
```
### 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']
```