You are on page 1of 60

Python

郭忠義

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] 其中一個
 變數區分大小寫

 變數長度沒有限制

 特殊的變數, 開頭和結尾都加兩個下底線, ex: __init__

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

 > '{real} is {nick}!!'.format(real = 'Justin', nick = 'caterpillar')

 'Justin is caterpillar!!'

 > '{real} is {nick}!!'.format(nick = 'caterpillar', real = 'Justin')

 'Justin is caterpillar!!'

 > '{0} is {nick}!!'.format('Justin', nick = 'caterpillar')

 'Justin is caterpillar!!'

 > '{name} is {age} years old!'.format(name = 'Justin', age = 35)

 'Justin is 35 years old!'

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 a<x and x<b

 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('不及格,要加油')

大於等於 A>=B def main():


小於等於 A<=B myFunction()
myFunction()
邏輯 語法
main()
且 A and B
或 A or B
否定 not A

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()函式回傳指定範圍內的一串數字。
使用方法 範例 執行結果

range(終止值) for i in range(5): 0


數字串列到「終止值」的前一個數 print(i) 1
字為止,沒有指定起始值,預設起 2
始值為0,沒有指定遞增值,預設為 3
遞增1。 4
range(起始值 , 終止值) for i in range(2,6): 2
數字串列由「起始值」開始到「終止 print(i) 3
值」的前一個數字為止,沒有指定遞 4
增值,預設為遞增1 5
range(起始值 , 終止值 , 遞增(減)值) for i in range(2,10,2): 2
數字串列由「起始值」開始到「終 print(i) 4
止值」的前一個數字為止,每次遞 6
增或遞減「遞增(減)值」。 8
for i in range(100,90,-3): 100
print(i) 97
94
91
25
Loop
 允許使用者輸入加總的開始值、結束值與遞增值,計算數
值加總結果,例如3+6+9+12的結果,則輸入3為開始值,12
為結束值,3為遞增值。

def mySum(min, max):

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)

if my_list[0]==1 and len(my_list)<10:


my_list[0]+=1
print ('1 state')
elif (10 in my_list) or not(len(my_list)==10):
print ('2 state')
print ('range(i,j) is i~j-1')
else:
print ('3 state')
print ('none of above')

for i in my_list:
print (i, end=' ')
def main():
myList()
40
list產生器
 一種以一或多個迭代器建立Python資料結構。結合迴圈與
條件測試式,減少繁瑣語法。

[運算式 for 項目 in 可疊代項目]

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:

 str = "It is string example"

 print str.replace("is", "was");

 Output:

 It was string example

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編碼。

### input ###


with open("filename.txt",'w',encoding='utf-8') as outfile:
outfile.write("anything you want to write")
<class 'str'>
with open("filename.txt",'r',encoding='utf-8') as infile:
text = infile.read()
print(type(text))

51
I/O
 print預設印一行換行,使用,在每次印出間以空格取代,更
自由可使用library中的write函式。

import sys # 造出 db.txt


file_in = open('db.txt','r') 1111
file_out = open('copy.txt','w') 2222
for line in file_in: ssss
for i in range(0,len(line)): wwww
if line[i]!="\n": 5555
sys.stdout.write(line[i]+',')
else: Output:
sys.stdout.write(line[i]) 1,1,1,1,
2,2,2,2,
file_out.write(line[i]) s,s,s,s,
sys.stdout.write("\n") w,w,w,w,
file_in.close() 5,5,5,5,
file_out.close() copy.txt內容和db.txt一樣
52
Exceptions Handling
# encoding: utf‐8
def my_divide():
try:
10 / 0 #會讓程式出錯,所以需要特別handle
except ZeroDivisionError:
print('不能除以0!!!')
else:
print('沒有任何錯誤')
finally:
print('無論有沒有例外都會執行這一行')
my_divide()

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,=等號。

def func(x, y, z):


return x + y + z
func2 = lambda x,y,z : x+y+z Output
print(func(1, 2, 3)) 6
print(func2(1, 2, 3)) 6

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

You might also like