iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 13
0
Software Development

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

[Day 17] name? main? if __name__ == '__main__' ? 兩眼一抹黑啊...


今天大家過得好嗎?昨天加班加到崩潰嗎?
我們今天還是要來學習Python 喔!
讓我們來看看昨天的作業

利用Divide And Conquer Algorithm 來完成計算組合數C(m,n):

想法:
利用二項定理C(m,n)=C(m-1,n)+C(m-1,n-1)

def C(m,n):
    if n==0 or m==n:
        return 1
    elif n==1:
        return m
    else:
        return C(m-1,n)+C(m-1,n-1)
print(C(10,3)) #output:120
print(C(25,10)) #output:3268760

有時候我們會看到下面這個寫法

def difage(m,n):
#計算兩人的年紀差
    diff=abs(m-n)
    return diff
    
def sumage(m,n):
#計算兩人的年紀和
    tot=abs(m+n)
    return tot

#print(difage(62,30))
if __name__  == '__main__':
    print(difage(62,30))

我想你可能會發現如果把print(diff(62,30))的註解拿掉,而把下面的兩行(if ....到結束)註解掉,會有相同的結果!

if name == 'main'有什麼作用嗎?

不知道眼尖的你有沒有發現__name__好像是一個變數,所以我們先從這裡開始,
我們來看看下面的例子:

def difage(m,n):
    diff=abs(m-n)
    return diff
  
print('This __name__ is '+__name__)

if __name__  == '__main__':
    print(difage(62,30))

執行後如下:

>>> python age_1.py
This __name__ is __main__
32

執行後你會發現print(__name__)會回傳'__main__',所以當if成立後,就會往下執行。那我們將這個檔案命名為age_1.py。

我們另外寫一個程式如下命名為,age_2.py,執行後仍然會與age_1.py最後執行的結果一樣。

def difage(m,n):
    diff=abs(m-n)
    return diff
  
print('This __name__ is '+__name__)
print(difage(62,30))

所以有沒有「if name == 'main'」根本沒差啊!

但真的是這樣嗎?

我們來看看下面兩個程式碼main_1.py和main_2.py

# main_1.py
from age_1 import difage
print('In main, the __name__ is '+__name__)
print(difage(50,30))
# main_2.py
from age_2 import difage
print('In main, the __name__ is '+__name__)
print(difage(50,30))

以下為執行結果:

>>> 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

什麼!結果居然不一樣了!

沒錯!這就是為什麼要有「if name == 'main'」!

但我們今天就到這裡了!
其他我們留待明天說明啦!


上一篇
[Day16] 遞迴與分而自治
下一篇
[Day18]如果__name__ 好好用
系列文
從0開始學習程式-Python32

尚未有邦友留言

立即登入留言