模塊基礎小結

1、爲何要有模塊

麪條版代碼--》函數版代碼--》文件版代碼(模塊)--》文件夾版(包)markdown

代碼會變得更加簡潔,清晰,模塊化app

一個模塊裏會有多個函數,至關於一個大功能細分紅多個小功能模塊化

  1. 自定義模塊
  2. 第三方模塊,如requests
  3. 內置模塊,如time
  4. 包(文件夾)

2、import 與 from...import...

markdown_add_index.py

import time 

1. 打開time文件
2. 使用Python解釋器運行time文件,而後把解釋文件獲得的名字放入time模塊的名稱空間
3. test.py中會有一個time變量指向time模塊的名稱空間,若是導入方式爲`import time as t`,則就是t變量指向time模塊的名稱空間

from time import sleep

1. 打開time文件
2. 使用Python解釋器運行time文件,而後把解釋文件獲得的名字放入time模塊的名稱空間
3. test.py中會有一個sleep變量指向time模塊名稱空間中的sleep,若是導入方式爲`from time import sleep,localtime`,則是由一個sleep變量和一個localtime變量指向time模塊名稱空間中的sleep和localtime

3、循環導入問題

# m1.py
from m2 import y
x = 10

# m2.py
from m1 import x
y = 20

爲何會有循環導入問題:函數

  1. m1文件須要導入m2文件的y
  2. m2文件須要導入m1文件的x
  3. 代碼自上而下運行,m1須要m2的y,而後會去m2的名稱空間找到y,可是找y前,須要運行m2的代碼,m2的代碼第一句是去找m1的x,而後又回去運行m1的代碼,m1的第一行代碼又是去尋找m2的y
  4. 就是說m1只能運行第一行,m2也只能運行第一行,因此出現了循環導入問題

3.1 解決方案一

# m1.py
x = 10
from m2 import y


# m2.py
y = 20
from m1 import x
  • 可是這樣作,對全部的變量都須要這樣作,才能解決問題,因此治標不治本的

3.2 解決方案二

# m1.py
def f1():
    from m2 import y
x = 10


f1()


# m2.py
def f2():
    from m1 import x
y = 20


f2()

名字的執行順序:內置(python解釋器啓動的時候)-->全局(文件執行的時候)-->局部(函數調用的時候)code

4、模塊的搜索路徑

1.去內存中找內存

# test.py
import m1  # 從m1.py文件中導入的,而後會生成m1模塊的名稱空間
import time

# 刪除m1.py文件,m1模塊的名稱空間仍然存在

time.sleep(10)

import m1  # 不報錯,必定不是從文件中獲取了m1模塊,而是從內存中獲取的

2.去內置模塊中找requests

# time.py
print('from time')

# test.py
import time  # 無任何打印,因此他先去內置模塊中找了

3.環境變量中找it

import sys

print(sys.path)
# b/a/m1.py

# b/test.py
import m1  # 報錯

sys.path.append('b/a')
import m1

5、Python文件的兩種用途

  1. 模塊文件,被當作模塊給導入,有多個
  2. 運行文件,被當作執行文件執行,只能有一個
  • 搜索路徑以執行文件爲基準
# m1.py
def f1():
    print('from f1')
    
f1()

# test.py
import m1

m1.f1()  # 運行兩次
  • __name__
# m1.py
def f1():
    print('from f1')
    
if __name__ == '__main__':  # __name__在m1.py被當作模塊導入時是模塊名,做爲執行文件時是'__main__'
    f1()
    

markdown_add_index.py
import m1

m1.f1()  # 運行兩次

6、包

  • 模塊太大了,合理的分配模塊的函數
# m1.py
f1
f2
f3
f4

# m2.py
f1
f2

# m3.py
f3
f4
  • 因此得用文件夾管理,文件夾命名爲m1,導入m1就是導入m1中的__init__
相關文章
相關標籤/搜索