python是近年來快速崛起的語言
python是個直譯式的語言,你可以把他想像成一行一行的命令,程式語言中我們習慣叫他腳本,寫一行,電腦執行一行。
他是一個高階語言。這邊的高階不是一般意義上的高等低等。而是再電腦科學中,我們會把電腦語言分成多個層級。簡單來說,底層接近機器語言,效率高同時難懂。上層接近自然語言,人類易懂易學。
為python的擴展性極好,世界上許多人在使用python的同時也再開發其功能,為python開發了大量的工具,又或者是將其他語言的函式庫移植至python。
- 數據分析工具: Pandas
- HTTP工具: Requests
- 基於matlab的繪圖工具: Matplotlib
- 科學計算工具: scipy, numpy
- 深度學習工具: Tensorflow
anaconda 連結:https://www.anaconda.com/products/individual
windows用戶請注意電腦位元數
首先第一個動作,我們試著在python中宣告變數。
宣告變數,
什麼是變數?變數就是你的資料在程式語言中存在的形式。它們有不同的形式,分別滿足不同的需求,像是「整數」、「小數」、「列表」……等,我會陸陸續續的介紹。
而宣告變數,指的就是我告訴電腦「我需要一塊儲存空間,用來紀錄我要寫入的這個變數」。
變數需要有一個名稱,基本上除了python的保留字以外都是可以取的名字,不過方便起見我們常用英文加上底線來取名,像是counter, length_of_list, graduate_year…
怎麼知道是不是保留字?
只要打在spyder裏面會自動變色的,就是保留字。
a = 4
a_1 = 5
5_a = 6 # 左邊會顯示"X",表示發生錯誤,記得不可以將數字放於開頭
顧名思義,就是整數。
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
浮點數是電腦儲存、計算小數的一種方法。
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
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'>
如果想要把一個變數轉成另一個資料型態,可以使用轉型。這些能把變數轉換成其他資料型態。
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
除了一個一個的數字,我們需要更有效率的作法來存取一整筆的資料,這時候python的序列就派上用場了。
列表使用中括號來宣告,裏面每個欄位都可以放上不同資料型態的變數,甚至可以把列表放在列表裡。
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
可以使用冒號來連續取得列表中的元素。
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函式
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]]
元祖跟列表很像,唯一的差別是他無法改變。不管是長度或是裡面的元素。
使用括號來宣告。
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)
字串用來儲存一連串的文字,用單雙括號來宣告。
因為字串也是序列的一種,所以也可以索引。
字串的元素也是不可變的。
a = '我愛台積電'
print(a)
print(a[0])
a[0] = '不愛' #Error
out: '我愛台積電'
out: '我'
字串可以用+
來連接。
a = '我愛台積電'
b = '2330'
c = a + b
print(c)
out : '我愛台積電2330'
字典是一個映射。他將鍵值(key)應射到另外一塊記憶體位置來儲存資料。
使用{key1:value1, key2:value2}
來做宣告。
可以隨時新增鍵值,只要直接指派就可以了。
使用鍵值索引
symbol = {"台積電": '2330'}
print(symbol['台積電'])
print(symbol['台達電']) # 不存在的key會出錯
symbol['台泥'] = '1101' # 這裡新增了一個新的key
print(symbol['台泥'])
out: '2330'
out: KeyError
out: '1101'
可以使用keys()方法來知道有哪些鍵值。
也可以使用in
來確認一個key是否存在
# continuous
print(symbol.keys())
print('台達電' in symbol.keys())
print('台積電' in symbol.keys())
out: dict_key(['台積電', '台泥'])
out: False
out: True
程式就像腳本一樣,是由上而下逐行執行的。
但是如果只是這樣的話,那麼在實務上會很難應用他。所以有所謂的流程控制。
使用一些條件(statement)去做判斷,使得程式分支來應對所有狀況。
這些陳述句有「if else」、「while loop」、「for loop」。
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:
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
while True:
print('我要一直印下去囉')
counter = 0
while counter <= 5:
print(counter)
counter = counter + 1
0
1
2
3
4
5
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
for迴圈是程式語言中更常出現的種類,我個人喜歡把他想像成遍歷,按照順序一個一個的造訪。
執行以下程式碼,可以很快的理解他。
a = ['台積電', '台達電', '聯電, '台泥']
# 對於每個 Names 裡面的元素,將他們各自暫時命名為i
for i in a:
print(i)
'台積電'
'台達電'
'聯電'
'台泥'
range是python的內建函式,搭配for迴圈來生成連續的數字,常用的方法有三種。
for i in range(10):
print(i)
for i in range(5,10):
print(i)
for i in range(5, 15, 2):
print(i)
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'
'----我是分隔線----'
程式語言中,函式就像是一個「功能」,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())
我們這邊先不學怎麼建立模組,會再之後的課程提到。
做出一個函式,叫作duplicate(),
功能是輸入a, b
兩個列表,他要輸出一個包含重複元素的列表。
a = [1, 2, 3, 5, 8, 13]
b = [1, 3, 6, 8]
print(duplicate(a, b))
# 應該要印出[1, 3, 8]
將下列日期按照[[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']