Professional Documents
Culture Documents
郭忠義
jykuo@ntut.edu.tw
臺北科技大學資訊工程系
1. Python
特性
容易撰寫,適合初學者
功能強大
跨平台
容易擴充
功能
資料分析
科學計算
機器學習
網頁設計
2
基本語法規則
不須任何結尾符號(;)
不須先指定/宣告變數資料型態,就可直接給值
變數可任意轉換型態
透過=,+=,‐=直接賦值,也可同時給多個變數賦值
單行註解為#,多行註解用"""開頭與結尾。
每個控制流程結尾用冒號:
屬該流程下的執行動作使用縮排 (不須任何括號)
縮排使用四格Space
3
基本資料型態
整數(int)
浮點數(float):有小數點的數字
字串(String):一串文字內容
串列(List):又稱可變列表,一種有順序、可變動資料集合
Tuple:又稱固定列表,一種有順序、不可變動的資料集合
集合(Set):無順序的資料集合
字典(dictionary):以Key-Value Pair形式存入集合
布林(Boolean):表達True(正確、真)與False(錯誤、假)
4
變數
可自訂名稱、可改變數值,參考到電腦記憶體值
用 = 指派一個值給變數,之後可使用。
a = b = c =1
多變數一次指派:x, y = a, b
其他程式語言:x = a; y = b;
變數內容對調:x, y = y, x
其他程式語言:t = x; x = y; y = t;
+=, -=, *=, /=
a+=b a = a+b
5
變數
變數命名規則
允許a-z A-z 0-9 和 _ , 但是開頭必須是 [_a-zA-Z] 其中一個
變數區分大小寫
變數長度沒有限制
6
資料型態-數字
支援整數(5或100000000等整數)與浮點數(例如 3.1416、
14.99),可透過以下數學運算子進行
+
-
*
/
** 次方
// 整除
% 餘數
資料型態-字串
字串資料可以是以單引號(')或雙引號(")包起來的文字
資料 ,相對於數值資料,字串就是用來表示文字的資料。
字串資料也可以存於變數
"\" 可轉字串中的某些字元含義,最常見的轉義如: \n \t
如果在字串資料中遇到單引號時,也必須以 \ 來處理,避
免被誤認為字串結束。
資料型態-字串操作
使用+運算子結合字串
Slice擷取字串
使用*複製字串
使用[]擷取字元
資料型態-字串內建函式
len()取得長度 replace()替換 '123'無法做數字運算,須轉為整數型態
split()切割字串
使用者輸入
input('提示字')
以字串型態從鍵盤輸入資料
在等待輸入時,顯示提示字
11
Function
定義function用def開頭,以冒號:結尾,還有縮排。
無參數、無回傳值 def myFunction():
無參數、有回傳值 print("Hello~")
有參數、無回傳值
def main():
有參數、有回傳值 myFunction()
myFunction()
main()
def my_function(x,y):
return x-10,y+10 Output:
x, y = my_function(10,20) 0 30
print (x, y)
12
print
%d 以10 進位整數方式輸出
%f 將浮點 數以10進位方式輸出
%e, %E將浮點數以10進位輸出,使用科學記號
%o 以8進 位整數方式輸出
%x, %X 將整 數以16進位方式輸出
%s 使用str()將字串輸出
>>> text = '%d %.2f %s' % (1, 99.3, 'Justin')
%c 以字元 方式輸出
>>> print(text)
%r 使用repr()輸 出字串 1 99.30 Justin
>>> print('%d %.2f %s' % (1, 99.3, 'Justin'))
%%在字串 中顯示% 1 99.30 Justin
>>> 'example:%.2f' % 19.234
'example:19.23'
>>> "example:%6.2f" % 19.234
'example: 19.23'
13
format
> '{0} is {1}!!'.format('Justin', 'caterpillar')
'Justin is caterpillar!!'
'Justin is caterpillar!!'
'Justin is caterpillar!!'
'Justin is caterpillar!!'
14
format
>>> import math
>>> 'PI = {0.pi}'.format(math)
'PI = 3.14159265359'
>>> import sys
>>> 'My platform is {pc.platform}'.format(pc = sys)
'My platform is win32'
>>> 'My platform is {0.platform}. PI = {1.pi}.'.format(sys, math)
'My platform is win32. PI = 3.14159265359.'
>>> 'element of index 1 is {0[1]}'.format([20, 10, 5])
'element of index 1 is 10'
>>> 'My name is {person[name]}'.format(person = {'name' : 'Justin', 'age' : 35})
'My name is Justin'
15
Unit Test
一個程式怎樣才算完成,怎麼證明這個程式沒有問題,應
有測試程式與 test case驗證,程式在這些test case是沒有問
題的。
單元測試(Unit Testing)希望每一個測試的method,用簡
單明確的方法,驗證某項功能在某個test case,程式如預期
一般運作。
16
Unit Test
17
Unit Test
18
if
if <condition>:if 後跟隨一個「條件」
(Condition),結尾需冒號 (if 是複合指令)
statements1:是 if 的本體區塊 (Body block),
需縮排一層,如果「條件」判斷真就執行
此區的指令
else:結尾需冒號 (else 是複合指令)
statements2:是 else的本體區塊,需縮排
一層,如果「條件」判斷為假就執行此區
裡的指令
19
if
關係比較:a < x < b,例如:
if10 < x < 20:
print(x, '在 10~20 範圍內')
if else 縮寫
maxValue = x if x>y else y
20
if
比較運算 語法 def myFunction():
print("Hello~")
相等 A==B score = int(input('輸入分數:'))
不等於 A!=B if score>=60:
print('恭喜你及格')
大於 A>B else:
小於 A<B print('不及格,要加油')
21
if, elif, else
def myFunction():
print('哈囉,python')
score = int(input('輸入分數:'))
if score>=90:
print('得 A')
elif score>=80 and score <90:
print('得 B')
elif score>=70 and score <80:
print('得 C')
elif score>=60 and score <70:
print('得 D')
else:
print('不及格')
def main(): 這個程式邏輯是否有問題?
myFunction()
myFunction()
myFunction()
main()
22
for
每次從串列 (List) 裡取出一個項目 (Item),將其指派給迴圈
變數後執行本體指令
適用於已知迴圈圈數
23
for
迴圈用函式range,範圍是左邊數字到右邊數字-1。
in 指令判斷某個型別中是否有某個元素。
def myPrint():
for i in range(0, 10, 1):
print(i)
def printGold(num):
for x in range(1, num+1):
for y in range(num, x, -1):
print(' ',end='')
for y in range(0, 2*x-1, 1):
print('*',end='')
print()
def main():
myPrint()
num = int(input("Input a number:"))
printGold(num)
main()
24
for
Range()函式回傳指定範圍內的一串數字。
使用方法 範例 執行結果
return sum
def main():
min = int(input("Input a min number:"))
max = int(input("Input a max number:"))
main_sum = mySum(min, max)
print('sum (%d ~ %d)= %d' %(min, max, main_sum))
main()
26
while
每次判斷條件,如果為真,就繼續執行本體指令,否則結
束迴圈
適用於迴圈圈數未知
27
while
def myPrint():
i = 0;
while (i<10):
print(i)
i = i+1
def mySum(min, max):
i = min
sum = 0
while (i <= max):
sum = sum + i
i=i+1
print(sum)
return sum
def main():
myPrint()
min = int(input("Input a min number:"))
max = int(input("Input a max number:"))
main_sum = mySum(min, max)
print('sum (%d ~ %d)= %d' %(min, max, main_sum))
main()
28
import
用import直接匯入整個python函式庫中所有函式,或用from
函式庫import函式,插入特定函式
#匯入sys函式庫所有函式,使用write函式前須加sys
import sys
#從time函式庫匯入time()函式,使用time()前不需加 time
from time import time
sys.stdout.write(str(time())+"\n")
Output:
1409796132.99 #當下的time
29
import
猜數字,隨機產生一個介於1~10的答案,使用者猜中則停
止輸入,根據使用者輸入提示以下訊息:
1.猜太大
2.猜太小
3.猜中了
import random
def myFunction():
ans = random.randint(1,10)
while True:
inputData = int(input("Guess 1~10: "))
if (inputData == ans):
print("Right")
break
def main():
myFunction()
30
list 基本操作
List定義使用"中括號",內不限定放數字文字
my_list = [1,2,3,4,5,e,w,f]
List有順序
print(my_list[0]) # 0為位置,第一項
print(my_list[-1]) # 倒數第1項
切割List
my_list[1:3] # print 1~2 項
my_list[:-1] # print 0~倒數第2項
append :加入元素到最後面,不產生新物件,速度比 + 快
insert:在指定位置插入新元素
extend :在最後面加入元素(先展開再放進去)
+ :把兩個List加在一起
31
list 基本操作
len()計算list長度
sum()計算list中所有數值加總(但list中元素都需為數值)
count計算list中某個元素出現次數
pop刪除最後一項
remove(item):刪除指定項
搜尋
"bb" in my_list
True
"aa" in my_list
True
32
list 基本操作
List存取
List的List
改變某一元素
33
list 基本操作
增加元素
插入元素
丟出元素
計算List長度
刪除元素 sum()計算list中所有數值加總
34
list 基本操作
Slice(切片) 將串列的值複製到一個獨立串列
串列的copy()函式
list()轉換函式
串列slice[:]
尋找某個項目的index
判斷值是否存在該串列
35
list 基本操作
36
list 切片與運算
37
list 新增與刪除
list.pop() # 刪除末尾
list.pop(X) # 刪除指定位置的內容
38
list 基本操作
def myList():
my_list = []
my_list.append(1)
my_list.append(2)
my_list2 = [5.5,22,'Hi',3,99,22,66]
my_list2[0]=3.3
print(len(my_list),sum(my_list),my_list2.count(222))
print(my_list2[0])
print(my_list2[-1])
print(my_list2[:-1])
print(my_list2[1:4])
print(my_list2[2:3])
print(my_list2[2])
print(my_list2[3])
print(my_list2[2:])
def main():
myList()
39
list 基本操作
def myList():
list = ['a', 'b', 'c']
for x in list:
print(x)
my_list=[]
for i in range(0,10): #for(i=0;i<10;i++)
my_list.append(i+1)
for i in my_list:
print (i, end=' ')
def main():
myList()
40
list產生器
一種以一或多個迭代器建立Python資料結構。結合迴圈與
條件測試式,減少繁瑣語法。
41
list產生器
運算式 for 項目 in 可迭代項目 if 條件式]。
42
list二維陣列
twoDimArray = [[0]*3]*3
print(twoDimArray) # [[0,0,0],[0,0,0], [0,0,0]]
twoDimArray[0][0] = -1
print(twoDimArray) # [[-1, 0, 0], [-1, 0, 0], [-1, 0, 0]]
for row in twoDimArray:
print(id(row))
# 2074357947272
# 2074357947272
# 2074357947272
43
dictionary字典
字典是由key:value元素所構成,
字典無順序性,以key選擇項目而非index,key可以是字串。
def myFunction():
#建立
dictA = {}
dictB = dict()
dictC = {'name':'Tom', 'age':18, 'phone':'0933123001'}
print(dictC)
#刪除
del dictC['name']
print(dictC)
#以 key 取值
studentAge = dictC['age']
print(studentAge)
#以 in 檢驗 key 是否存在
if 'age' in dictC:
print(dictC['age'])
44
dictionary基本操作
dict()轉型
clean()清除所有項目
copy()清除所有項目
update()合併字典
45
dictionary基本操作
passwd={'Mars':00000,'Mark':56680}
passwd['Happy']=9999
passwd['Smile']=123456
del passwd['Mars']
passwd['Mark']=passwd['Mark']+1
print (passwd)
print (passwd.keys())
print (passwd.get('Tony'))
Output:
{'Happy': 9999, 'Smile': 123456, 'Mark': 56681}
['Happy', 'Smile', 'Mark']
None
46
set基本操作
admins = set()
users = {'Smile', 'Tony','Happy','Sherry','Allen','Andy', 'Mars'}
admins.add('ihc')
admins.add('Mars')
print (admins & users)
print (admins | users)
print (admins ^ users)
print (admins - users)
print (users - admins)
Output:
set(['Mars'])
set(['Allen', 'Andy', 'Smile', 'Mars', 'Tony', 'ihc', 'Happy', 'Sherry'])
set(['Andy', 'Allen', 'Tony', 'Smile', 'Happy', 'ihc', 'Sherry'])
set(['ihc'])
set(['Sherry', 'Andy', 'Allen', 'Tony', 'Smile', 'Happy'])
47
string基本操作
字串可用雙引號"或用單引號'進行標示
s = "Hello"
s += 'World'
s1 = "HelloWorld".replace("ll","1")
s2 = "Hello"[0]+"i"
print (s,s1,s2,len(s))
Output:
HelloWorld He1oWorld Hi 10
string.split()將字串依指定的字元(字串)切割
s3 = "This is a sentence."
s3_split=s3.split(' ')
print (s3_split)
Output:
['This', 'is', 'a', 'sentence.']
48
string基本操作
字串插入
49
string基本操作
替換string中的特定字串
Str.replace(old, new)
Old—將被替換的字串
New—要替代的字串
EX:
Output:
50
string基本操作
字串分str及byte兩物件,對應Unicode及編碼狀態。
建立字串實例如"中文"時,是 Unicode文字。
### input ### <class 'str'>
print(type("中文")) <class 'bytes'>
print(type("中文".encode("utf-8"))) <class 'str'>
print(type(u"中文")) 2
print(len("中文"))
讀檔寫檔時,建立 I/O實例透過 encoding編碼。
51
I/O
print預設印一行換行,使用,在每次印出間以空格取代,更
自由可使用library中的write函式。
Output:
不能除以0!!!
無論有沒有例外都會執行這一行
53
zip
zip([iterable, ...]) ,將參數壓成一個tuple,回傳成list
a = [1,2,3]
b = [4,5,6]
c = [7,8, 9, 10] Output
zipped = zip(a,b) [(1, 4), (2, 5), (3, 6)]
print([x for x in zipped]) [(1, 7), (2, 8), (3, 9)]
print([x for x in zip(a,c)])
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
#二維矩陣行列互換
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print([ [row[col] for row in a] for col in
range(len(a[0]))])
54
zip
以指定機率獲取元素
import random
def random_pick(seq, probabilities):
x = random.uniform(0,1)
#print(x) Output
cumulative_prob = 0.0 ccccacbbcb
for item, item_prob in zip(seq, probabilities):
#print(item, item_prob)
cumulative_prob+=item_prob
if x < cumulative_prob:
return item
for i in range(10):
print(random_pick('abc', [0.1, 0.3, 0.6]), end=' ')
55
map
map(function, iterable, ...),取function和參數運算
def multiple2(x):
return x*x
list1 = [1,3,5,7,9]
for x in map(multiple2,list1): Output
print(x, end=' ') 1 9 25 49 81
print() [1, 9, 25, 49, 81]
print([x for x in map(multiple2,list1)]) [1, 9, 25, 49, 81]
print([multiple2(x) for x in list1])
print() [103, 107, 111, 115, 119]
[103, 107, 111, 115, 119]
def adder(x,y,z):
return x+y+z
list1 = [1,3,5,7,9]
list2 = [2,4,6,8,10]
list3 = [100,100,100,100,100]
print([x for x in map(adder,list1,list2,list3)])
print([adder(x,y,z) for x,y,z in zip(list1,list2,list3)])
56
lambda
提供簡易function define:lambda,用完即丟。
實作簡單的function,只處理一個運算式,回傳一個值。
lambda param1, param2, ... : expression
def fun(param1, param2, ...) :
return expression
其中expression不能放assignment,=等號。
my_list = [1, 2, 3]
map( lambda i: i * i, my_list )
#>>> (1, 4, 9
57
lambda
定義 function裡面的function。
def make_repeater(n):
return lambda s: s*n Output
twice = make_repeater(2) wordword
print (twice('word')) 10
print (twice(5))
58
class
Class初始化函式是由兩條底線包含init做宣告。
# encoding: utf‐8
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade Output:
self.age = age John B 15
def set_name(self, name): dave A 12
self.name = name jane A 10
student_objects=[]
student_objects.append( Student('john', 'B', 15) )
student_objects.append( Student('dave', 'A', 12) )
student_objects.append( Student('jane', 'A', 10) )
student_objects[0].set_name('John')
for i in student_objects:
print (i.name,i.grade,i.age)
59
Sort
python提供方便的sort函式。
若需兩個值以上的排列順序,用attrgetter
student_objects=[]
student_objects.append(Student('john', 'B', 15) ) Output:
student_objects.append(Student('dave', 'A', 12) ) dave A 12
student_objects.append(Student('jane', 'A', 10) ) jane A 10
student_objects.sort(key=lambda i: i.grade) john B 15
for i in student_objects: john B 15
print(i.name,i.grade,i.age) dave A 12
print jane A 10
from operator import attrgetter
student_objects.sort(key=attrgetter('grade', 'age'),reverse=True)
for i in student_objects:
print(i.name,i.grade,i.age)
60