python學習筆記(四)python中的模塊

 

目錄

(一)何爲模塊

(二)編寫第一個模塊

(三)import語句

(四)模塊搜索路徑

自建模塊的存放位置

模塊內部私有名稱

(五)python的作用域的相關規則


 

主要內容

  • 定義模塊
  • 編寫第一個自己的模塊
  • 使用import語句
  • 修改模塊搜索路徑
  • 讓名稱歸模塊私有
  • 導入標準庫和第三方模塊
  • 理解Python的作用域規則和命名空間

 

python語言如果沒有衆多的作爲支撐的話,那python作爲一門編程語言存在意義也不大了。正是多種多樣的標準庫和諸多第三方庫的存在,才讓python具有了強大的功能。

模塊、包和庫的作用基本都是相同的,都是爲了實現代碼的重複利用,提高代碼效率。區別是從模塊到包再到庫,代碼數量越多,實現的功能越強大。當然,也會有一些管理工具。這裏先簡單瞭解一下模塊。

(一)何爲模塊

模塊(module)用於組織較大的Python項目,Python標準庫被拆分爲多個模塊,以便更易於管理。

模塊是一個包含代碼的文件,其中定義了一組Python函數或其他對象,而且模塊的名稱來自文件名。

模塊通常包含Python源代碼,但也可以是經過編譯的C或C++對象文件。經過編譯的模塊和Python源代碼模塊的用法是一樣的。

模塊不僅可以將相互關聯的Python對象歸併成組,還有助於避免命名衝突(name-clash)問題。因爲Python採用了命名空間(namespace)的機制,所以使用模塊名可以同時保留兩個reverse函數。命名空間本質上就是標識符的字典,可用於代碼塊、函數、類、模塊等。

 

(二)編寫第一個模塊

我們將通過編寫一個簡單的模塊來了解模塊。

首先新建一個mymath.py文件,注意將文件保存在可執行文件所在的目錄中。我的文件目錄是D:\python37,通過下面的IDLE編輯器窗口也可以看到。

選擇File>New Windows菜單,輸入以下代碼:

以上我們便簡單定義了一個模塊,這個模塊只是定義了pi常數和新建一個函數。

下面我們需要在我們的代碼中使用這個模塊,需要注意的是,使用前一定要導入模塊,如果未進行import語句導入,Python解釋器會進行報錯:

>>> pi
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    pi
NameError: name 'pi' is not defined
>>> area(3)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    area(3)
NameError: name 'area' is not defined

也就是說,Python沒有內置常量pi和函數area。我們將模塊導入之後:

>>> import mymath
>>> pi
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    pi
NameError: name 'pi' is not defined
>>> area(3)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    area(3)
NameError: name 'area' is not defined

結果Python解釋器也報錯了,這是因爲Python解釋器不知到變量pi和area函數在哪個模塊裏面,有可能其他的模塊也有相同命名的函數和常量,爲了解決這個問題,我們需要在常量和函數之前,加上模塊名稱。這種訪問方式常常被稱爲限定名稱(qualification),即變量pi是受mymath模塊限定的。也可以將pi成爲mymath的屬性。代碼如下:

>>> mymath.pi
3.14
>>> mymath.area(3)
28.259999999999998

模塊中的對象可以直接訪問同一模塊內定義的其他對象,不需要帶上模塊名稱。函數mymath.area訪問常量mymath.pi時,只需要用pi即可。

還可以要求從模塊中導入指定的對象名稱,這樣在使用時就不需要帶上模塊名稱了。例如:

>>> from mymath import pi
>>> pi
3.14

模塊不僅是在交互式Python shell中需要用到。模塊還可以被導入腳本文件,或者其他模塊中,只要在代碼文件的開頭輸入合適的import語句即可。從本事上來說,對於Python,交互式會話和腳本也被認爲是模塊。總結如下:

  • 模塊是定義Python對象的文件。
  • 假定模塊文件的名稱是modulename.py,那麼模塊的Python名稱就是modulename。
  • 通過import modulename語句,即可導入名爲modulename的模塊。該導入語句執行完畢後,模塊modulename中定義的對象就能以modulename.objectname的格式被訪問了。
  • 通過from modulename import objectname語句,可以將模塊中的指定對象名稱直接導入代碼。該語句使得代碼無需帶modulename前綴即可直接訪問objectname,這在導入某個頻繁使用的對象名稱時會很有用。

可以通過dir()函數查看模塊的方法:

>>> import os
>>> dir(os)
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']

(三)import語句

import語句有3種格式,最基本的格式就是:

# 第一種,最基本的格式
import modulename

這時會搜索給定名稱的Python模塊,解析模塊內容並使之進入可用狀態。發起導入的代碼可以使用模塊中的內容,但是引用模塊中的對象名稱時仍必須帶有模塊名前綴。如果未找到指定名稱的模塊,就會報錯。

第二種:

# 第二種,允許指定模塊中的名稱,將其顯式的導入代碼中
from modulename import name1, name2, name3, ...

這些name1、name2等modulename中的對象名稱,就可供發起導入的代碼使用了。在import語句之後的代碼,可以直接使用name1、name2等名稱,不需要再帶上模塊名前綴了。

 

# 第三種
from modulename import *

“ * ”代表模塊modulename中所有導出(exported)的對象名稱。

 

(四)模塊搜索路徑

Python搜索模塊的確切路徑是在一個名爲path的變量中定義的,可以通過模塊sys訪問path變量。

>>> import sys
>>> sys.path
['', 'D:\\python37\\Lib\\idlelib', 'D:\\python37\\python37.zip', 'D:\\python37\\DLLs', 'D:\\python37\\lib', 'D:\\python37', 'C:\\Users\\name\\AppData\\Roaming\\Python\\Python37\\site-packages', 'D:\\python37\\lib\\site-packages']

顯示的位置取決於當前的系統配置。不管具體內容是什麼,該字符串給出的是一個目錄列表。當準備執行import語句時,Python將按順序遍歷該目錄列表,並採用第一個滿足import需求的模塊。如果搜索路徑中找不到合適的模塊,則會引發ImportError異常。

自建模塊的存放位置

爲確保程序可以使用自己編寫的模塊,有以下三種方式:

  • 將自己的模塊放入Python的常規模塊搜索路徑中去;
  • 將Python程序要用到的全部模塊,都和程序放在同一目錄中;
  • 新建目錄用於保存自己的模塊,並修改sys.path變量,使之包含該新建目錄。

 

模塊內部私有名稱

模塊中下劃線開頭的標識符不能用from module import *導入,所以將所有內部對象名稱(即不允許模塊外部訪問的名稱)都以下劃線開頭,既可以保證from module import *只引入用戶需要訪問的名稱。

但是,也可以通過from module import _g語句,只導入_g變量,後面的代碼就可以訪問_g變量。

 

(五)python的作用域的相關規則

 

這裏的核心概念是命名空間(namespace)。Python中的命名空間是從標識符到對象的映射,也就是Python如何跟蹤變量和標識符是否活動以及指向什麼。

如果剛剛接觸Python,可以先不去了解這些。

Python 的名字查找規則是按照 local -> enclosing functions -> global -> built-in 的順序由內而外查找,並選擇最近的一個。

關於作用域規則,這裏要先有一個概念,後續的學習中我們再逐步理解它。

 

 

參考:

  1. https://www.jianshu.com/p/276578774069
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章