yenchialu
傳統程序導向
資料是靜態的,程序跟資料分開,主要思考是以function為主要思考模式,我給定資料、寫好方法,程式會返回另一筆靜態資料。我在將資料放到下一個function。
優點是直觀、易於開發。缺點是,完全不能重複使用,也不太能擴增,要新的功能或者是要別的已開發好的程式的功能都無法,都得重新設計,這也導致維護很困難,也許寫新的都會比較快。
物件導向程式設計(Object-oriented programming,簡稱OOP)
這裡小提一下什麼是物件導向,是以物件為主要概念的開發模式,相較於傳統程序導向提高了重複使用性、擴充與維護性。
在物件導向中導入了物件的概念,而這個物件並非只是靜態資料,他能參有自己的屬性以及方法。
那物件怎麼創造呢?就是用一個抽象的方法 class ,他像一張產品設計圖,我在設計圖內寫下了它的設計方法,裏面包含了我設計的產品有什麼基本的零件與功能、以及使用者能夠如何使用或者擴增產品的功能。我並不是真的製作了一個產品,而是做出了一張設計圖給大家使用,大家能參照設計圖設計出自己獨立的物件。
而相較於傳統程序導向的缺點
- 物件設計較不直觀
- 程式執行速度相對也較慢
物件導向的三大特點 : 繼承、封裝、多型
物件導向的三大特點 : 繼承、封裝、多型
特性一. 繼承 (inheritance)
有許多的功能其實早就已經寫好,物件導向的程式設計能夠將別的已經寫好的屬性與方法繼承自己開發中的類別裡,不用再重複撰寫那些已有的功能。
特性二. 封裝 (encapsulation)
我們建立好class後,以後的使用者只須如何使用即可,不需了解整個物件製造的架構或設計過程。
特性三. 多型 (polymorphism)
不同的類別裡,能擁有同樣名字的函式。
所以做出來的物件呼叫相同名字函式時,會回溯到各自類別的函式名稱,而有不一樣的結果。
Perceptron 為 Rosenblatt 提出第一個單元神經網路模型。
架構包含連結權重與激發函數的應用。
此模型基於 1943 年 McCulloch 與 Pitts 所提出的神經元模型,模擬了腦部神經架構以數學的方式解釋,其中並引入激發狀態概念”all ornone”,提出了許多連結性資訊傳遞在有激發函數下的討論。

#範例 1
def a(x,y) :
return x+y
if __name__ == "__main__" :
a(x,y)
程式碼第三行,__name__ == “__main__“到底該怎麼理解 ? 本文將慢慢解析
什麼是name?
__name__是一個內置屬性,當你訪問__name__時,會回覆你當前文件(模組)或者引入的模組名稱。
#範例 2-1
print(__name__)
執行結果
>>> __main__
上面的程式,詢問執行中的文件,名字(__name__)是什麼?程式回傳名稱__main__
python對於自己執行的主程式,會用__main__來自稱。
如果匯入模組,訪問其名字,則會回傳模組名稱。
#範例 2-2
import numpy as np
print (np.__name__)
# >>> numpy
print (np.random.__name__)
# >>> numpy.random
什麼是main?
如上段提到,訪問__name__時,他會回覆你所使用的模組的名稱。
如果直接訪問,會回傳當前程式(主程式)的資訊,但不會用模組名(或說.py檔名、當前程式名稱),而是會用__main__自稱。見範例程式 2-1。
if __name__ == “__main__” 是什麼意思 ?
可以程式使用口語翻譯理解這句話
” 如果 模組名稱 就是 “__main__”的話,…… “
意思是如果執行模組時,他是當作主程式進行的話(而不是被引入的模組),就執行if後的內容。
我們寫的.py檔有時會當主程式運行,有時會被當模組引入。
如果沒這個條件句寫在程式內,在import引入會遇到一些問題,我只是想引入一些def方法而已,但程式會把所有的內容執行完。
範例 3-1是被引入的模組 bar.py,範例 3-2是主要執行的程式 foo.py
#範例 3-1
#被引入的模組 bar.py
def test1():
print ("被引入的模組名稱",__name__)
test1()
print("今天要偷買珍珠奶茶")
#範例 3-2
#主要執行的模組(文件) foo.py
import bar
def test2():
print ("主程式名稱",__name__)
test2()
bar.test1()
執行範例3-2的執行結果
>>> 被引入的模組名稱 bar #在import那行執行了test1(),因為被引入了所以變成 bar
今天要偷買珍珠奶茶 #在import那行,執行了print()
主程式名稱 __main__ #主程式執行test2()
被引入的模組名稱 bar #主程式引入模組bar的test1執行,因為被引入了所以變成 bar
以上範例,討論最後的兩個結果,但因為引入模組有其他零碎的程式碼,所以會被跑出很多我不需要的東西。
那解決的思維就是,bar.py這個檔案
- 當作主程式(當前程式)執行時,才希望有”今天要偷買珍珠奶茶”的字串以及test1()的執行。
- 當作主程式(當前程式)執行時,才希望有”今天要偷買珍珠奶茶”的字串以及test1()的執行。
那該如何實現,這時就要用到 if __name__ == “__main__” ,這個判斷式的口語意思是 判斷當前檔案是否為主程式,主程式的__name__都是”__main__“,如果是引入的話__name__就是檔名。
所以上方程式碼就該修改為下面示範,即能達到效果
#範例 4-1
#被引入的模組 bar.py
def test1():
print ("被引入的模組名稱",__name__)
if __name__ == "__main__" :
test1()
print("今天要偷買珍珠奶茶")
執行結果
>>> 被引入的模組名稱 __main__
今天要偷買珍珠奶茶
引用”愛學習的豆包“的文章圖示與範例,展示模組運行命名流程
狀況1 : 直接執行指令碼
#被引入的模組 bar.py
def test1():
print ("被引入的模組名稱",__name__)
if __name__ == "__main__" :
test1()
print("今天要偷買珍珠奶茶")

狀況2:從其他腳本里匯入
import nameScript as ns
ns.myFunction()

問題回顧
- __name__是什麼 ?
- __main__是什麼?
- 如何理解 if name == “main” :
什麼是模組 ?
其實模組(Modules)跟一般的文檔一樣,但裡面主要不是拿來當作主程式執行,而是當作各種函式的文件來調用的文檔。
將相關類似的功能整理到一個文件檔裡,我們能稱呼這個檔為模組。
函式像是打造一個小工廠,將生產流程設計好,在未來只要給原料,便能生產成品。
我們將需要的計算過程設計打包成函式,在未來需要相同計算時,只要調出函式,輸入參數,便能輸出返回數據。
不同於while需要計數進行迴圈,for迴圈主要是針對一個範圍裡的逐一項目進行迴圈。
什麼是一個範圍,以下是舉4個常見範例
- str
- range(0,1000)
- list
- tuple
- set
迴圈
情境設定 : 請做出一個list,裡面是0~10
#方法 1 : 直接輸入
A = [0,1,2,3,4,5,6,7,8,9,10]
#方法 2 : 迴圈
i=1
A=[]
while i<=0:
A.append(i)
在方法二中,用迴圈的方式看似有點複雜,但如果今天的list裡面包含的值如果是0~1000,迴圈的方式就簡單許多了。
什麼是迴圈
迴圈目的在簡化我們做的重複動作,如果有上萬步的重複動作,我們都能簡化到迴圈裡,用一個步驟寫完,但電腦執行時,會將我們的步驟重複萬次。
迴圈有兩種表示法,本文會側重在while迴圈
- while 迴圈
- for 迴圈
#生成一個包含0~10000的list
#方法1 : 直接輸入 -> 放棄
#方法2 : while 迴圈
i=1
A=[]
while i<=0:
A.append(i)
#方法3 :for 迴圈
for i in range(10001) :
A.append(i)
條件句,一但有了條件選擇,程式就能針對不同的情境作出複雜多變的邏輯判斷與輸出,這也讓程式能有更複雜的應用。
以下是Python 支持數學中常見的邏輯條件:
- 等於:a == b
- 不等於:a != b
- 小於:a < b
- 小於或等於:a <= b
- 大於:a > b
- 大於或等於:a >= b
布林值就是一個是非判定的值,僅有兩種陳述方式 True 或 False。
常用於程式語言需要有判斷或比較選項時使用。
print(100 > 9.0)
print(100 == 9.0)
print(100 < 9.0)
# >>> True
False
False
