建立python/ch3 目錄, 在其中建立datatype.py 程式檔,輸入以下內容並執行: ... Python 提供型態轉換(Type conversion) 函式:int(), float(), str().
序言
Python簡介
執行Python程式
Python的資料
除錯
小烏龜繪圖模組
Python模組
字串
串列與字組
字典
決策結構
迴圈
函式
檔案
例外處理
物件與類別
第3章 Python的資料
(1)資料值與資料型態
∗資料值(Value)
▸資料值是程式處理的基礎項目之一
▸例如:整數5或字串'Helloworld'
∗資料型態(Datatype):不同的資料值屬於不同的資料型態
▸整數(Integer):例如5
▸浮點數(Floatingpoint,Float):例如3.2
✶亦即「實數」,因小數點可以浮動,因此稱為浮點數,例如:
3.2x102=0.32x103=32x101
▸字串(String):由一連串的字元組成,並且由兩個單引號或雙引號所包含,
例如'Helloworld'
▸布林(Boolean):只有兩個值,「真」(True)與「偽」(False)
▸物件(Object):由許多資料與函式構成
∗可利用type()函式來顯示資料型態:
→ 建立python/ch3目錄,
在其中建立datatype.py程式檔,輸入以下內容並執行:
print(type('Helloworld'))
print(type(17))
print(type(3.2))
結果:
→資料型態屬於字串類別(Stringclass)
→整數類別(Integerclass)
→浮點數類別(Floatclass)
(2)字串
▸Python的字串是由一對單引號或雙引號所包住一連串的字元,例如:'Helloworld','17','3.2',
"這是一個字串",'這也是一個字串',...
▸使用雙引號的字串中可以包含單引號,如"Bruce'sbeard",而使用單引號的字串中可以包含雙引號,如
'Ilikethebook"Howtothinklikeacomputerscientist."'
▸跨行字串則使用三個單引號或雙引號,例如在datetype.py最後加入下列內容:
...
print(type(3.2))
print('''這個訊息將
跨越
許多行''')
print()
print("""這個訊息也
跨越
許多行""")
...
這個訊息將
跨越
許多行
這個訊息也
跨越
許多行
▸Python的字串通常使用單引號,因為輸入方便,而且看來較簡潔
(3)資料型態轉換
∗數值型態轉換與字串轉換
▸Python提供型態轉換(Typeconversion)函式:int(),
float(),str()
▸int():將傳入之參數轉為整數,若參數為浮點數則將小數捨去(Truncate)
✶例如:建立convert.py檔案,內容如下:
print(3.14,int(3.14))
print(3.9999,int(3.9999))
print(3.0,int(3.0))
print(-3.999,int(-3.999))
print('2345',int('2345'))
print(int('23瓶飲料'))
✶執行結果:
3.143 → 浮點數3.14被轉成整數
3
3.99993 → 浮點數3.9999
被轉成整數3
3.03 → 浮點數3.0
被轉成整數3
-3.999-3 → 浮點數-3.9999
被轉成整數-3
23452345 → 字串'2345'
被轉成整數2345
Traceback(mostrecentcalllast):
File".../convertint.py",line6,in
print(int("23瓶飲料"))
ValueError:invalidliteralforint()withbase10:'23瓶飲料'
→字串'23瓶飲料'無法轉成整數,程式當掉並出現錯誤訊息:
"值錯誤:以10為基底的int()給了錯誤文字",
因此,要將一個字串正確轉為整數,該字串必須是語法正確的數字字串
▸float():將傳入之參數轉為浮點數
✶例如:在convert.py中刪除最後一行錯誤指令並加上以下內容:
...
print('2345',int('2345'))
print(int('23瓶飲料'))
print(float('123.45'))
print(type(float('123.45')))
print(float('123.45元'))
✶執行結果:
...
123.45 → 數值字串'123.45'
被轉成浮點數123.45
→ 資料型態為float類別
Traceback(mostrecentcalllast):
File".../convert.py",line8,in
print(float('123.45元'))
ValueError:couldnotconvertstringtofloat:'123.45元'
→字串'123.45元'無法轉成浮點數,程式當掉並出現錯誤訊息。
因此,
要將一個字串正確轉為浮點數,該字串必須是語法正確的數字字串
▸str():將傳入之參數轉為字串
✶例如:在convert.py刪除最後一行錯誤指令並加上以下內容:
...
print(type(float('123.45')))
print(float('123.45元'))
print(str(17))
print(str(123.45))
print(type(str(123.45)))
✶執行結果:
...
17 → 數字17被轉成字串
'17'
123.45 → 數字123.45被轉成字串
'123.45'
→ 資料型態為str類別
∗四捨五入運算(或稱「四捨六入」)
▸round():四捨五入轉整數運算,例如:
convert.py:
...
print(type(str(123.45)))
print(3.14,round(3.14))
print(3.72,round(3.72))
print(3.756,round(3.756,2))#小數2位
...
3.143 → 數字3.14被轉成
3
3.724 → 數字3.72被轉成
4
3.7563.76 → 數字3.756被轉成
3.76
∗絕對值運算
▸abs():取絕對值(Absolutevalue),例如:
convert.py:
...
print(3.72,round(3.72))
print(abs(10-2),abs(2-10))
...
88
(4)變數
∗名稱(Name):程式的重要元素之一
▸程式中的各種名稱統稱為識別字(Identifier),包含模組名稱(例如convert.py)、函式名稱
(例如print())、或變數名稱(例如address)等
▸Python識別字的規則:以英文字母或底線開頭,之後可以接字母、數字、或底線,例如:
phone,mobile_phone,mobilePhone,mobilePhone2,...
▸識別字的英文字母大小寫有別(Case-sensitive),因此address,Address,
aDDress,與ADDRESS均為不同的識別字
▸Python保留字(Keyword)如下,不可用於一般識別字:
Falseawaitelseimportpass
Nonebreakexceptinraise
Trueclassfinallyisreturn
andcontinueforlambdatry
asdeffromnonlocalwhile
assertdelglobalnotwith
asyncelififoryield
▸Python內建函式(Built-infunctions)如下,若用來當作識別字,則內建函式的功能將喪失,盡量不要使用:
abs()delattr()hash()memoryview()set()
all()dict()help()min()setattr()
any()dir()hex()next()slice()
ascii()divmod()id()object()sorted()
bin()enumerate()input()oct()staticmethod()
bool()eval()int()open()str()
breakpoint()exec()isinstance()ord()sum()
bytearray()filter()issubclass()pow()super()
bytes()float()iter()print()tuple()
callable()format()len()property()type()
chr()frozenset()list()range()vars()
classmethod()getattr()locals()repr()zip()
compile()globals()map()reversed()__import__()
complex()hasattr()max()round()
∗變數(Variable)
▸變數:代表一個值的名稱
▸指派指令(Assignmentinstruction)可以建立新的變數,並設定其值,語法如下:
=
✶ :變數名稱,是一個識別字
✶ :表示式,可以是一個值或一個運算式
✶指派指令將變數指向物件(例如下圖)
message='近來可好?'
pi=3.14
students=57
▸Python變數的特性
✶不需要事先宣告,利用指派指令直接創造新變數
✶動態資料型別,只要指派指令表示式的資料型態改變,變數的資料型態就改變,例如以下變數a
可以是整數、浮點數、或是字串
a=10#建立新的變數a,其資料型態為整數
a=3.2#浮點數(原先參考到10的指標被刪除)
a='abcd'#字串(原先參考到3.2的指標被刪除)
#沒有被任何變數參考到的物件,會定期被Python回收(Garbagecollection)
▸變數名稱格式
✶底線式,例如:number_of_students,num_students
✶駝峰式(首字開頭小寫,其餘字開頭大寫),例如:numberOfStudents,numStudents
▸註:許多其他程式語言需要事先宣告變數及其資料型態,如果沒有事先宣告某變數,則無法使用該變數,例如Java:
intstudents;
students=57;//OK
students='John';//錯誤:students並非字串
teachers=2;//錯誤:teachers並未事先宣告
(5)資料儲存的特性
∗靜態型別與動態型別程式語言
▸靜態型別(Statictyping):變數要先宣告,宣告時需要指定變數的資料型態,且該型態不會改變,例如:Java,C,...
✶Java範例:
intx;
x='abcd';//Compilationerror
▸動態型別(Dynamictyping):變數不需要先宣告,變數的資料型態隨時可改變,例如:Python,JavaScript,PHP,...
✶Python範例:
x=3
x='abcd'#OK
∗變數與記憶體
▸靜態型別語言的變數與記憶體是位置的關係,每個變數有固定的儲存空間,在宣告時決定,因此資料型態無法改變,例如Java:
intwidth=20;
intheight=30;
booleancanFly=true;
booleancanWalk=true;
▸動態型別語言的變數與記憶體是指標的關係,每個變數會參考(Reference)記憶體裡的一個值,多個變數可以參考同一值,例如Python:
width=20
height=20
canFly=True
canWalk=True
∗強型別與弱型別
▸強型別(Strongtyping):運算子期待變數應有某種資料型別,若使用其他型別會造成錯誤,例如:
✶Java:
intx;
x=20+'abcd';//Compilationerror
✶Python:
x=20+'abcd';#Interpretationerror
▸弱型別(Weaktyping):運算子期待變數應有某種資料型別,若使用其他型別可能不會造成錯誤,例如:
✶JavaScript:
x=20+'abcd';//x:'20abcd'
✶PHP:
$x=20+'abcd';#$x:'20abcd'
∗型態強迫轉換(Typecoercion)
▸例如JavaScript:如果使用並不期待的資料型態,JavaScript會嘗試解決型態問題,而不是直接發佈錯誤訊息,
亦即JavaScript會在幕後進行資料型態轉換,稱為型態強迫轉換(Typecoercion),例如:
'1'>0 →true
(將字串'1'轉為數值)
x=5+'2' →'52'
(相加:將數值轉字串)
x=5-'2' →3
(相減:將字串轉數值)
▸Python不會強迫轉換變數型態
∗電腦算術的限制
▸一般程式語言以固定大小的位元數儲存整數
✶32位元之整數範圍:−231~231−1
✶64位元之整數範圍:−263~263−1
✶超過整數範圍的計算會使程式編譯失敗、執行當掉、或者算出錯誤的結果
▸Python的整數並無範圍,唯一的限制是電腦裡所擁有的記憶體的量
✶當整數數值不大時,Python使用一般的整數表示法
✶當整數數值很大時,Python使用更多位元來表示
✶大整數運算時,Python則將運算拆成幾部分來算,故效率較低
(6)運算子與運算元
∗運算子(Operator)
▸運算的符號,例如加、減、乘、除、整除、指數次方、模數的運算子分別為+,−,*,/,//,**,%
∗運算元(Operand)
▸運算子所運算的值,例如以下的a與b是運算元
x=a+b
∗Python3的除法有兩種運算子:/與//
▸/:一般除法,相除的結果一定是浮點數
x=5
y=2
print(x/y)
x=6
y=2
print(x/y)
2.5
3.0
▸//:整除法,相除結果僅留整數部份(如果兩個運算元均為整數,則結果是整數,
若某一個運算元是浮點數,則是浮點數)
x=5
y=2
print(x//y)
x=5.0
y=2
print(x//y)
2
2.0
∗其他語言的除法可能會因為運算元的資料型態不同而產生不同結果,例如Java:
▸兩個運算元都是整數:
intx,y;
x=5;
y=x/2;//y:2
▸有一個運算元是浮點數(另一個整數變數會自動提昇為浮點數):
intx;
floaty;
x=5;
y=x/2;//y:2.5
∗模數運算子(Modulusoperator,mod)
▸亦稱為餘數運算子(Remainderoperator)或整數餘數運算(Integerremainderoperator)
▸計算兩個整數相除後的餘數,例如:
remainder=7%3
print(remainder)#remainder:1
▸模數運算常用在判斷某個整數是否為另一個整數的倍數(亦即兩個數值是否能整除)
✶例如,如果x%y等於0(餘數等於0),則x是
y的倍數,亦即x能被y整除
▸範例:給定總秒數,計算一般格式的時、分、秒數(分及秒都小於60)
✶建立time.py檔案,內容如下:
totalSeconds=7684
hours=totalSeconds//(60*60)
remainingSeconds=totalSeconds%(60*60)
minutes=remainingSeconds//60
seconds=remainingSeconds%60
print(f'{hours}時{minutes}分{seconds}秒')
2時8分4秒
▸練習1
∗次方運算子(Poweroperator)
▸計算數值的指數次方,例如:
x=7**2
print(x)#x:49
▸練習2
(7)輸入指令
▸input()函式:Python的輸入函式,讓使用者從鍵盤輸入資料
✶上述time.py程式有點侷限,因為總秒數都是寫死的,無法針對不同的總秒數來重複計算,
解決方案:讓使用者輸入總秒數
✶利用input()函式取得使用者輸入的資料,並將資料指派給變數(使用者輸入的任何資料都是字串,
因此需要轉換為數值):
totalSeconds=7684
totalSeconds=input('請輸入總秒數:')
totalSeconds=int(totalSeconds)
hours=totalSeconds//(60*60)
...
▸練習3
(8)運算順序
▸當表示式裡有許多運算子,哪些運算應該先執行,哪些運算應該後執行?例如:
x=2*3+4
✶若2*3先計算,結果為10;若
3+4先計算,結果為14
▸運算的順序由運算子的優先順序法則(Ruleofprecedence)決定,優先權由高至低為:
1.括號內的表示式
x=2*(3+4) #14
2.次方
x=2**3+4 #12
3.乘、除、及餘數
x=2*3+4 #10
4.加減
x=3**2*4+2 #38
▸優先權相同的運算子,由左至右進行運算
x=2*3/4 #1.5
▸練習4
(9)簡潔的指派指令
▸以原先的變數值進行更新:
x=x+1→x+=1
x=x-1→x-=1
x=x*2→x*=2
x=x/2→x/=2
x=x%2→x%=2
x=x//2→x//=2
x=x**2→x**=2
▸指派鍊(Chainedassignments):
a=b=c=5
✶註:Python指派指令不回覆任何值,因此指派鍊是特殊情況(C與Java會回覆值)