python 模塊學習

爲何要有模塊

麪條版代碼-->函數版代碼-->文件版代碼(模塊)-->文件夾版(包)
代碼會變得更加簡潔,清晰,模塊化
一個模塊裏會有多個函數,至關於一個大功能分紅多個小功能
1.自定義模塊
2.第三方模塊,如requests
3.內置模塊,如time
4.包(文件夾)app

import 與from...import...

#test.py

import time

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

from time import sleep

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

循環導入問題

# m1.py
from m2 import y
x = 10

# m2.py
from m1 import x
y = 20

爲何會有循環導入問題模塊化

1.m1文件須要導入m2文件中的y函數

2.m2文件須要導入m1文件的xcode

3.代碼自上而下運行,m1須要m2的y,而後會去m2的名稱空間找到y,可是在找y以前,須要運行m2的代碼,m2的代碼第一句是去找m1的x,而後又回去運行m1的代碼,m1的第一行代碼又是去尋找m2的yblog

4.就是說m1只能運行第一行,m2也只能運行第一行,因此出現了循環導入問題內存

解決方案一

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

f1()

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

f2()

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

模塊的搜索路徑

1.去內存中找it

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

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

time.sleep(10)

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

2.去內置模塊中找class

# time.py
print('from time')

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

3.環境變量中找

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

#b/test.py
import m1 #報錯

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

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()
    
# test.py
import m1

m1.f1() # 運行一次

直接運用老師的總結,對於後期回顧知識點很是好

相關文章
相關標籤/搜索