作者介紹:【孤寒者】—CSDN全棧領域優質創作者、HDZ核心組成員、華為雲享專家Python全棧領域博主、CSDN原力計劃作者
- 本文已收錄於Python全棧系列專欄:《Python全棧基礎教程》
- 熱門專欄推薦:《Django框架從入門到實戰》、《爬蟲從入門到精通系列教程》、《爬蟲高級》、《前端系列教程》、《tornado一條龍+一個完整版項目》。
- 本專欄面向廣大程序猿,為的是大家都做到Python從入門到精通,同時穿插有很多很多習題,鞏固學習。
- 訂閱專欄後可私聊進一千多人Python全棧交流群(手把手教學,問題解答);進群可領取Python全棧教程視頻 + 多得數不過來的計算機書籍:基礎、Web、爬蟲、數據分析、可視化、機器學習、深度學習、人工智能、算法、面試題等。
- 加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!
# -*- coding: utf-8 -*-
""" __author__ = 小小明-代碼實體 """
import sys
print('\n'.join(sys.path))
(base) D:\PycharmProjects\demo1>python pythonlearn/test.py
D:\PycharmProjects\demo1\pythonlearn
D:\Anaconda3\python37.zip
D:\Anaconda3\DLLs
D:\Anaconda3\lib
D:\Anaconda3
D:\Anaconda3\lib\site-packages
D:\Anaconda3\lib\site-packages\win32
D:\Anaconda3\lib\site-packages\win32\lib
D:\Anaconda3\lib\site-packages\Pythonwin
(base) D:\PycharmProjects\demo1>set PYTHONPATH=.
(base) D:\PycharmProjects\demo1>python pythonlearn/test.py
D:\PycharmProjects\demo1\pythonlearn
D:\PycharmProjects\demo1
D:\Anaconda3\python37.zip
D:\Anaconda3\DLLs
D:\Anaconda3\lib
D:\Anaconda3
D:\Anaconda3\lib\site-packages
D:\Anaconda3\lib\site-packages\win32
D:\Anaconda3\lib\site-packages\win32\lib
D:\Anaconda3\lib\site-packages\Pythonwin
語法如下:
import module1[, module2[,... moduleN]
一個模塊只會被導入一次,不管你執行了多少次import。這樣可以防止導入模塊被一遍又一遍地執行。
當我們使用import語句的時候,Python解釋器會到搜索路徑中查找,搜索路徑是由一系列目錄名組成的,Python解釋器就依次從這些目錄中去尋找所引入的模塊。
實戰講解:
# -*- coding: utf-8 -*-
""" __author__ = 孤寒者 """
# 導入模塊
from pprint import pprint
nested = [list("abcs"), list("sdff"), [1, 45, 4, 6, 7, 8], list(range(12))]
# 現在可以調用模塊裡包含的函數了
pprint(nested)
Python 的 from 語句讓你從模塊中導入一個指定的部分到當前命名空間中。
from…import相當於java的靜態導入,只導入一個模塊的指定部分
語法如下:
from modname import name1[, name2[, ... nameN]]
例如,要導入模塊 datetime 的 datetime函數,使用如下語句:
# -*- coding: utf-8 -*-
""" __author__ = 孤寒者 """
from datetime import datetime
d = datetime.now()
print(d)
和import的區別:
# -*- coding: utf-8 -*-
""" __author__ = 孤寒者 """
import datetime
d = datetime.datetime.now()
print(d)
從上面的示例可以看出,from…import導入的方法可以直接調用,import導入的方法必須加上類名。
把一個模塊的所有內容全都導入到當前的命名空間也是可行的,只需使用如下聲明:from modname import *
例如我們想一次性引入 math 模塊中所有的東西,語句如下:
from math import *
默認情況下,Python解釋器會搜索當前目錄、所有已安裝的內置模塊和第三方模塊,搜索路徑存放在sys模塊的path變量中:
>>> import sys
>>> sys.path
['', '/Library/Python/2.7/site-packages/pycrypto-2.6.1-py2.7-macosx-10.9-intel.egg', '/Library/Python/2.7/site-packages/PIL-1.1.7-py2.7-macosx-10.9-intel.egg', ...]
如果我們要添加自己的搜索目錄,有兩種方法:
一是直接修改sys.path,添加要搜索的目錄:
>>> import sys
>>> sys.path.append('E:/demo')
這種方法是在運行時修改,運行結束後失效。
第二種方法是設置環境變量PYTHONPATH,該環境變量的內容會被自動添加到模塊搜索路徑中。設置方式與設置Path環境變量類似。注意只需要添加你自己的搜索路徑,Python自己本身的搜索路徑不受影響。
例如:
set PYTHONPATH=.
dir() 可以找到模塊內定義的所有名稱。以一個字符串列表的形式返回:
# coding=utf-8
import math
print(dir(math))
在這裡,特殊字符串變量__name__指向模塊的名字,__file__指向該模塊的導入文件名。
如果沒有給定參數,那麼 dir() 函數會羅列出當前定義的所有名稱:
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'math']
__all__&
從一個包中導入*from sound.effects import *
會執行effects 包下面的__init__.py
並導入裡面定義的內容,如果存在 __all__
列表變量,那麼就可以導入該列表指定的模塊。
在:file:sounds/effects/__init__.py
中包含如下代碼:
__all__ = ["echo", "surround", "reverse"]
這表示當你使用from sound.effects import *
這種用法時,會導入包裡面這三個子模塊。
__main__
Python解釋器會將運行入口模塊文件的__name__
置為__main__
if __name__=='__main__':
test()
當我們在命令行運行hello模塊文件時,Python解釋器把一個特殊變量__name__置為__main__,而如果在其他地方導入該hello模塊時,if判斷將失敗,因此,這種if測試可以讓一個模塊通過命令行運行時執行一些額外的代碼,最常見的就是運行測試。
from car import Car #從一個只包含一個類的模塊中導入這個類
from car import ElectricCar #從一個包含多個類的模塊中導入一個類
from car import Car, ElectricCar #從一個有多個類的模塊中導入多個類
import car #導入整個模塊 我們使用語法 module_name.class_name 訪問需要的類
from module_name import * #導入模塊中的所有類 (不建議使用,如果要用,推薦使用導入整個模塊)
第一種:
import datetime # 導入整個datetime模塊
a = datetime.datetime.now() # 獲取當前時間
#第一個datetime是模塊,第二個datetime是模塊裡面的類,,now()是類裡面的方法
第二種:
(1)
from datetime import datetime #導入模塊裡面的一個類
a = datetime.now() #直接就一個datetime就是模塊裡的類
(2)
from datetime import * #導入這個模塊裡的所有類
a = datetime.now() #直接就一個datetime就是模塊裡的類
第三種:
from datetime import datetime as y #取別名
a = y.now()
sys.path 用於存放導入路徑的列表,類似於環境變量中的 PATH
sys.argv 查看當前文件路徑
__pycache__: 緩存文件
例子:
import sys
print(sys.path) #在這個路徑下面,就可以通過import直接導入。一個列表,在前面的路徑優先級高。
#只有在這個列表裡面的路徑的才能被導入。
第一個問題:
如果自己寫的一個文件和python自帶的一個模塊重名,而且自己寫的這個文件在本目錄下,那麼如果直接導入這個模塊,本目錄下的優先級最高,就導入不了自帶的那個模塊,該怎麼辦呢?
解決方法: sys.path.insert(0,路徑名)
,把想要導入的那個模塊的路徑改到列表的前面。
第二個問題:
如果需要導入的模塊在別的盤,即不在這個路徑列表裡,該怎麼導入?
sys.path.append(r'路徑名')