iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 14
0
Software Development

從0開始學習程式-Python系列 第 15

[Day18]如果__name__ 好好用


再撐一下!明天就是星期五了!

回顧一下昨天的執行結果:

>>> python main_1.py
This __name__ is age_1
In main, the __name__ is __main__
20
>>> python main_2.py
This __name__ is age_2
32
In main, the __name__ is __main__
20

結果不一樣!Why?

狀況 1:

若只有執行age_1.py或者age_2.py時,此時__name__會被指定為'__main__',所以當滿足下面的if時,就會往下執行。

狀況 2:

若執行python main_2.py時,會import age_2.py,此時主要的執行程式是python main_2.py,所以在主程式中的__name__會被指定為'__main__',然而在age_2.py中的__name__會被指定為'age_2',然而可以發現,因為在age_2.py中缺乏「if __name__ == '__main__'」,因此不管如何,只要主程式call age_1時,裡面的每一行都會執行一次,造成回傳的結果會包含print(difage(62,30))這個結果後,才會執行print(difage(50,30))

狀況 3:

若執行python main_1.py時,會import age_1.py,此時主要的執行程式是python main_1.py,所以在主程式中的__name__會被指定為'__main__',然而在age_1.py中的__name__會被指定為'age_1',然而可以發現,因為在age_1.py有「if __name__ == '__main__'」可以控制age_1.py的執行,因此當主程式call age_1時,即使每一行都會執行一次,但並不會執行print(difage(62,30))這個結果,而只會執行主程式的print(difage(50,30))

那為什麼要有if name == 'main'?

在於獨立撰寫一些funtion時,可以直接執行funtion看其能不能work,功能是否正常。然而這一個function實際上是要給一個大的主程式所使用,若每一次都要檢查function能不能work,功能有沒有正確,都要執行main,是一個費時又費力的過程,若能直接執行funtion檢查功能是否正常,相對有效率!

簡言之,我們透過「if name == 'main'」來控制funtion,可以將測試資料放在「if name == 'main'」的階層下,當單純執行function的執行檔時,則會利用測試資料檢測其功能;當利用main呼叫function操作時,就不會執行測試資料!只會直接執行main所想代入之變數,傳到function運算後將結果回傳給main!

如果寫一個大的程式,且要call很多funtion,if __name__ == '__main__'絕對是你的好碰油

好啦~今天就講到這啦~


上一篇
[Day 17] name? main? if __name__ == '__main__' ? 兩眼一抹黑啊...
下一篇
[Day19]Hey! lambda 你在搞什麼?
系列文
從0開始學習程式-Python32

尚未有邦友留言

立即登入留言