2017年5月22日 星期一

[Python] "From ... Import "和 Import的差別

Python內的"From ... Import"和import都是使用module的方式。Python內的module指的就是檔案,只不過這個檔案內有許多的宣告和實作。每個module都有自己的function,他們都存在獨立的symbol table內。

不過import方式有許多種,底下就用官方的例子來說明"From ... Import"和 "Import"的不同,底下的code實作兩個function,並存在 fibo.py內

# Fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print b,
        a, b = b, a+b

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result


  • 如果使用"Import"來使用module時,會保留獨立的symbol table,所以就不用擔心function name衝突的問題。但碼農們就必須清楚告訴python 直譯器是使用哪一個function

>>> import fibo
>>> fibo.fib(1000) 

此時可以使用dir() 來查看模組名稱
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'fibo']

繼續查詢fibo,可以發現裡面有 fib和 fib2這兩個function
>>> dir(fibo)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'fib', 'fib2']
  • 如果使用"from fibo import fib"來使用module時,會將被匯入的function (fib)加入目前module的symbol table,所以就可能造成名稱衝突的問題,請小心使用。但是好處就是打的字比較少
>>> from fibo import fib, fib2
>>> fib(500)

此時可以使用dir() 來查看模組名稱,可以清楚看到沒有fibo這個名稱
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'fib', 'fib2']


參考資料:https://docs.python.org/2/tutorial/modules.html







1 則留言: