程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

22.Python函數(七)【Python模塊】

編輯:Python

目錄:

  • 每篇前言:
  • Python函數(七)
    • 1.1 Python模塊
      • 1.1.1 import 語句
      • 1.1.2 from…import 語句
      • 1.1.3 模塊的搜索路徑
      • 1.1.4 dir()找到模塊內定義的所有名稱
      • 1.1.5 globals() 和 locals() 函數
      • 1.1.6 `__all__&`從一個包中導入*
      • 1.1.7 `__main__`
    • Python模塊總結:
      • ①總共有這幾種導入的方式:
      • ②代碼實戰使用:
    • 知識點補給站:

每篇前言:

  • 作者介紹:【孤寒者】—CSDN全棧領域優質創作者、HDZ核心組成員、華為雲享專家Python全棧領域博主、CSDN原力計劃作者

  • 本文已收錄於Python全棧系列專欄:《Python全棧基礎教程》
  • 熱門專欄推薦:《Django框架從入門到實戰》、《爬蟲從入門到精通系列教程》、《爬蟲高級》、《前端系列教程》、《tornado一條龍+一個完整版項目》。
  • ​本專欄面向廣大程序猿,為的是大家都做到Python從入門到精通,同時穿插有很多很多習題,鞏固學習。
  • 訂閱專欄後可私聊進一千多人Python全棧交流群(手把手教學,問題解答);進群可領取Python全棧教程視頻 + 多得數不過來的計算機書籍:基礎、Web、爬蟲、數據分析、可視化、機器學習、深度學習、人工智能、算法、面試題等。
  • 加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!

Python函數(七)

1.1 Python模塊

  • 模塊是一個包含所有你定義的函數和變量的文件,其後綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數等功能。
  • 下面是一個使用 python 標准庫中模塊的例子。
# -*- 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
  • 可修改PYTHONPATH環境變量,增加模塊搜索路徑:
(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

1.1.1 import 語句

語法如下:

  • 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)

1.1.2 from…import 語句

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 *

1.1.3 模塊的搜索路徑

默認情況下,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=.

1.1.4 dir()找到模塊內定義的所有名稱

dir() 可以找到模塊內定義的所有名稱。以一個字符串列表的形式返回:

# coding=utf-8
import math
print(dir(math))

在這裡,特殊字符串變量__name__指向模塊的名字,__file__指向該模塊的導入文件名。

如果沒有給定參數,那麼 dir() 函數會羅列出當前定義的所有名稱:

['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'math']

1.1.5 globals() 和 locals() 函數

  • 根據調用地方的不同,globals() 和 locals() 函數可被用來返回全局和局部命名空間裡的名字。
  • 如果在函數內部調用 locals(),返回的是所有能在該函數裡訪問的命名。
  • 如果在函數內部調用 globals(),返回的是所有在該函數裡能訪問的全局名字。
  • 兩個函數的返回類型都是字典。所以名字們能用 keys() 函數摘取。

1.1.6 __all__&從一個包中導入*

from sound.effects import *

會執行effects 包下面的__init__.py並導入裡面定義的內容,如果存在 __all__ 列表變量,那麼就可以導入該列表指定的模塊。
在:file:sounds/effects/__init__.py中包含如下代碼:

__all__ = ["echo", "surround", "reverse"]

這表示當你使用from sound.effects import *這種用法時,會導入包裡面這三個子模塊。

1.1.7 __main__

Python解釋器會將運行入口模塊文件的__name__置為__main__

if __name__=='__main__':
test()

當我們在命令行運行hello模塊文件時,Python解釋器把一個特殊變量__name__置為__main__,而如果在其他地方導入該hello模塊時,if判斷將失敗,因此,這種if測試可以讓一個模塊通過命令行運行時執行一些額外的代碼,最常見的就是運行測試。

Python模塊總結:

①總共有這幾種導入的方式:

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'路徑名')

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved