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







[Neural Networks] Keras有內建MNIST資料嗎?

剛安裝完Keras後,很快就會發覺沒有一個sample code附上data set,而安裝資料夾("lib/python2.7/site-packages/keras/")內的檔案大小都只有十幾KB。

仔細看完code後可以猜出來MNIST data set是從網路硬碟下載來的


原始example code:
https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py



from keras.datasets import mnist
from keras.models import Sequential

繼續往下追可以知道 "lib/python2.7/site-packages/keras/datasets/mnist.py"裡面是從AWS S3網路硬碟下載來的

path = get_file(path, origin='https://s3.amazonaws.com/img-datasets/mnist.npz')


下載完後,馬上將training data和test data取出
    f = np.load(path)
    x_train = f['x_train']
    y_train = f['y_train']
    x_test = f['x_test']

    y_test = f['y_test']