Python-模塊導入

什麼是模塊?

模塊就是py文件,一堆函數的集合體。dom

實現一些功能,使代碼邏輯更清晰函數

使用 import 和 from...import...導入code

模塊的四種形式

  1. 內置模塊--》python解釋器啓動自帶的模塊,time/random/os/sys
  2. 自定義模塊--》自定義代碼
  3. 第三方模塊--》pip install jieba
  4. 包(模塊)

import 模塊名

import sleep排序

導入多個模塊 :ip

import time, os, sys內存

使用:utf-8

time.sleep(1)作用域

導入time模塊解釋器發生的三件事情:get

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

from... import...

from time import sleep

導入多個方法 :

from time import sleep, time

from time import *

使用:

sleep(1)

導入time模塊解釋器發生的三件事情:

  1. 開闢time內存空間
  2. 把time.py中全部代碼讀入名稱空間並運行代碼
  3. 把sleep()讀入當前文件中,能夠直接使用方法名

二者比較

相同點:

  1. 二者都會執行模塊對應的文件,都會產生模塊的名稱空間
  2. 二者調用功能時,都須要跑到定義時尋找做用域關係,與調用未知無關

不一樣點:

import 須要加模塊名前綴,from...import...不須要加

import from...import...
優勢 變量名發生衝突概率小 調用方便
缺點 調用麻煩 變量名發生衝突概率大

自定製模塊的注意點

__all__ = ["a","f1"]
在使用from test2 import *導入模塊的時候,

在被導入的模塊中文件頭添加如上代碼,表示只能使用被導入的模塊的方法。其餘導入方式對此方法失效

# cat test1.py

# coding=utf-8
from test2 import *
print(a)        # 正常調用
# 1

f1()        # 調用報錯      
# NameError: name 'f1' is not defined
# cat test2.py

# coding=utf-8
__all__ = ["a",]    # 限制只能使用 a 變量

a = 1
def f1():
    print("from f1")

循環導入問題

演示一個現象:

# cat m1.py

# coding=utf-8
from m2 import y
x = 1
print("m1111111:",x,y)
# ImportError: cannot import name 'y'

# 建立m2的名稱空間
# 執行m2.py,將執行產生的名字丟到m2.py
# 在當前文件中拿到m2.x
# cat m2.py

from m1 import x
y = 2
print("m2222222:",x,y)
# ImportError: cannot import name 'x'

# 建立m1的名稱空間
# 執行m1.py,將執行產生的名字丟到m1.py
# 在當前執行文件中拿到m1.y

上述狀況:

m1.py執行,產生m2的名稱空間,m2.py並運行代碼,遇到import語句產生m1的名稱空間,名稱空間在內存中只產生一次,而後運行下面的代碼,m1定義變量x = 1 print("m1111111:",x,y),發現找不到y的變量 因此報錯,m2.py運行結果亦是如此。

解決方案一:

將變量寫在文件開頭

# cat m1.py
# coding=utf-8
x = 1
from m2 import y
print("m1111111:",x,y)

# cat m2.py
# coding=utf-8
y = 1
from m1 import x
print("m2222222:",x,y)

解決方案二:

將導入模塊代碼包在一個函數裏,函數執行只檢測語法,不執行代碼

# cat m1.py
# coding=utf-8
def m1():
    from m2 import y
    print("m1111111:", x, y)
x = 1
m1()


# cat m2.py
# coding=utf-8
def m2():
    from m1 import x
    print("m2222222:", x, y)
y = 1
m2()

上述問題我以爲在座的聰明絕頂的人不會犯這種錯誤,演示代碼只不過是演示這種現象,之後萬一出現了知道怎麼回事。

模塊的搜索路徑

以前咱們講過變量名的搜索路徑是 從當前位置--》局部--》全局--》內置

那麼模塊的搜索路徑是什麼呢?好比說咱們自定義了一個和內置模塊名字同樣的模塊會先去哪裏找呢?

# coding=utf-8
import time
'''
內存
內置
自定義
'''

import test     # 自定義一個test模塊並導入

print(test.a)   # 正常使用模塊內的方法
time.sleep(10)  # 爲了驗證內存 和 自定義模塊的順序,可讓程序睡會~   期間咱們把test.py文件刪掉再看現象
print(test.a)   # 發現還能繼續打印,也就是說還在內存中
# 那麼搜索順序能夠先排序:
# 內存 --》 自定義





import requests     # 使用內置模塊

print(requests.get("http://www.baidu.com"))
time.sleep(10)      # 依然程序睡眠時間,刪除requests模塊

print(requests.get("http://www.baidu.com")) # 發現還能繼續打印,也就是說還在內存中
# 那麼搜索順序能夠先排序:
# 內存 --》 內置


# 最後模塊搜索順序:
# 內存 --》 內置 --》 自定義

Python文件的兩種用途

  1. 當作文件執行
  2. 當作模塊導入
def run():
    print("run....")

if __name__ == '__main__':
    run()
    
# 噹噹前文件爲模塊文件導入時,__name__等於文件名,#__name__ == '__main__'不成立(__name__ != '__main__)',因此不會運行下面的函數


# __name__是每一個文件獨有的,當該文件做爲執行文件運行時,__name__等於'__main__';當該文件做爲模塊文件導入時,__name__等於文件名
相關文章
相關標籤/搜索