1. 程式人生 > >【Python五篇慢慢彈(4)】模組異常談python

【Python五篇慢慢彈(4)】模組異常談python

作者:白寧超

2016年10月10日12:08:31

摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一種語言基礎。本系列文章屬於入門內容,老鳥可以略看也可以略過,新鳥可以從篇一<快速上手學python>先接觸下python怎樣安裝與執行,以及pycharm編輯器的使用和配置;篇二<資料結構看python>介紹python語言中控制語句、列表、字典、元組、迴圈等基本操作;篇三<函式修行知python>細解python語言函式的範疇與內容;篇四<模組異常談python>採用登入的案例詳解模組來龍去脈;篇五<‘類’過依然繼續前行,直至ending再出發>介紹類的基本操作,擴充套件虛擬環境、標準類庫和下個系列預告。(本文原創,轉載註明出處:

模組異常談知python)

目錄:

1 模組

【小記】本文中所有程式碼經過測試均可正常執行,python有個問題就是複製後會破壞原有格式。所以讀者複製執行時報如下錯誤:SyntaxError: expected an indented block,是因為空格問題,可以預留4個空格,或者採用tab鍵空格

python指令碼:如果你想要編寫一些更大的程式,並把程式寫入一個.py的檔案作為執行檔案。

模組定義:在指令碼或者直譯器的一個互動式例項中使用。這樣的檔案被稱為模組;模組中的定義可以匯入到另一個模組或主模組中。模組是包括 Python 定義和宣告的檔案。檔名就是模組名加上.py 字尾。模組的模組名可以由全域性變數 __name__(類似主函式)得到。

登陸許可權限制例項解析模組
例項分析

通過前面文章介紹python基本語法和例子,大家對python已經不陌生了。現在咱們做一個登入的案例,要求如下:

①建立指令碼:在pycharm(快速上手學python 有介紹)或者IDLE(python 3.5)中建立一個LoginDome.py

②登入函式:定義一個login()函式,當用戶輸入使用者名稱密碼同時匹配時,登入成功,反之登入失敗。3次機會不成功鎖定賬號。

③資訊收集:每次登入的使用者名稱和密碼放在一個列表裡面。

④模組測試:完成以上案例後,使用pycharm自動對類建立測試單元

⑤模組呼叫:新建一個moduleTest.py去呼叫之前的login()函式

例項演示LoginDome.py 的檔案,錄入如下內容

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'cuitbnc'
__mtime__ = '2016/10/4'
# 歡迎進入我的主頁:http://www.cnblogs.com/baiboy/.
"""

'''預設函式值:最常用的一種形式是為一個或多個引數指定預設值
username:必選引數,使用者名稱
password:必選引數,密碼
limits:可選引數,登陸許可權限制
complaint:可選引數,登陸錯誤,剩餘次數提示
urs=[] :字典引數
'''
def login(username,password, limits=3, complaint='you have login times:【',urs=[]):
    countlimits = limits; #統計自定義限制次數
    while True:
        usrname= input(username)
        usrpwd=input(password)
        urs.append("you input data:["+usrname+"-"+usrpwd+"]")    # 記錄使用者每次登入的資訊
        print(urs)
        if usrname in ('admin', 'ad', 'bnc') and usrpwd in ('pass', 'pwd', 'password', 'bnc'):
            print('Congratulations,Welcome 【'+usrname+'】to the login page.')
            return
        else:
            print('Sorry,【'+usrname+'】:you username or password error.')
            limits = limits - 1
        if limits == 0:
            print('More '+str(countlimits)+' times,Your account is locked!')
            return
        print(complaint+str(limits)+"】times")

1、只給出必要的引數執行結果:

# 只給出必要的引數:
login('UserName:\t','PassWord:\t')

 

解析:

預設函式值:最常用的一種形式是為一個或多個引數指定預設值,當只輸入必選引數時候預設登陸許可權是3次,登陸錯誤的提示也是預設值。具體效果如上圖

2、給出必要的引數和許可權次數限制執行結果:

# 給出一個可選的引數
login('UserName:\t','PassWord:\t',2)

 

解析: 

可選引數咱們手動設定2次,執行效果如圖。

3、給出必選引數,限制許可權2次,且自定義給出錯誤提示執行效果:

# 或者給出所有的引數
login('UserName:\t','PassWord:\t', 2, 'Remember you enter the correct user name and password,you have login times:')

解析:

自定義的錯誤提示如圖所示。

自動建立模組的單元測試:

1)選中login函式名,按下Ctrl+Shift+T,或者Navigate → Test自動生成測試類

2)自動生成效果如下圖:pass沒有具體含義,佔位符理解。

3)執行測試類結果:

模組呼叫:

1)新建一個Python檔案命名moduleTest.py,錄下以下程式碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ''
__author__ = 'cuitbnc'
__mtime__ = '2016/10/9'
# 歡迎進入我的主頁:http://www.cnblogs.com/baiboy/.
"""
import  LoginDome
LoginDome.login('UserName:\t\n','PassWord:\t\n')

執行結果:

注意:執行呼叫模組名.方法名([形參])

2、深入模組

模組(py檔名)全域性變數的使用:modname.itemname
模組匯入的幾種方式
①import ModuleName
②from ModuleName import MethodName1, MethodName1
③from ModuleName import * (不推薦,這樣匯入後代碼沒有那麼清晰,不過互動式時候可以用
注意:出於效能考慮,每個模組直譯器會話中只匯入一遍。因此,如果你修改了你的模組,需要重啟直譯器;或者可以用 imp.reload() 重新載入,例如 import imp; imp.reload(modulename)。

模組的搜尋路徑
匯入一個叫LoginDome的模組時,直譯器先在當前目錄中搜索名為LoginDome.py 的檔案。如果沒有找到的話,接著會到 sys.path 變數中給出的目錄列表中查詢。
sys.path 變數的初始值來自如下:
輸入指令碼的目錄(當前目錄)。
環境變數 PYTHONPATH 表示的目錄列表中搜索
實際上,直譯器由 sys.path 變數指定的路徑目錄搜尋模組,該變數初始化時預設包含了輸入指令碼(或者當前目錄), PYTHONPATH 和安裝目錄。

編譯的” Python 檔案
為了加快載入模組的速度,Python 會在 __pycache__ 目錄下以 module.version.pyc 名字快取每個模組編譯後的版本,這裡的版本編制了編譯後文件的格式。它通常會包含 Python 的版本號。
例如,在 CPython 3.3 版中,spam.py 編譯後的版本將快取為 __pycache__/spam.cpython-33.pyc。這種命名約定允許由不同釋出和不同版本的 Python 編譯的模組同時存在。
Python 會檢查原始檔與編譯版的修改日期以確定它是否過期並需要重新編譯。這是完全自動化的過程。同時,編譯後的模組是跨平臺的,所以同一個庫可以在不同架構的系統之間共享。
Python 不檢查在兩個不同環境中的快取。首先,它會永遠重新編譯而且不會儲存直接從命令列載入的模組。其次,如果沒有源模組它不會檢查快取。若要支援沒有原始檔(只有編譯版)的釋出,
編譯後的模組必須在源目錄下,並且必須沒有原始檔的模組。
部分高階技巧
1 為了減少一個編譯模組的大小,你可以在 Python 命令列中使用 -O 或者 -OO。-O 引數刪除了斷言語句,-OO 引數刪除了斷言語句和 __doc__ 字串。因為某些程式依賴於這些變數的可用性,你應該只在確定無誤的場合使用這一選項。“優化的” 模組有一個 .pyo 字尾而不是 .pyc 字尾。未來的版本可能會改變優化的效果。
2 來自 .pyc 檔案或 .pyo 檔案中的程式不會比來自 .py 檔案的執行更快;.pyc 或 .pyo 檔案只是在它們載入的時候更快一些。
3 compileall 模組可以為指定目錄中的所有模組建立 .pyc 檔案(或者使用 -O 引數建立 .pyo 檔案)。

標準模組
Python 帶有一個標準模組庫,併發布有獨立的文件,名為 Python 庫參考手冊。
例如,winreg 模組只提供在 Windows 系統上才有。有一個具體的模組值得注意: sys ,這個模組內置於所有的 Python 直譯器。變數 sys.path和 sys.version

>>> import sys
>>> sys.path
['', 'E:\\Python\\Lib\\idlelib', 'E:\\Python\\python35.zip', 'E:\\Python\\DLLs', 'E:\\Python\\lib', 'E:\\Python', 'E:\\Python\\lib\\site-packages']
>>> sys.version
'3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)]'

變數 sys.path 是直譯器模組搜尋路徑的字串列表。它由環境變數 PYTHONPATH 初始化,如果沒有設定 PYTHONPATH ,就由內建的預設值初始化。你可以用標準的字串操作修改它:

3、dir() 函式

內建函式 dir() 用於按模組名搜尋模組定義,它返回一個字串型別的儲存列表

dir()內建函式例項:dir() 不會列出內建函式和變數名。如果你想列出這些內容,它們在標準模組 builtins 中定義
import sys,LoginDome,builtins
print("LoginDome 內建函式:"+str(dir(LoginDome)))
print("Sys 內建函式:"+str(dir(sys)))
print("builtins 內建函式變數名:"+str(dir(sys)))

LoginDome 內建函式

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

Sys 內建函式:

['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_coroutine_wrapper', 'getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'set_coroutine_wrapper', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions', 'winver']

builtins 內建函式變數名:

['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe', '_home', '_mercurial', '_xoptions', 'api_version', 'argv', 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_coroutine_wrapper', 'getallocatedblocks', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'set_coroutine_wrapper', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions', 'winver']

4、包

包(模組集):用“圓點模組名”的結構化模組名稱空間。例如, A.B 的模組表示了名為 A 的包中名為 B 的子模組。不同的模組架構可以避免衝突,

模組集統一處理聲音檔案和聲音資料。存在幾種不同的聲音格式(例如:.wav, .aiff,.au )。可能你還想要對聲音資料做很多不同的操作(例如混音,添加回聲,應用平衡 功能,建立一個人造效果),所以你要加入一個無限流模組來執行這些操作。你的包可能會是這個樣子:

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py

當匯入這個包時,Python 通過 sys.path 搜尋路徑查詢包含這個包的子目錄。為了讓 Python 將目錄當做內容包,目錄中必須包含 __init__.py 檔案。當然它也可以執行包的初始化程式碼,或者定義稍後介紹的 __all__ 變數。

匯入包的幾種方式:
①匯入包裡的特定模組:
例如:import sound.effects.echo (匯入 sound.effects.echo 子模組)
呼叫:sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
②匯入包可以選擇方式
例如:from sound.effects import echo
呼叫: echo.echofilter(input, output, delay=0.7, atten=4)
③直接匯入函式或變數
例如:from sound.effects.echo import echofilter (直接呼叫它的 echofilter() 函式)
呼叫:echofilter(input, output, delay=0.7, atten=4)

導包原理:使用 from package import item 方式匯入包時,這個子項(item)既可以是包中的一個子模組(或一個子包),也可以是包中定義的其它命名,像函式、類或變數。import 語句首先核對是否包中有這個子項,如果沒有,它假定這是一個模組,並嘗試載入它。如果沒有找到它,會引發一個 ImportError 異常。相反,使用類似 import item.subitem.subsubitem 這樣的語法時,這些子項必須是包,最後的子項可以是包或模組,但不能是前面子項中定義的類、函式或變數。

從 * 匯入包
import 語句執行from package import * 時,如果包中的 __init__.py 程式碼定義了一個名為 __all__ 的列表,就會按照列表中模組名進行匯入。新版本的包釋出可以任意更新__all__列表。如果包作者不想 import * 的時候匯入他們的包中所有模組,那麼也可能會決定不支援它( import * )。
例如, sound/effects/__init__.py 這個檔案可能包括如下程式碼:__all__ = ["echo", "surround", "reverse"]
這意味著 from Sound.Effects import * 語句會從 sound 包中匯入以上三個已命名的子模組。

包內引用
例如: sound.filters.vocoder 包需要使用 sound.effects 包中的 echo 模組,它可以 from Sound.Effects import echo。包內引用可以.代表上級目錄
from . import echo 等於 (from Sound.Effects import echo)
from .. import formats 等於 (from Sound import formats)
from ..filters import equalizer 等於(from Sound.filters import equalizer)
需要注意的是顯式或隱式相對位置匯入都基於當前模組的命名。因為主模組的名字總是 "__main__",Python 應用程式的主模組應該總是用絕對匯入。

5、錯誤和異常

errors:語法錯誤
exceptions:異常
例子:它會一直要求使用者輸入,直到輸入一個合法的整數為止,但允許使用者中斷這個程式。注意:使用者產生的中斷會引發一個 KeyboardInterrupt 異常。

>>> while True:
	try:
		x = int(input("Please enter a number: "))
		break
	except ValueError:
		print('oh,That was no valid number. Try again...')

Please enter a number: rttr
oh,That was no valid number. Try again...
Please enter a number:

try 語句按如下工作方式

  1. 執行 try 子句 (在 try 和 except 關鍵字之間的部分)。
  2. 如果沒有異常發生, except 子句 在 try 語句執行完畢後就被忽略了。
  3. 如果在 try 子句執行過程中發生了異常,那麼該子句其餘的部分就會被忽略。如果異常匹配於 except 關鍵字後面指定的異常型別,就執行對應的except子句。然後繼續執行 try 語句之後的程式碼。
  4. 如果發生了一個異常,在 except 子句中沒有與之匹配的分支,它就會傳遞到上一級 try 語句中。如果最終仍找不到對應的處理語句,它就成為一個 未處理異常,終止程式執行,顯示提示資訊。

一個 try 語句可能包含多個 except 子句,分別指定處理不同的異常。例如:(RuntimeError, TypeError, NameError)最後一個 except 子句可以省略異常名稱:

import sys
try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

try ... except 語句可以帶有一個 else子句,該子句只能出現在所有 except 子句之後。當 try 語句沒有丟擲異常時,需要執行一些程式碼,可以使用這個子句。例如:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

異常處理器不僅僅處理那些在 try 子句中立刻發生的異常,也會處理那些 try 子句中呼叫的函式內部發生的異常。例如:

>>> def this_fails():
...     x = 1/0
>>> try:
...     this_fails()
... except ZeroDivisionError as err:
...     print('Handling run-time error:', err)
Handling run-time error: int division or modulo by zero

丟擲異常:raise 語句允許程式設計師強制丟擲一個指定的異常。例如:

>>> try:
	raise NameError('There name error')
except NameError:
	print('An exception flew by!')
	raise

An exception flew by!
Traceback (most recent call last):
  File "<pyshell#196>", line 2, in <module>
    raise NameError('There name error')
NameError: There name error

定義清理行為

程式:

執行結果:

預定義清理行為
讀取檔案:(檔案操作將在下篇介紹

讀取檔案:
for line in open("myfile.txt"):
    print(line)
如上檔案讀取沒有關閉,則可以採用之前文章介紹的預處理with解決:
with open("myfile.txt") as f:
    for line in f:
        print(line)

6、參考文獻和推薦資料

相關推薦

Python慢慢4模組異常python

作者:白寧超 2016年10月10日12:08:31 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任

Python慢慢3函式修行知python

作者:白寧超 2016年10月9日21:51:52 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一

Python慢慢5類的繼承案例解析,python相關知識延伸

作者:白寧超 2016年10月10日22:36:57 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任

Python慢慢資料結構看python

作者:白寧超 2016年10月9日14:04:47 摘要:繼<快速上手學python>一文之後,筆者又將python官方文件認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文件常用核心要點進行梳理,簡單冗餘知識不再介紹,作者假使你用c/java/c#/c++任一

Python慢慢快速上手學python

作者:白寧超 2016年10月4日19:59:39 摘要:python語言儼然不算新技術,七八年前甚至更早已有很多人研習,只是沒有現在流行罷了。之所以當下如此盛行,我想肯定是多因素造成了,當然市場需求的重要因素。吳軍博士對大資料流行的解釋與python流行或許有些默契。資料一直以來都存在,只是在歷

程式設計師眼中的統計學4離散概率分佈的運用:善用期望

/** * @ClassName ScoreUtil * @Description 分數處理工具類 * @author candymoon * @Date 2014-4-25 */ public class ScoreUtil { /** * 使用jav

nodejs原理&原始碼賞析4深度剖析cluster模組原始碼與node.js多程序

目錄 一. 概述 二. 執行緒與程序 三. cluster模組原始碼解析 3.1 起步 3.2 入口 3.3 主程序模組master.js 3.4 子程序模組c

功能第——批量處理JDBC

需要 res col dsta 添加 name call table creat 綜述 批量處理一般指批量插入,批量更新,刪除通過可

Selenium 3+Java自動化4-八種元素定位

pub nbsp 百度搜索 name tail webdriver nqa pan sss 1 package com.mypro.jase; 2 3 import org.openqa.selenium.By; 4 import org.openqa.sele

Python導入模塊4

變量名 文件 直接 bsp 調用 spa 如果 nbsp 模塊 使用from...import...導入變量或函數,在本Python文件調用時 直接寫變量或函數名即可,如 from module import age age() #直接調用age 如果不是用from..

python Deep learning 學習筆記4

本節講卷積神經網路的視覺化 三種方法 視覺化卷積神經網路的中間輸出(中間啟用) 有助於理解卷積神經網路連續的層如何對輸入進行變換,也有助於初步瞭解卷積神經網路每個過濾器的含義 視覺化卷積神經網路的過濾器 有助於精確理解卷積神經網路中每個過濾器容易接受的視覺模

Python基礎:編碼規範4

1.命名規範   Python中不同程式碼元素採用不同命名方式:   ◊ 包名:全部小寫字母,中間可以由點分隔開。作為名稱空間,包名需具有唯一性。   ◊ 模組名:全部小寫字母,如果是多個單詞構成,使用下劃線分隔。   ◊ 類名:採用Pascal法命名,即每個單詞首字母大寫。如:Student。  

python+requests+unittest介面自動化4:返回內容

之前介紹了get和post請求的傳送方法和內容編寫,其他的介面請求型別也可以參考它們來進行內容的編寫。 本次介紹requests請求返回的內容: import requests r = requests.get() r.raw 請求返回的原始資料 r.staus_code

python opencv入門 滑鼠繪圖4

目標: 學習如何操作滑鼠事件 學習cv2.setMouseCallback()函式 簡單樣例: 首先建立一個滑鼠的回撥函式,當滑鼠事件觸發時,該函式執行。 滑鼠事件有很多種,比如左鍵右鍵

Python入門100道習題4——換散幣

題目描述 【問題描述】 將n元(n是100的倍數)換成用10元、5元、2元的組合(其中每一面值都可取0),一共有多少種組合?輸入n,輸出組合數。 【輸入形式】 輸入錢幣總額n 【輸出形式】 輸出組合數 【樣例輸入】 100 【樣例輸出】 66

CUDA並行程式設計系列4CUDA記憶體

前言 CUDA並行程式設計系列是本人在學習CUDA時整理的資料,內容大都來源於對《CUDA並行程式設計:GPU程式設計指南》、《GPU高效能程式設計CUDA實戰》和CUDA Toolkit Documentation的整理。通過本系列整體介紹CUDA並行程

吳裕雄 python深度學習與實踐4

shape math ret sof clas bsp pre 深度學習 sha import numpy,math def softmax(inMatrix): m,n = numpy.shape(inMatrix) outMatrix = numpy

Python 正則表示式學習4:查詢以“one”結尾,前面包含0個或多個英文字母不能是數字或其它字元的字串。

需求是:查詢以“one”結尾,包含0個或多個英文字母(不能是數字或其它字元)的字串。 import re str='bacdone1cdonone345dhdfgkone' p=re.compile(r'[a-zA-Z]*one') #只搜尋一次 m=re.match

《資料結構與演算法——Python語言描述》筆記4

第2章 抽象資料型別和python類2.1 抽象資料型別ADT(Abstract Data Type)是一種思想,也是一種組織程式的技術,主要包括:1、圍繞著一類資料定義程式模組。2、模組的介面和實現分離。3、在需要實現時,選擇一套合適的機制,採用合理的技術,實現這種ADT的

Maven 實戰 -多模組 vs 繼承 Maven提高系列之——多模組 vs 繼承

Maven提高篇系列之(一)——多模組 vs 繼承     這是一個Maven提高篇的系列,包含有以下文章:    Maven提高篇系列之(一)——多模組 vs 繼承 Maven提高篇系列之(二)——配置Plu