day 15

1. 模塊的四種形式

若是把 python 比做手機,pip就是手機的應用商店,模塊就是 手機裏的 App 。python

在Python中,總共有如下四種形式的模塊:函數

  1. 內置模塊:python解釋器內自帶的模塊(手機的系統 App )
  2. 自定義模塊:使用python編寫的xxx.py文件
  3. 第三方模塊:須要使用pip安裝的模塊(應用商店下載的 App )
  4. 包:把一系列模塊組織到一塊兒的文件夾(注:文件夾下有一個\_\_init\_\_.py文件,該文件夾稱之爲包)

2. 導入模塊的兩種方式

2.1 import 模塊名

import time # 導入 time 模塊
time.sleep(1) # 延時 1s

import 模塊名首次導入過程當中發生的三件事:code

  1. 開闢內存空間,內存空間命名爲time
  2. time.py中的全部代碼讀入名稱空間,而後運行
  3. 經過time.方法名使用time模塊中的方法

2.2 from 模塊名 import 具體的功能

from time import sleep
sleep(1)

from 模塊名 import 具體的功能首次導入過程當中發生的三件事:ip

  1. 開闢內存空間,內存空間命名爲time
  2. time.py中的全部代碼讀入名稱空間,而後運行
  3. 在當前執行文件中拿到一個sleep()模塊名

2.3 兩種方法的比較

  • 相同點:
    1. 二者都會執行模塊對應的文件,二者都會產生模塊的名稱空間
    2. 二者調用功能時,須要跑到定義時尋找做用域關係,與調用位置無關
  • 不一樣點:
    1. 使用導入模塊的方法時,import須要加前綴;from...import...不須要加前綴
    2. 使用 from...import...容易與當前執行文件中名稱空間中的名字衝突

3. 循環導入問題

理解核心:內存

導入文件時發生的三件事:作用域

  1. 以模塊爲準創造一個模塊的名稱空間(導入模塊,只會開闢一次內存空間)
  2. 執行模塊對應的文件,將執行過程當中產生的名字都丟到模塊的名稱空間
  3. 在當前執行文件中拿到一個模塊名

3.1 現象

假設有兩個文件 file1.py 和 file2.py :pycharm

# file1.py
from file2 import y

x = 'from file2'

print(y)
# file2.py
from file1 import x

y = 'from file2'

print(x)

對於以上兩個文件:it

若是運行 file1,運行結果:pip

ImportError: cannot import name 'y' from 'file2'

若是運行 file2,運行結果:class

ImportError: cannot import name 'x' from 'file1'

這種問題就是因爲循環導入引發的。

3.2 解決方案 1

# file1.py
x = 'from file2'

from file2 import y

print(y)
# file2.py
y = 'from file2'

from file1 import x

print(x)

對於以上兩個文件:

若是運行 file1,運行結果:

from file2
from file1
from file2

若是運行 file2,運行結果:

from file1
from file2
from file1

雖然解決了錯誤,可是獲得了三個結果,顯然不是咱們想要的內容。

3.3 解決方案2

利用函數定義階段只識別語法,不執行代碼的特性,將代碼寫進函數裏面

def file1():
    from file2 import y

    print(y)


x = 'from file1'

# file1()
def file2():
    from file1 import x

    print(x)


y = 'from file2'

# file2()

對於以上兩個文件:

若是運行 file1(須要調用f1)運行結果:

from file2

若是運行 file2(須要調用f2)運行結果:

from file1

這種方法能夠解決循環導入的問題,且達到了預期的輸出。

最好的解決方法是不要出現循環導入。

4. 模塊的搜索路徑

4.1 模塊的搜索順序

導入模塊時查找模塊的順序是:

  1. 先從內存中已經導入的模塊中尋找
  2. 內置的模塊
  3. 自定義模塊
  4. 環境變量sys.path中找

4.2 環境變量

print(sys.path)

打印結果:

# # 導入模塊的時候,解釋器會按照列表的順序搜索,直到找到第一個模塊
['(當前執行文件本身保存的位置)相對路徑下的當前目錄', '當前執行文件的根目錄', 'D:\\Program Files\\JetBrains\\PyCharm 2019.2.2\\helpers\\pycharm_display', 'D:\\Program Files\\Python\\Python37\\python37.zip', 'D:\\Program Files\\Python\\Python37\\DLLs', 'D:\\Program Files\\Python\\Python37\\lib', 'D:\\Program Files\\Python\\Python37', 'D:\\Program Files\\Python\\Python37\\lib\\site-packages', 'D:\\Program Files\\JetBrains\\PyCharm 2019.2.2\\helpers\\pycharm_matplotlib_backend']

5. python文件的兩種用途

5.1 執行文件

當前正在運行的文件

5.2 模塊文件

當 file1 導入 file2 ,運行file1 時,file2 就是模塊文件

當 file2 導入 file1 ,運行file2 時,file1 就是模塊文件

5.3 __name__

__name__ 是每一個文件獨有的,當該文件做爲執行文件運行時, __name__ 等於'main';當該文件做爲模塊文件導入時, __name__ 等於文件名。

相關文章
相關標籤/搜索