Python学习day16-模块基础
<!doctype html>day16 - 博客
Python學習day16-模塊基礎模塊的四種形式import和from…import循環導入模塊的搜索路徑Python文件的兩種用途
Python學習day16-模塊基礎
模塊的四種形式
模塊的本質其實就是一個py文件,該文件里有很多寫好的函數和特殊的規則。模塊常見的四種形式如下:
import和from…import
其實我們大致可以把整個Python看成是一個手機,而pip就是手機的應用中心,(蘋果的App Store),而模塊就相當于通過應用中心安裝的程序。import和from…import就是用來導入這些模塊的。
-
import期間發生的事情(假設導入time模塊)
- 生成一個名為time的名稱空間
- 運行導入的time.py文件,然后把time.py文件內的名稱空間放入生成的新的名為time的名稱空間內
- 把time的名稱空間導入import(當前導入time模塊的文件)的名稱空間內,之后我們就可以通過調用time的內置方法的方式來調用該模塊里的函數。 xxxxxxxxxx 3 1 import time 2 print(time.time()) 3 # 調用的時候需要先寫模塊名字,然后.出來所用方法
-
from…import期間發生的事:(用導入time模塊的gmtime函數來舉例)
- 同樣是生成一個叫做time的名稱空間
- 運行time.py文件,然后把time.py內的名稱空間放入time的名稱空間內。可以說前兩步和import完全一樣,不同點在第三步。
- 把time名稱空間內的gmtime方法指向from…import(當前導入的模塊)的名稱空間,也就是說只是把gmtime的指向變了,并沒有把time內全部的方法導入進來。 xxxxxxxxxx 12 1 from time import gmtime 2 print(gmtime()) 3 # 用from...import導入的函數調用時候不必加模塊名就可以直接調用,更加方便,但是也會產生函數名重復的問題。 4 # 另外還有 5 from time import * 6 # 上述導入就是導入的time里面所有的函數,或者說所有的方法,雖然調用時候比較方便,但是不推薦這種做法,因為一次性導入函數過多會導致調用時候函數名發生沖突。 7 ? 8 # 其實有一種解決辦法,就是解決導入* 的方法 9 # 在time.py文件里寫入__all__,其功能就是在用from time import *時會限制,只會導入__all__里面有的函數,別的函數并不會導入到當前文件夾內 10 __all__ = ['time','gmtime'] 11 gmtime() 12 time()
- 兩者都會執行導入的模塊文件,并產生同名的模塊名稱空間
- 兩者調用模塊內函數的時候,都需要跑的定義的時候尋找作用于關系,與其調用的位置無關。
- import需要加前綴,也就是模塊名,from…import不需要加前綴
?
總結下來兩者導入的異同就是:
相同點:
不同點:
循環導入
循環導入其實就是兩個模塊相互導入,其實這是一種非常不好的導入方式,很容易造成程序報錯和變量定義找不到,所以盡量不要使用,但是如果遇到,知道解決方法即可。比如以下示例:
xxxxxxxxxx 4 1 # m1.py 2 from m2 import x 3 y = 20 4 print(x) xxxxxxxxxx 4 1 # m2.py 2 from m1 import y 3 x = 10 4 print(y)兩個文件無論運行哪個都會報錯,如果運行m1.py,會報:
ImportError: cannot import name 'x'
如果運行m2.py,會報:
ImportError: cannot import name 'y'
這里提供一種比較好的解決方案,但實際上即便這樣,整個模塊文件看起來還是不舒服。
x 1 # m1.py 2 def func(): 3 from m2 import x 4 print(x) 5 y = 20 6 ? x 1 # m2.py 2 def func1(): 3 from m1 import y 4 print(y) 5 ? 6 ? 7 x = 10 8 ?這樣文件執行下來就不會報錯,但是把導入語句放在函數里總覺的哪里怪怪的,所以大家以后不要寫這種循環導入就好了,沒有特別實際的意義。
模塊的搜索路徑
前面我知道,模塊其實就是一個py文件,所以要導入模塊的時候我們一定要能找到這個模塊的路徑,通常情況下模塊會和執行文件在同一個文件夾下,但是如果不在同一個文件夾,我們就需要執行模塊的路徑。
導入模塊的時候查找模塊的順序:
?
Python文件的兩種用途
Python文件的兩種主要用途如下:
腳本,也可以說是執行文件,一個文件就是整個程序,用來被執行
模塊,文件中存放著一堆功能,用來被導入使用
兩種用途是相對的,不是絕對的,也就是說一個文件,如果用來執行,那么他就是腳本,也就是執行文件,如果是用來作為模塊導入使用的話,那么他就是模塊。
還有一個我們在大佬們的程序中通常能看到的東西
x 1 # m1.py 2 if __name__ =‘__main__’: 3 ? ?pass一般在一些大的項目的執行文件里第一句都會是這個,這句話其實就是個判斷,判斷當前文件是執行文件還是模塊文件。比如在m1.py中寫入這兩行代碼。
當m1被當做執行文件運行時,__name__ ='__main__'
當m1被當做模塊導入的時候,__name__ =m1
所以當判斷當前文件是執行文件的時候項目才會運行,也就是為什么一些大的項目的執行文件第一句話會是這個判斷。
?
轉載于:https://www.cnblogs.com/Xu-PR/p/11358304.html
總結
以上是生活随笔為你收集整理的Python学习day16-模块基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 判断手机是否输入表情
- 下一篇: Pycharm如何在控制台输出窗口中使用