網頁

2025年7月31日 星期四

Python 文字表格輸出格式

 一、主題介紹:

Python 套件中一個非常好用的文字輸出表格工具為 tabulate ,此工具有相對應的參數可以設定自己想要的輸出樣式、對齊、格式..等,不用手動再去一步步寫程式來描繪出表格的形狀,省去很多撰寫程式的時間,是一個非常好用的套件,我們現在來了解它有哪些參數可以使用。

(1) tabulate( data , headers , tablefmt , showindex , numalign , stralign )

(2) data: 這是一個必填參數,就是要顯示在錶格內的二維資料。

(3) headers: 表格欄位標題名稱,使用一維資料。

(4) tablefmt: 表格樣式,選擇要顯示的表格外觀,如..

      "plain":無邊框,純文字。

      "simple":預設值,簡單邊框。

      "grid":有格線框的表格。

      "fancy_grid":漂亮的 Unicode 格線。

(5) showindex: 是否顯示索引。

      "False":不顯示。

      "True":自動加上索引 0, 1, 2,...。

      range(3,10):使用自訂索引,從3開始到9。

(6) numalign: 數字對齊方式。

      "right":向右對齊。

      "left":向左對齊。

      "center":置中。

(7) stralign:文字對齊方式。

      同 numalign,但用於非數字資料。


二、程式範例:

>>> from tabulate import tabulate

>>> header=["Name","Age","Height","Weight"]

>>> data=[["Andy",11,22,33],["Mary",44,55,66],["Joe",77,88,99]]

>>> print(tabulate(data,headers=header,tablefmt="fancy_grid",showindex=True,

        numalign="right",stralign="center"))





2025年7月30日 星期三

Python 文字檔的刪除資料

 一、主題介紹:

在文字檔 (.txt) 裡如前幾篇文章所講的查詢、新增、修改..外,還有刪除資料的功能,這就是今天要來探討的內容,刪除檔案資料的功能其實和修改資料的程式架構大同小異,都是要先讀取文字檔 (.txt) 內容資料後,再根據資料做修改或刪除的功能,等到處理完後再將變動的資料存回原本的文字檔 (.txt),即完成整個流程動作。


二、程式範例:

(1) 文字檔內容 (data.txt)

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

3 C455 成功 王八 0921-168168

4 E150 億元 胡二 0900-444444

5 D050 旺旺 鄭一 0900-888888

6 E150 億萬 胡二 0900-111111

7 E111 資源 方五 0900-333333

8 E222 億元 詹六 0900-222222


(2) 程式內容


class TxtAccess:

    def __init__(self,file):   #初始化
        self.__file = file

    def search(self):   #查詢
        with open(self.__file,"r",encoding="utf-8") as fobj:
            datas = fobj.read()
        return datas
   
    def newadd(self,datas):   #新增
        with open(self.__file,"a",encoding="utf-8") as fobj:
            fobj.write("\n")
            for i in range(0,len(datas),1):
                fobj.write(str(datas[i]))
                fobj.write(",")

    def modify(self,id,newdata):   #修改
        array = []
        with open(self.__file,"r",encoding="utf-8") as fobj:
            for line in fobj:
                row = line.strip().split()
                array.append([x for x in row])
        array[id] = newdata
        with open(self.__file,"w",encoding="utf-8") as fobj:
            for row in array:
                line = ' '.join(map(str,row))
                fobj.write(line+"\n")

    def delData(self,id):   #刪除
        array = []
        with open(self.__file,"r",encoding="utf-8") as fobj:
            for line in fobj:
                row = line.strip().split()
                array.append([x for x in row])
        array.pop(id)
        with open(self.__file,"w",encoding="utf-8") as fobj:
            for row in array:
                line = ' '.join(map(str,row))
                fobj.write(line+"\n")

   
    def show(self,data):   #顯示
        print(data)




file = "data.txt"
A = TxtAccess(file)
#刪除
A.delData(3)
sr = A.search()
A.show(sr)


# 執行結果

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

4 E150 億元 胡二 0900-444444

5 D050 旺旺 鄭一 0900-888888

6 E150 億萬 胡二 0900-111111

7 E111 資源 方五 0900-333333

8 E222 億元 詹六 0900-222222



三、程式說明:

由程式執行結果可以知道第3列的資料被刪除了,而刪除功能的程式就在類別方法的最後一個 delData() 函式,此程式內容就做到先讀取再刪除,刪除後將資料存回文字檔 (.txt) 內,使用了 pop() 內建函式,將要刪除的資料整列刪除。



2025年7月29日 星期二

Python 文字檔的修改資料

 一、主題介紹:

文字檔 (.txt) 怎麼修改資料是今天這篇文章的重點,也是承接上篇文章的範例繼續延伸,要修改文字檔內容資料前,必須先將文字檔內容讀出資料後才能修改它,而讀取到的資料就得放入陣列暫存器中,這樣再修改陣列中的資料就簡單多了;首先來談談我們需要用到的指令。

(1) strip():移除換行符號 "\n"。

(2) split():將每行欄位分別拆分。

(3) append():用於串列尾端新增一個元素。

(4) join():用於將多個字串元素合併為一個字串。

(5) map():把某個函式依序套用在一個可替代物件的每個元素上,產生一個新的可替代結果。

(6) write():將文字寫入檔案的方法。


二、程式範例:

(1)文字檔內容

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

3 C455 成功 王八 0921-168168

4 A666 上榜 李四 0900-777777

5 D050 旺旺 鄭一 0900-888888

6 E150 億元 胡二 0900-111111

7 E150 億元 胡二 0900-111111

9,E150,億元,胡二,0900-111111


(2)程式內容


class TxtAccess:

    def __init__(self,file):   #初始化
        self.__file = file

    def search(self):   #查詢
        with open(self.__file,"r",encoding="utf-8") as fobj:
            datas = fobj.read()
        return datas
   
    def newadd(self,datas):   #新增
        with open(self.__file,"a",encoding="utf-8") as fobj:
            fobj.write("\n")
            for i in range(0,len(datas),1):
                fobj.write(str(datas[i]))
                fobj.write(",")

    def modify(self,id,newdata):   #修改
        array = []
        with open(self.__file,"r",encoding="utf-8") as fobj:
            for line in fobj:
                row = line.strip().split()
                array.append([x for x in row])
        array[id] = newdata
        with open(self.__file,"w",encoding="utf-8") as fobj:
            for row in array:
                line = ' '.join(map(str,row))
                fobj.write(line+"\n")
   
    def show(self,data):   #顯示
        print(data)


file = "data.txt"
datas = ['9','E150','億元','胡二','0900-111111']
A = TxtAccess(file)
#修改
A.modify(4,datas)
sr = A.search()
A.show(sr)


#執行結果 ..

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

3 C455 成功 王八 0921-168168

9 E150 億元 胡二 0900-111111

5 D050 旺旺 鄭一 0900-888888

6 E150 億元 胡二 0900-111111

7 E150 億元 胡二 0900-111111

9,E150,億元,胡二,0900-111111,


三、程式說明:

由執行程式結果可以知道,原本第 4 項的文字檔內容被修改掉了,所以修改資料內容是存取文字檔功能當中的其中一個,下一篇要來介紹刪除文字檔的資料,請寄的訂閱,下篇文章上架時會通知您。

2025年7月28日 星期一

Python 文字檔的新增資料

 一、主題介紹:

上一篇 Python 文章針對文字檔 (.txt) 的查詢資料功能有做詳細的介紹,有興趣的人可以到上篇文章觀看,接下來今天要來介紹如何新增資料到文字檔 (.txt) 內。我們依然延續上次的物件導向 (OO, Object Oriented) 程式設計,在類別裡新增方法來建立儲存文字檔 (.txt) 資料,在建立應用程式之前,先來講講一些指令的用法。


(1) with ~ as ~

這是一個上下文管理器的語法,時常用來管理資源的開啟與關閉,如:檔案、網路連線、資料庫連線..等的開啟與關閉,使用此指令可以使程式碼更加簡潔,省去了結束程式的關閉動作,也不會因為忘了寫關閉動作而造成程式執行的異常,所以它的功能是自動管理資源釋放記憶體空間,就算是發生錯誤也能正確自動地關閉資源。


(2) open ( file, mode, encoding )

在 Python 程式裡,若要將資料寫入檔案或從檔案中讀取資料,就必須經過此開啟檔案物件的函式,在 open 裡的第一個參數 file 是要設定檔案的路徑及名稱,第二個參數 mode 是設定檔案存取的模式 (如: 讀、寫..),第三個參數是設定存取檔案資料的編碼格式 (如: utf-8 ),其最主要的目的是防止產生中文亂碼。



二、程式範例:

(1) 文字檔內容

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

3 C455 成功 王八 0921-168168

4 D050 旺旺 鄭一 0900-888888

5 D050 旺旺 鄭一 0900-888888

6 E150 億元 胡二 0900-111111

7 E150 億元 胡二 0900-111111


(2) 程式內容

class TxtAccess:

    def __init__(self,file):   #初始化
        self.__file = file

    def search(self):   #查詢
        with open(self.__file,"r",encoding="utf-8") as fobj:
            datas = fobj.read()
        return datas
   
    def newadd(self,datas):   #新增
        with open(self.__file,"a",encoding="utf-8") as fobj:
            fobj.write("\n")
            for i in range(0,len(datas),1):
                fobj.write(str(datas[i]))

    def show(self,data):   #顯示
        print(data)



file = "data.txt"
datas = ['9','E150','億元','胡二','0900-111111']
A = TxtAccess(file)
#新增
A.newadd(datas)
sr = A.search()
A.show(sr)


#執行結果 ..

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

3 C455 成功 王八 0921-168168

4 D050 旺旺 鄭一 0900-888888

5 D050 旺旺 鄭一 0900-888888

6 E150 億元 胡二 0900-111111

7 E150 億元 胡二 0900-111111

9,E150,億元,胡二,0900-111111


三、程式說明:

在此程式範例中將上篇文章中的程式,新增了類別方法裡的第三個函式 newadd(),用來新增資料到文字檔,所以透過此程式範例不僅學習如何建立物件導向程式,還可以學習如何對檔案的存取,真的一舉兩得,有興趣的朋友不要忘記訂閱,下篇文章 "文字檔的修改資料" 上架時會通知您。


2025年7月27日 星期日

Python 文字檔的查詢

 一、主題介紹:

文字檔就是副檔名為 .txt 的檔案,它是將資料永久儲存放置的其中一個方法,接下來的連續四篇文章將說明怎麼使用物件導向程式設計來建立對文字檔 (.txt) 檔做到查詢 (Search)、新增 (NewAdd)、修改 (Modify)、刪除 (Delete) 的功能,今天就先來講講使用類別方法查詢文字檔內容資料,如果大家有看過前篇文章如何建立物件導向程式說明的話,應該對建立類別不會陌生,如果還是有些不瞭解,可以往前篇文章尋找重複多看幾遍,相信很快就能熟悉物件導向程式設計的用法了。


二、程式範例:


# 文字檔內容 ( 檔名: data.txt )

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

3 C455 成功 王八 0921-168168

4 D050 旺旺 鄭一 0900-888888

5 D050 旺旺 鄭一 0900-888888

6 E150 億元 胡二 0900-111111

7 E150 億元 胡二 0900-111111


# Python 程式


 2.  
 3.   def __init__(self,file):   #初始化
 4.       self.__file = file
5.
 6.   def search(self):   #查詢
 7.       with open(self.__file,"r",encoding="utf-8") as fobj:
 8.           datas = fobj.read()
 9.       return datas
 10.  
 11.   def show(self,data):   #顯示
 12.       print(data)
13.
14.
15. file = "data.txt"
16. A = TxtAccess(file)
17. sr = A.search()
18. A.show(sr)


# 執行結果

序 編號 公司 聯絡人 行動電話 備註

1 B001 加佳 張三 0900-123456

2 E150 億元 胡二 0900-111111

3 C455 成功 王八 0921-168168

4 D050 旺旺 鄭一 0900-888888

5 D050 旺旺 鄭一 0900-888888

6 E150 億元 胡二 0900-111111

7 E150 億元 胡二 0900-111111



三、程式說明:

第1行:  使用 class 建立類別。

第3行:  類別初始化,當建立物件的同時做初始參數設定。

第6行:  建立搜尋文字檔的方法。

第11行:  建立列印文字檔內容顯示於螢幕的方法。

第16行:  建立物件。

第17行:  執行類別方法查詢讀取文字檔內容。

第18行:  列印顯示文字檔內容於螢幕。




2025年7月26日 星期六

Python 數值與字串格式化

 一、主題介紹:

格式化的目的是要將數值或字串轉換為我們想要的格式,並做其他運算、列印、顯示之應用,在 Python 語言中可以使用 format() 這個內建函式來將數值與字串格式化,根據函式括弧內不同的參數的設定,就可以格式化回傳我們想要的任何格式資料,接下來看看它的作法有哪些。

(1) 整數格式化

#共有8位字元寬度,靠左對齊

>>>format(168,"<8")

'168     '


#共有8位字元寬度,靠右對齊

>>>format(168,">8")

'     168'


#共有8位字元寬度,置中對齊

>>>format(168,"^8")

'  168   '


#共有8位字元寬度,置中對齊,空格不分以 # 填滿

>>>format(168,"#^8")

'##168###'


#加上千位逗號

>>>format(123456789,",")

'123,456,789'


(2) 浮點數格式化

#共有8位字元寬度,小數點2位數

>>>format(1688,"8.2f")

' 1688.00'


(3)字串格式化

#共有30位字元寬度,預設靠左對齊

>>>format("You are the best.","30")

'You are the best.             '


#共有30位字元寬度,並靠右對齊

>>>format("You are the best.",">30")

'             You are the best.'


#共有30位字元寬度,並置中對齊

>>>format("You are the best.","^30")

'      You are the best.       '



二、程式應用:


class Calculate:
    def __init__(self,listNumber):
        self.__floatNumber = listNumber
        self.__length = len(listNumber)

    def getTotal(self):
        sum = 0
        for i in range(0,self.__length,1):
            sum = sum + self.__floatNumber[i]
        return sum
   
    def getMax2Min(self):
        num = self.__floatNumber
        quit = 0
        while quit==0:
            quit = 1
            for j in range(0,self.__length-1,1):
                if num[j] < num[j+1] :
                    temp = num[j]
                    num[j] = num[j+1]
                    num[j+1] = temp
                    quit = 0
        return num
   
    def getMin2Max(self):
        num = self.__floatNumber
        quit = 0
        while quit==0:
            quit = 1
            for k in range(0,self.__length-1,1):
                if num[k] > num[k+1] :
                    temp = num[k]
                    num[k] = num[k+1]
                    num[k+1] = temp
                    quit = 0
        return num
   
    def conversion(self,listdata,ref):
        for i in range(0,self.__length,1):
            listdata[i] = format(float(listdata[i]),ref)
        return listdata



listdata = [23,84.5,16.71,60,90.2]
A = Calculate(listdata)
print("原串列資料= \n",listdata)
print("原串列資料的總和,且格式化3位整數及3位小數= \n",
format(A.getTotal(),"6.3f"))
print("原串列資料排列由大到小,且格式化7位數及3位小數並靠左對齊= \n",
A.conversion(A.getMax2Min(),"<7.3f"))
print("原串列資料排列由小到大,且格式化10位數字及4位小數並靠右對齊= \n",
A.conversion(A.getMin2Max(),">10.4f"))
print("原串列資料排列由小到大垂直小數點對其排列,且格式化20位數及5位小數並靠右對齊= ")
B = A.conversion(A.getMin2Max(),">20.5f")
for i in range(0,len(B)):
    print(B[i])

#執行結果 ...

原串列資料= 

 [23, 84.5, 16.71, 60, 90.2]

原串列資料的總和,且格式化3位整數及3位小數=

 274.410

原串列資料排列由大到小,且格式化7位數及3位小數並靠左對齊=

 ['90.200 ', '84.500 ', '60.000 ', '23.000 ', '16.710 ']

原串列資料排列由小到大,且格式化10位數字及4位小數並靠右對齊=

 ['   16.7100', '   23.0000', '   60.0000', '   84.5000', '   90.2000']

原串列資料排列由小到大垂直小數點對其排列,且格式化20位數及5位小數並靠右對齊=

            16.71000

            23.00000

            60.00000

            84.50000

            90.20000


三、程式說明:

由以上針對數值與字串格式化的介紹與使用說明,可以知道格式化的好處在於讓輸出顯示的資料能整齊、美觀、易讀、符合我們想要的輸出資料的格式,這些在報表列印、資料對齊、數值經度控制..等的實務應用上非常重要。





2025年7月25日 星期五

Python 資料描述格式JSON

 一、主題介紹:

JSON 英文全名為 JavaScript Object Notation ,中文翻譯為 JavaScript 物件表示法,採用的語法輕巧、且容易解析,幾乎所有的網路資料交換資訊格式都會使用到它,它是由鍵和值所組成的資料,相當於 Python 的字典 ( dict ) 格式,dict 字典於前篇文章中有介紹過,有興趣的可以去看看,而 Json 與 Dict 資料格式的主要差異在資料類型的定義上不同,JSON 資料格式上是使用雙引號,Dcit 是使用單引號。


二、程式應用:

# 建立檔案 data.json,並存入以下資料


{
  "student": "瑪莉",
  "sex": "女生",
  "age": 18,
  "score": [
    {
      "suject": "國文",
      "result": 86
    },
    {
      "suject": "英文",
      "result": 63
    }
  ]
}

# 建立 Python 檔案


1. import json
2.
3. f = open('data.json',encoding='utf-8')
4. dict_data = json.loads(f.read())
5. print(dict_data)
6. json_data = json.dumps(dict_data,ensure_ascii=False)
7. print(json_data)

# 執行結果

{'student': '瑪莉', 'sex': '女生', 'age': 18, 'score': [{'suject': '國文', 'result': 86}, {'suject': '英文', 'result': 63}]}

{"student": "瑪莉", "sex": "女生", "age": 18, "score": [{"suject": "國文", "result": 86}, {"suject": "英文", "result": 63}]}



三、程式說明:

第1行: 匯入 json 套件

第3行: 建立 json 檔案的物件

第4行: 使用 loads 的 json 指令將讀取到的檔案 json 資料轉換為 dict 格式。

第5行: 將 dict 格式的資料列印出來

第6行: 使用 dumps 的 json 指令將 dict 資料轉換為 json 格式。

第7行: 將 json 格式的資料列印出來



2025年7月24日 星期四

Python 二維陣列

 一、主題介紹:

上篇有介紹過一維陣列的使用,今天就來講講什麼是二維陣列,二維陣列又可以應用在什麼地方,二維陣列是陣列的一種形式,它可以想成一個矩陣或表格,凡是具有列與欄都可以稱作二維陣列,在 Python 中我們可以使用 numpy 套件輕鬆建立與操作二維陣列。

二維陣列可以應用的地方有表格資料的建立,如:Excel、CSV,用於表示每一個列欄位置的資料;也可以應用在統計資料的分析,如:計算平均值、總和、最小值、最大值..等;亦可以用在數學矩陣的運算,如:線性代數、機器學習、反矩陣、特徵值、矩陣相乘..等;在圖像處理方面也可以使用像素組成的矩陣,每個像素的顏色參數、亮度數值都可以用二維陣列表示;還有地圖與棋盤系統,如:遊戲中的地圖象棋皆可用 2D 陣列來表示每個格子的狀態,所以可見二維陣列的應用還真的很廣泛,真的值得我們往下繼續學習。


二、應用程式:


1. import numpy as np
2.
3. A = np.array([[10, 20, 30],[40, 50, 60],[70, 80, 90]])
4. print("原始陣列= \n",A,"\n")
5. print("第2列第3欄的值= ",A[2, 2],"\n")
6. print("總和= ",np.sum(A),"\n")
7. print("每一列的加總= ",np.sum(A, axis=1),"\n")
8. print("每一欄的加總= ",np.sum(A, axis=0),"\n")
9. print("轉置後的陣列= \n",A.T,"\n")

#執行結果 ..

原始陣列= 

 [[10 20 30]

 [40 50 60]

 [70 80 90]]

第2列第3欄的值=  90

總和=  450

每一列的加總=  [ 60 150 240]

每一欄的加總=  [120 150 180]

轉置後的陣列=

[[10 40 70]

 [20 50 80]

 [30 60 90]]


三、程式解說:

第3行:  建立一個 3x3 的二維陣列。

第4行:  將建立的原始陣列列印出來。

第5行:  存取第3列第4欄的元素資料,並列印出來。

第6行:  計算整個陣列元素的總和,並列印出來。

第7行:  使用 axis=1 參數值,計算每一列的加總,並列印出來。

第8行:  使用 axis=0 參數值,計算每一欄的加總,並列印出來。

第9行:  將原始陣列做轉置動作,並列印出來。




2025年7月23日 星期三

Python 一維陣列

 一、主題介紹:

一維陣列是在處理數據與撰寫程式時最常見的資料結構之一,在科學、數學、統計、機器學習、工程計算、及日常資料處理..等的實際應用非常廣泛,就好比需要將一串同類型的數據 ( 如溫度、成績、營業額、水質... ) 透過一維陣列集中處理或儲放資料庫。

#計算一串成績的平均值

A = np.array( [ 40, 80 , 60 , 100 ] )

avg = np.mean( A )

print("avg= ", avg )

# avg= 70


二、應用程式:

1. import numpy as np
2.
3. arr = np.array([10, 20, 30, 40, 50])
4. print("陣列內容:", arr)
5. print("陣列形狀:", arr.shape)
6. print("第3個元素:", arr[2])
7. new_arr = arr + 10
8. print("每個元素加10後的新陣列:", new_arr)
9. print("總和:", np.sum(arr))
10. print("平均值:", np.mean(arr))


#執行結果 ...

陣列內容: [10 20 30 40 50]

陣列形狀: (5,)

第3個元素: 30

每個元素加10後的新陣列: [20 30 40 50 60]

總和: 150

平均值: 30.0


三、程式說明:

第 1 行: 使用 import 匯入套件 numpy。

第 3 行: 使用 array 建立一維陣列。

第 4 行: 列印陣列內容。

第 5 行: 列印陣列形狀 ( 即元數數量 )。

第 6 行: 存取第三個元素的資料。

第 7 ~ 8 行: 對陣列每個元素數值都加上 10 ,並列印出新陣列。

第 9 行: 列印出一維陣列數據的總和。

第 10 行: 列印出一維陣列數據的平均值。



2025年7月22日 星期二

Python 存取CSV檔

 一、主題介紹:

當建立了很多筆資料都沒有儲存,是否意味著每次都得重新再建立,就沒有達到資料重複使用的效果,所以建立資料庫就顯得很重要了,而建立資料庫有的使用 MySQL、或 SQLite、...等,但這些資料庫都是可以處理大量資料的,如果我們的資料不多,只是暫時儲存資料、小型專案的資料存取、系統間資料的匯入出...,就可以考慮使用簡單的 CSV 檔來儲存資料來得方便許多。


二、程式範例:


import csv

class AccessCSV:

    def __init__(self,file):
        self.__file = file

    def writeData(self,data):
        with open(self.__file,'a',newline='') as fcsv:
            w = csv.writer(fcsv)
            w.writerow(data)

    def readData(self):
        with open(self.__file,'r',newline='') as fcsv:
            rows = csv.reader(fcsv)
            for r in rows:
                print(r)


from mylib import AccessCSV

file = "data.csv"
wdata_title = ['學生','科目','成績']
wdata_1 = ['李白','國文',88]
wdata_2 = ['張三','英文',65]
wdata_3 = ['李四','數學',37]

obj = AccessCSV(file)
obj.writeData(wdata_title)
obj.writeData(wdata_1)
obj.writeData(wdata_2)
obj.writeData(wdata_3)
obj.readData()


#執行結果 ...

['學生', '科目', '成績']

['李白', '國文', '88']

['張三', '英文', '65']

['李四', '數學', '37']



三、程式說明:

程式內容使用了物件導向來撰寫存取 CSV 檔,如果有對物件導向有不熟悉的地方,可以參考前篇的文章有介紹到怎麼撰寫類別程式的方法。建立開啟檔案的物件使用 with ~ as ~ 指令,它的好處是會自動關閉檔案、資料庫連線的資源、記憶體釋放...,寫入 csv 檔使用了 ' a ' 參數主要的目的就是從檔案的尾端寫入資料,而不是使用 ' w ' 參數先清除資料再寫入,而 newline = ' ' 這個目的是每筆資料使用的分隔字元,讀取 csv 檔就使用 ' r ' 參數,最後使用 print 指令將 csv 檔資料列印來,即完成存取 csv 檔功能。


2025年7月21日 星期一

Python 遞迴函式

 一、主題介紹:

遞迴函式顧名思義就是可以重複呼叫自己本身的函式,雖然遞迴函式可以使用 for 或 while 迴圈程式來取代,但是遞迴函式的邏輯可讀性還是比用迴圈方式還要好,例如: 如果使用迴圈來寫計算階乘的程式,就沒辦法考慮到靈皆成了( 0 ! )。


二、範例程式:

#使用迴圈

 
 a=1
 for i in range(1,6):
     a = a*i
 print("5!= ",a)
   

#執行結果

5!=  120


#使用遞迴函式


def factorial(n):
    if n==0 :
        return 1
    elif n>0 :
        return n*factorial(n-1)
    else :
        return -1
 
print("0!= ",factorial(0))
print("1!= ",factorial(1))
print("2!= ",factorial(2))
print("3!= ",factorial(3))
print("4!= ",factorial(4))
print("5!= ",factorial(5))
 

#執行結果

0!=  1

1!=  1

2!=  2

3!=  6

4!=  24

5!=  120


三、程式說明:

如果使用迴圈來計算階乘就只能依照程式寫好的數字範圍計算階乘,無法靈活應用於其它數字的階乘,由此可見用迴圈寫較沒有彈性,而且也沒辦法考慮到 0!=1 的狀況;反之,如果使用遞迴函式來寫計算階乘程式,就可以全面的考慮到階乘等於零、大於零、或小於零的情形,富有彈性、可讀性及邏輯性。



2025年7月20日 星期日

Python 匿名函式

一、主題介紹: 

Lambda ( 匿名函式 ) 一般都是用在只需要一行簡單的函式、而且使用的頻率也只會用一次或澤很短的地方,這樣就不需要特別地寫一個很完整的 def 函式。那到底 Lambda 與 def 有什麼差異呢?

項目lambdadef
定義方式匿名函式(一行)具名函式
函式名稱沒有(匿名)
多行程式不能(只能一行)
註解不行可以
條件判斷不行可以
調試不容易(難追蹤錯誤)容易
用途簡單運算且一次使用複雜且可重複使用
維護複雜時很難容易



二、程式範例:


#使用 def 建立具體函式

def mul(a,b):
    return a*b

print("使用def具體函式執行結果= ",mul(8,6))



#使用 lambda 匿名函式

mul = lambda a,b : a*b
print("使用lambda匿名函式執行結果= ",mul(5,9))



#執行結果 ..

使用def具體函式執行結果=  48

使用lambda匿名函式執行結果=  45




三、程式說明:

在 Python 程式語言中提供了一個 lambda 的指令,讓我們可以藉此來建立簡單的匿名函式,也就是稱作沒有名稱的函式,如同上面的程式範例是將 lambda 運算式所產生的匿名函式指定給變數 mul,而這個匿名函式會傳回兩個參數 a 和 b 相乘的結果。

2025年7月19日 星期六

Python 多載

 一、主題介紹:

Python 中,講到方法多載是在類別裡使用相同的方法名稱,但參數的數量不同,當建立物建後調用類別方法就會根據不同的參數數量來選擇執行哪個方法。不過,Python 並不支援傳統意義上的方法多載 ( 像 Java,C++ 一樣 ),因為你在類別裡面定義多個相同名稱的方法,最後後面定義的方法會覆蓋前面的,雖是如此,但我們可以使用一種方式來模擬這個多載的功能。


二、應用程式:


class SelfIntroduction:
   
    def speak(self,name=0,sex=0,age=0):

        if name!=0 and sex!=0 and age!=0:
            print("我的名字是",name,",","是個",sex,",","今年",age,"歲","。")

        elif name!=0 and sex!=0:
            print("我的名字是",name,",","是個",sex,"。")

        else:
            print("我的名字是",name,"。")
   

people = SelfIntroduction()

people.speak("Joe")

people.speak("Andy","男生")

people.speak("Mary","女生",18)


#執行結果 ..

我的名字是 Joe 。

我的名字是 Andy , 是個 男生 。

我的名字是 Mary , 是個 女生 , 今年 18 歲 。



三、程式說明:

在程式中使用了巧妙方法,將每個參數預設值為 0,然後透過參數為 0 的數量來判斷該執行哪個列印程式,建立物建後調用相同類別方法,使用不同參數的數量就可以表現出具有多載功能的物件導向程式設計了。


2025年7月18日 星期五

Python 多型

 一、主題介紹:

多型是物件導向設計多項功能的其中之一,多型式是指當有不同的物件收到相同的訊息時,就會以各自類別的方法來處理。例如:書就有分漫畫書、電腦書、小說...等,如果使用相同的函式不論給予什麼種類的書,它會自己選擇相對應類別的方法來執行程式,這就叫做『多型』。


二、應用程式:


#類別
class Cartoon:
    def display(self):
        print("我讀一本漫畫書。")

class Computer:
    def display(self):
        print("我讀一本電腦書。")

class Novel:
    def display(self):
        print("我讀一本小說。")

#函式
def book(name):
    name.display()

#物件實體化
cartoon = Cartoon()
computer = Computer()
novel = Novel()

#多型
book(cartoon)
book(computer)
book(novel)


#執行結果

我讀一本漫畫書。

我讀一本電腦書。

我讀一本小說。


三、程式說明:

從程式中就可以看出一開始建立三個不同的類別來代表三種不同的書籍,每個不同的類別有相同的方法,但它們的方法都各自執行不同的程式內容,並透過函式來建立多型的功能,利用物件實體化後使用相同的函式,不同的參數 "書名",就可以自動選擇相對應類別的方法,顯示是讀取哪一本書。

2025年7月17日 星期四

Python 類別方法

 一、主題說明:

是在類別裡面使用的方法,其定義的方式即是在方法前面加上裝飾器 @classmethod,這樣就可以完成定義函式為類別方法,而它的第一個參數則必須使用 cls 來表示類別本身。

類別方法可以透過兩種方式來調用,第一種是直接使用類別名稱,不需要宣告物件實體才可以使用;另一種是透過宣告物件實體調用類別方法的函式。

而類別方法與實體方法及靜態方法的差別在哪裡呢?

類別方法:第一個參數代表類別本身,可以使用類別名稱或實體宣告來調用,亦可取得或修改類別屬性。

實體方法:第一個參數 self 代表實體本身,可以使用實體宣告來調用,亦可取得或修改實體屬性。

靜態方法:第一個參數沒有特別規定,可以使用類別名稱或實體宣告來調用,同一般的函式與類別及實體沒有關聯。


二、應用程式:


class test:

    name = "andy"

    def __init__(self,age):
        self.__age = age

    def data1(self):
        print(self.name,"的年齡是",self.__age,"。")

    @classmethod
    def data2(cls,age):
        print(cls.name,"的年齡是",age,"。")

    @staticmethod
    def data3(name,age):
        print(name,"的年齡是",age,"。")


#建立實體方法
A = test(33)
A.data1()

#建立類別方法
test.data2(55)
#或
A.data2(66)

#建立靜態方法
test.data3("Mary",77)
#或
A.data3("Joe",88)


#執行結果

andy 的年齡是 33 。

andy 的年齡是 55 。

andy 的年齡是 66 。

Mary 的年齡是 77 。

Joe 的年齡是 88 。



三、程式說明:

有效的應用類比方法可以提高程式結構性的優勢及後續程式維護的方便,所以必須花時間了解才能提升撰寫物件導向程式的能力。






2025年7月16日 星期三

Python 靜態方法

 一、主題介紹:

靜態方法是不需要實例化物件就能直接被呼叫使用,在類別程式中於函式前面加上 @staticmethod 這個指令,即是宣告此函式是使用靜態方法,靜態方法的參數不需要使用 self  來傳入類別本身,它目的是要將與類別有邏輯相關的函式放入類別中,提高程式的結構性,而且還可以避免與其它函式命名上互相衝突,順便也提高了後續程式維護上的方便性與可讀性。


二、程式範例:


    class Myapp:
   
        def __init__(self,name,age):
            self.__name = name
            self.__age = age
   
        def setName(self,n):
            self.__name = n

        def setAge(self,a):
            self.__age = a

        def getName(self):
            return self.__name
   
        def getAge(self):
            return self.__age
   
        @staticmethod    #靜態方法
        def people(name,age):
            print(name," 的年齡是 ",age,"歲 !")
   


    #靜態方法不需要實例化可以直接使用
    Myapp.people('Mary',18)

    #實例化類別
    A = Myapp('Andy',53)
    print(A.getName()," 的年紀是 ",A.getAge(),"歲 !")

    A.setName('Joe')
    A.setAge(89)
    print(A.getName()," 的年紀是 ",A.getAge(),"歲 !")


#執行結果

Mary  的年齡是  18 歲 !

Andy  的年紀是  53 歲 !

Joe  的年紀是  89 歲 !


三、程式說明:

使用靜態方法 @staticmethod 可以將不屬於類別的函式整合到類別裡面,可以物件實例化或不用實例化就可以使用靜態方法,這在撰寫物件導向程式設計時非常有用。


2025年7月15日 星期二

Python 檔案存取

 一、主題說明:

程式運作中的資料不論是數據或字串,只要電腦一關機所有資料就會消失不見,所以將資料儲存至檔案是必須的,這樣才能將重要資料長期的儲存,當需要時再讀取檔案資料,後面我們將使用前面講過的類別來建立儲存與讀取檔案的功能。


二、應用程式:


class AccessFile:

    def __init__(self,file):
        self.__file = file

    def readFile(self):
        f_obj = open(self.__file,"r")
        f_content = f_obj.read()
        f_obj.close()
        return f_content
   
    def writeFile(self,wdata):
        f_obj = open(self.__file,"w")
        f_obj.write(wdata)
        f_obj.close()
     

file = "data.txt"
data = "資料寫入檔案內"
A = AccessFile(file)
A.writeFile(data)
read_data = A.readFile()
print(read_data)

#執行結果

(1) 螢幕顯示..

資料寫入檔案內

(2) data.txt 檔案內資料..

資料寫入檔案內


三、程式說明:

open(file,mode)

file : 標示要存取的檔案,當然要包含路徑及名稱,如果沒有標示路徑只標示名稱,那就會依與主要程式檔案相同路徑存取檔案。

mode : 設定檔案物件的模式,如下..

"r" : 讀取檔案模式

"w" : 清除原內容並寫入模式

"a" : 於檔案結尾附加寫入模式

TQC+ Python 證照考題評量(五十四) - 平均溫度

 一、主題介紹: 資料庫中的一堆數據資料,時常需要這些資料的平均值、最大值、與最小值,作為分析資料的依據,如能透過寫程式讓它們自動化就能增加效率,就來看看今天的 TQC+ 考題的練習。 (1) 題目 請撰寫一程式,讓使用者輸入四週各三天的溫度,接著計算並輸出這四週的平均溫度及最高...