第3 章Python 的資料

文章推薦指數: 80 %
投票人數:10人

建立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會回覆值)



請為這篇文章評分?