Python 模塊

目錄

模塊

6.1.?模塊詳解

6.1.1.?以腳本方式執行模塊

6.1.2.?模塊搜索路徑

6.1.3.?“已編譯的” Python 文件

6.2.?標準模塊

6.3.?dir()?函數

6.4.?包

6.4.1.?從包中導入 *

6.4.2.?相對導入

6.4.3.?多目錄中的包


模塊

退出 Python 解釋器后,再次進入時,之前在 Python 解釋器中定義的函數和變量就丟失了。因此,編寫較長程序時,最好用文本編輯器代替解釋器,執行文件中的輸入內容,這就是編寫?腳本?。隨著程序越來越長,為了方便維護,最好把腳本拆分成多個文件。編寫腳本還一個好處,不同程序調用同一個函數時,不用把函數定義復制到各個程序。

為實現這些需求,Python 把各種定義存入一個文件,在腳本或解釋器的交互式實例中使用。這個文件就是?模塊?;模塊中的定義可以?導入?到其他模塊或??模塊(在頂層和計算器模式下,執行腳本中可訪問的變量集)。

模塊是包含 Python 定義和語句的文件。其文件名是模塊名加后綴名?.py?。在模塊內部,通過全局變量?__name__?可以獲取模塊名(即字符串)。例如,用文本編輯器在當前目錄下創建?fibo.py?文件,輸入以下內容:

# Fibonacci numbers moduledef fib(n):    # write Fibonacci series up to na, b = 0, 1while a < n:print(a, end=' ')a, b = b, a+bprint()def fib2(n):   # return Fibonacci series up to nresult = []a, b = 0, 1while a < n:result.append(a)a, b = b, a+breturn result

現在,進入 Python 解釋器,用以下命令導入該模塊:

>>>

>>> import fibo

此操作不會直接把?fibo?中定義的函數名稱添加到當前?namespace?中(請參閱?Python 作用域和命名空間?了解詳情);它只是將模塊名稱?fibo?添加到那里。 使用該模塊名稱你可以訪問其中的函數:

>>>

>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

如果經常使用某個函數,可以把它賦值給局部變量:

>>>

>>> fib = fibo.fib
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

6.1.?模塊詳解

模塊包含可執行語句及函數定義。這些語句用于初始化模塊,且僅在 import 語句?第一次?遇到模塊名時執行。1?(文件作為腳本運行時,也會執行這些語句。)

每個模塊都有自己的私有命名空間,它會被用作模塊中定義的所有函數的全局命名空間。 因此,模塊作者可以在模塊內使用全局變量而不必擔心與用戶的全局變量發生意外沖突。 另一方面,如果你知道要怎么做就可以通過與引用模塊函數一樣的標記法?modname.itemname?來訪問一個模塊的全局變量。

模塊可以導入其他模塊。 根據慣例可以將所有?import?語句都放在模塊(或者也可以說是腳本)的開頭但這并非強制要求。 如果被放置于一個模塊的最高層級,則被導入的模塊名稱會被添加到該模塊的全局命名空間。

還有一種?import?語句的變化形式可以將來自某個模塊的名稱直接導入到導入方模塊的命名空間中。 例如:

>>>

>>> from fibo import fib, fib2
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

這條語句不會將所導入的模塊的名稱引入到局部命名空間中(因此在本示例中,fibo?將是未定義的名稱)。

還有一種變體可以導入模塊內定義的所有名稱:

>>>

>>> from fibo import *
>>> fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

這種方式會導入所有不以下劃線(_)開頭的名稱。大多數情況下,不要用這個功能,這種方式向解釋器導入了一批未知的名稱,可能會覆蓋已經定義的名稱。

注意,一般情況下,不建議從模塊或包內導入?*,因為,這項操作經常讓代碼變得難以理解。不過,為了在交互式編譯器中少打幾個字,這么用也沒問題。

模塊名后使用?as?時,直接把?as?后的名稱與導入模塊綁定。

>>>

>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

與?import?fibo?一樣,這種方式也可以有效地導入模塊,唯一的區別是,導入的名稱是?fib

from?中也可以使用這種方式,效果類似:

>>>

>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

備注

為了保證運行效率,每次解釋器會話只導入一次模塊。如果更改了模塊內容,必須重啟解釋器;僅交互測試一個模塊時,也可以使用?importlib.reload(),例如?import?importlib;?importlib.reload(modulename)

6.1.1.?以腳本方式執行模塊

可以用以下方式運行 Python 模塊:

python fibo.py <arguments>

這項操作將執行模塊里的代碼,和導入模塊一樣,但會把?__name__?賦值為?"__main__"。 也就是把下列代碼添加到模塊末尾:

if __name__ == "__main__":import sysfib(int(sys.argv[1]))

這個文件既能被用作腳本,又能被用作一個可供導入的模塊,因為解析命令行參數的那兩行代碼只有在模塊作為“main”文件執行時才會運行:

$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34

當這個模塊被導入到其它模塊時,那兩行代碼不運行:

>>>

>>> import fibo
>>>

這常用于為模塊提供一個便捷的用戶接口,或用于測試(把模塊作為執行測試套件的腳本運行)。

6.1.2.?模塊搜索路徑

當導入一個名為?spam?的模塊時,解釋器首先會搜索具有該名稱的內置模塊。 這些模塊的名稱在?sys.builtin_module_names?中列出。 如果未找到,它將在變量?sys.path?所給出的目錄列表中搜索名為?spam.py?的文件。?sys.path?是從這些位置初始化的:

  • 被命令行直接運行的腳本所在的目錄(或未指定文件時的當前目錄)。

  • PYTHONPATH?(目錄列表,與 shell 變量?PATH?的語法一樣)。

  • 依賴于安裝的默認值(按照慣例包括一個?site-packages?目錄,由?site?模塊處理)。

更多細節請參閱?sys.path 模塊搜索路徑的初始化。

備注

在支持符號鏈接的文件系統中,“被命令行直接運行的腳本所在的目錄”是符號鏈接最終指向的目錄。換句話說,符號鏈接所在的目錄并?沒有?被添加至模塊搜索路徑。

初始化后,Python 程序可以更改?sys.path。腳本所在的目錄先于標準庫所在的路徑被搜索。這意味著,腳本所在的目錄如果有和標準庫同名的文件,那么加載的是該目錄里的,而不是標準庫的。這一般是一個錯誤,除非這樣的替換是你有意為之。詳見?標準模塊。

6.1.3.?“已編譯的” Python 文件

為了快速加載模塊,Python 把模塊的編譯版本緩存在?__pycache__?目錄中,文件名為?module.version.pyc,version 對編譯文件格式進行編碼,一般是 Python 的版本號。例如,CPython 的 3.3 發行版中,spam.py 的編譯版本緩存為?__pycache__/spam.cpython-33.pyc。這種命名慣例讓不同 Python 版本編譯的模塊可以共存。

Python 對比編譯版與源碼的修改日期,查看編譯版是否已過期,是否要重新編譯。此進程完全是自動的。此外,編譯模塊與平臺無關,因此,可在不同架構的系統之間共享相同的庫。

Python 在兩種情況下不檢查緩存。一,從命令行直接載入的模塊,每次都會重新編譯,且不儲存編譯結果;二,沒有源模塊,就不會檢查緩存。為了讓一個庫能以隱藏源代碼的形式分發(通過將所有源代碼變為編譯后的版本),編譯后的模塊必須放在源目錄而非緩存目錄中,并且源目錄絕不能包含同名的未編譯的源模塊。

給專業人士的一些小建議:

  • 在 Python 命令中使用?-O?或?-OO?開關,可以減小編譯模塊的大小。-O?去除斷言語句,-OO?去除斷言語句和 __doc__ 字符串。有些程序可能依賴于這些內容,因此,沒有十足的把握,不要使用這兩個選項。“優化過的”模塊帶有?opt-?標簽,并且文件通常會一小些。將來的發行版或許會改進優化的效果。

  • 從?.pyc?文件讀取的程序不比從?.py?讀取的執行速度快,.pyc?文件只是加載速度更快。

  • compileall?模塊可以為一個目錄下的所有模塊創建 .pyc 文件。

  • 本過程的細節及決策流程圖,詳見?PEP 3147。

6.2.?標準模塊

Python 自帶一個標準模塊的庫,它在 Python 庫參考(此處以下稱為"庫參考" )里另外描述。 一些模塊是內嵌到編譯器里面的, 它們給一些雖并非語言核心但卻內嵌的操作提供接口,要么是為了效率,要么是給操作系統基礎操作例如系統調入提供接口。 這些模塊集是一個配置選項, 并且還依賴于底層的操作系統。 例如,winreg?模塊只在 Windows 系統上提供。一個特別值得注意的模塊?sys,它被內嵌到每一個 Python 編譯器中。sys.ps1?和?sys.ps2?變量定義了一些字符,它們可以用作主提示符和輔助提示符:

>>>

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>

只有解釋器用于交互模式時,才定義這兩個變量。

變量?sys.path?是字符串列表,用于確定解釋器的模塊搜索路徑。該變量以環境變量?PYTHONPATH?提取的默認路徑進行初始化,如未設置?PYTHONPATH,則使用內置的默認路徑。可以用標準列表操作修改該變量:

>>>

>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')

6.3.?dir()?函數

內置函數?dir()?用于查找模塊定義的名稱。返回結果是經過排序的字符串列表:

>>>

>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)  
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__','__interactivehook__', '__loader__', '__name__', '__package__', '__spec__','__stderr__', '__stdin__', '__stdout__', '__unraisablehook__','_clear_type_cache', '_current_frames', '_debugmallocstats', '_framework','_getframe', '_git', '_home', '_xoptions', 'abiflags', 'addaudithook','api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix','breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing','callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info','excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info','float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth','getallocatedblocks', 'getdefaultencoding', 'getdlopenflags','getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile','getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval','gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info','intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value','maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks','path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'pycache_prefix','set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setdlopenflags','setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr','stdin', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info','warnoptions']

沒有參數時,dir()?列出當前已定義的名稱:

>>>

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']

注意它列出所有類型的名稱:變量,模塊,函數,……。

dir()?不會列出內置函數和變量的名稱。這些內容的定義在標準模塊?builtins?中:

>>>

>>> import builtins
>>> dir(builtins)  
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException','BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning','ChildProcessError', 'ConnectionAbortedError', 'ConnectionError','ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning','EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False','FileExistsError', 'FileNotFoundError', 'FloatingPointError','FutureWarning', 'GeneratorExit', 'IOError', 'ImportError','ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError','IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError','MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented','NotImplementedError', 'OSError', 'OverflowError','PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError','ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning','StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError','SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError','UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError','UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning','ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__','__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs','all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable','chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits','delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit','filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr','hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass','iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview','min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property','quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice','sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars','zip']

6.4.?包

包是通過使用“帶點號模塊名”來構造 Python 模塊命名空間的一種方式。 例如,模塊名?A.B?表示名為?A?的包中名為?B?的子模塊。 就像使用模塊可以讓不同模塊的作者不必擔心彼此的全局變量名一樣,使用帶點號模塊名也可以讓 NumPy 或 Pillow 等多模塊包的作者也不必擔心彼此的模塊名沖突。

假設要為統一處理聲音文件與聲音數據設計一個模塊集(“包”)。聲音文件的格式很多(通常以擴展名來識別,例如:.wav.aiff.au),因此,為了不同文件格式之間的轉換,需要創建和維護一個不斷增長的模塊集合。為了實現對聲音數據的不同處理(例如,混聲、添加回聲、均衡器功能、創造人工立體聲效果),還要編寫無窮無盡的模塊流。下面這個分級文件樹展示了這個包的架構:

sound/                          Top-level package__init__.py               Initialize the sound packageformats/                  Subpackage for file format conversions__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/                  Subpackage for sound effects__init__.pyecho.pysurround.pyreverse.py...filters/                  Subpackage for filters__init__.pyequalizer.pyvocoder.pykaraoke.py...

導入包時,Python 搜索?sys.path?里的目錄,查找包的子目錄。

必須要有?__init__.py?文件才能讓 Python 將包含該文件的目錄當作包來處理。 這可以防止具有通用名稱的目錄如?string?在無意中屏蔽后續出現在模塊搜索路徑中的有效模塊。 在最簡單的情況下,__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,并使其不必加包前綴,因此可按如下方式使用:

echo.echofilter(input, output, delay=0.7, atten=4)

Import 語句的另一種變體是直接導入所需的函數或變量:

from sound.effects.echo import echofilter

同樣,這將加載子模塊?echo,但這使其函數?echofilter()?直接可用:

echofilter(input, output, delay=0.7, atten=4)

注意,使用?from?package?import?item?時,item 可以是包的子模塊(或子包),也可以是包中定義的函數、類或變量等其他名稱。import?語句首先測試包中是否定義了 item;如果未在包中定義,則假定 item 是模塊,并嘗試加載。如果找不到 item,則觸發?ImportError?異常。

相反,使用?import?item.subitem.subsubitem?句法時,除最后一項外,每個 item 都必須是包;最后一項可以是模塊或包,但不能是上一項中定義的類、函數或變量。

6.4.1.?從包中導入 *

使用?from?sound.effects?import?*?時會發生什么?你可能希望它會查找并導入包的所有子模塊,但事實并非如此。因為這將花費很長的時間,并且可能會產生你不想要的副作用,如果這種副作用被你設計為只有在導入某個特定的子模塊時才應該發生。

唯一的解決辦法是提供包的顯式索引。import?語句使用如下慣例:如果包的?__init__.py?代碼定義了列表?__all__,運行?from?package?import?*?時,它就是被導入的模塊名列表。發布包的新版本時,包的作者應更新此列表。如果包的作者認為沒有必要在包中執行導入 * 操作,也可以不提供此列表。例如,sound/effects/__init__.py?文件可以包含以下代碼:

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

這意味著?from?sound.effects?import?*?將導入?sound.effects?包的三個命名子模塊。

請注意子模塊可能會受到本地定義名稱的影響。 例如,如果你在?sound/effects/__init__.py?文件中添加了一個?reverse?函數,from?sound.effects?import?*?將只導入?echo?和?surround?這兩個子模塊,但?不會?導入?reverse?子模塊,因為它被本地定義的?reverse?函數所遮擋:

__all__ = ["echo",      # refers to the 'echo.py' file"surround",  # refers to the 'surround.py' file"reverse",   # !!! refers to the 'reverse' function now !!!
]def reverse(msg: str):  # <-- this name shadows the 'reverse.py' submodulereturn msg[::-1]    #     in the case of a 'from sound.effects import *'

如果沒有定義?__all__from?sound.effects?import?*?語句?不會?把包?sound.effects?中的所有子模塊都導入到當前命名空間;它只是確保包?sound.effects?已被導入(可能還會運行?__init__.py?中的任何初始化代碼),然后再導入包中定義的任何名稱。 這包括由?__init__.py?定義的任何名稱(以及顯式加載的子模塊)。 它還包括先前?import?語句顯式加載的包里的任何子模塊。 請看以下代碼:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

在本例中,echo?和?surround?模塊被導入到當前命名空間,因為在執行?from...import?語句時它們已在?sound.effects?包中定義了。 (當定義了?__all__?時也是如此)。

雖然,可以把模塊設計為用?import?*?時只導出遵循指定模式的名稱,但仍不提倡在生產代碼中使用這種做法。

記住,使用?from?package?import?specific_submodule?沒有任何問題! 實際上,除了導入模塊使用不同包的同名子模塊之外,這種方式是推薦用法。

6.4.2.?相對導入

當包由多個子包構成(如示例中的?sound?包)時,可以使用絕對導入來引用同級包的子模塊。 例如,如果?sound.filters.vocoder?模塊需要使用?sound.effects?包中的?echo?模塊,它可以使用?from?sound.effects?import?echo

你還可以編寫相對導入代碼,即使用?from?module?import?name?形式的 import 語句。 這些導入使用前導點號來表示相對導入所涉及的當前包和上級包。 例如對于?surround?模塊,可以使用:

from . import echo
from .. import formats
from ..filters import equalizer

注意,相對導入基于當前模塊名。因為主模塊名永遠是?"__main__"?,所以如果計劃將一個模塊用作 Python 應用程序的主模塊,那么該模塊內的導入語句必須始終使用絕對導入。

6.4.3.?多目錄中的包

包還支持一個特殊屬性?__path__?。在包的?__init__.py?中的代碼被執行前,該屬性被初始化為一個只含一項的列表,該項是一個字符串,是 __init__.py 所在目錄的名稱。可以修改此變量;這樣做會改變在此包中搜索模塊和子包的方式。

這個功能雖然不常用,但可用于擴展包中的模塊集。

備注

1

實際上函數定義也是被執行的語句;模塊級函數定義的執行會將函數名稱添加到模塊的全局命名空間

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/168087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168087.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手把手教你安裝 Visual Studio 2022 及其簡單使用

軟件下載 打開 Visual Studio 官網&#xff0c;個人選擇免費的Community社區版就夠用了。 軟件安裝 雙擊運行安裝程序&#xff1a; 點擊繼續 即可&#xff1a; 等待加載完成&#xff1a; 可以看到 Visual Studio 2022 對應不同的開發需求提供了若干工作負載&#xff0c;這里以…

?3ds Max插件CG MAGIC圖形板塊為您提升線條效率!

?通過3ds Max軟件進行繪圖操作時&#xff0c;大多絆住各位設計師們作圖速度的往往都是一些細微的瑣事&#xff0c;重復一變一變的調整修改等問題。 今天說到這個繪圖線條來回調整解決方法就是3ds Max插件CG MAGIC。 Max插件CG MAGIC作為一款智能化的輔助插件&#xff0c;致力于…

flutter編譯和構建鴻蒙應用程序(windows環境)

flutter編譯和構建鴻蒙應用程序&#xff08;windows環境&#xff09; 問題背景 針對 OpenHarmony 的 Flutter 版本已經開源&#xff0c;參考 https://gitee.com/openharmony-sig/flutter_flutter。 本文為實踐該流程&#xff0c;實現flutter打包鴻蒙hap包的流程。目前流程已經…

flink的java.lang.IllegalStateException: Buffer pool is destroyed 異常

背景 最近flink的在線應用出現錯誤java.lang.IllegalStateException: Buffer pool is destroyed&#xff0c;本文記錄下這個錯誤的原因 錯誤原因 詳細的日志堆棧如下: Caused by: java.lang.IllegalStateException: Buffer pool is destroyed. at org.apache.flink.runtime…

Ps:畫筆工具的基本操作

畫筆工具 Brush Tool是 Ps 中最常用的工具&#xff0c;廣泛地用于繪畫與修飾工作。 雖然多數操作可在畫筆工具的工具選項欄中選擇執行&#xff0c;但是如果能記住相應的快捷鍵可大大提高工作效率。 熟練掌握畫筆工具的操作對于使用其他工具也非常有益&#xff0c;因為 Ps 中許多…

CSS-長度單位篇

px&#xff1a;像素em&#xff1a;相對元素font-size的倍數rem&#xff1a;相對根字體大小&#xff0c;html標簽就是根%&#xff1a;相對父元素計算 注意&#xff1a;CSS中設置長度&#xff0c;必須加單位&#xff0c;否則樣式無效&#xff01;

Maven - 打包之爭:Jar vs. Shade vs. Assembly

文章目錄 Pre概述Jar 打包方式_maven-jar-pluginOverview使用官方文檔 Shade 打包方式_maven-shade-pluginOverview使用將部分jar包添加或排除將依賴jar包內部資源添加或排除自動將所有不使用的類排除將依賴的類重命名并打包進來 &#xff08;隔離方案&#xff09;修改包的后綴…

ElasticSearch之cat component templates API

命令樣例如下&#xff1a; curl -X GET "https://localhost:9200/_cat/component_templates?vtrue&pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; name …

Qt/QML編程學習之心得:一個QML工程的學習筆記(十)

前言: 到底什么是Qt Quick呢?因為Qt Quick是Qt新引入的,Qt Quick由Qt Quick模塊提供,它是一個編寫QML應用的標準庫。Qt Quick模塊提供了兩種接口:使用QML語言創建應用的QML接口和使用C++語言擴展QML的C++接口。使用Qt Quick模塊,設計人員和開發人員可以輕松地構建流暢的…

【自主探索】基于 frontier_exploration 的單個機器人自主探索建圖

文章目錄 一、概述1、功能2、要求 二、使用方法1、用于運行演示2、用于開發人員2.1. 探索無/地圖數據2.2. 使用 /map 數據進行探索 三、提供的組件1、explore_client1.1. 調用的操作1.2. 訂閱主題1.3. 發布主題 2、explore_server2.1. 提供的操作2.2. 調用的操作2.3. 調用的服務…

【科技素養】藍橋杯STEMA 科技素養組模擬練習試卷6

1、將一個空塑料袋與一個裝滿空氣的塑料袋放到秤上稱重。在兩個塑料袋本身完全一樣的情況下&#xff0c;得出的結果會是 A、空塑料袋更重 B、裝滿空氣的塑料袋更重 C、兩個塑料袋一樣重 D、無法判斷 答案&#xff1a;C 2、全球變暖帶來的一個主要影響就是海平面的上升。造…

web前端開發基礎----標準流布局和非標準流布局

1&#xff0c;標準流布局 標準流&#xff0c;也稱文檔流或普通流&#xff0c;是所有元素默認的布局方式。 在標準流中&#xff0c;元素按照其在 HTML 中出現的順序&#xff0c;自上而下依次排列&#xff0c;并占據其父容器內的可用空間。 標準流中的元素按照其自然尺寸和位置進…

uniapp實現多時間段設置

功能說明&#xff1a; 1 點擊新增時間&#xff0c;出現一個默認時間段模板&#xff0c;不能提交 2 點擊“新增時間文本”&#xff0c;彈出彈窗&#xff0c;選擇時間&#xff0c;不允許開始時間和結束時間同時為00:00&#xff0c; <view class"item_cont"> …

TCP/IP協議:最流行的電子郵件協議SMTP(簡單郵件傳輸協議)詳解

SMTP 是一種電子郵件協議&#xff0c;用于通過互聯網從一個電子郵件帳戶向另一個電子郵件帳戶發送電子郵件。它是TCP/IP協議應用層的一部分。作為一種電子郵件協議&#xff0c;它建立了不同電子郵件客戶端和帳戶之間輕松信息交換的規則。這樣&#xff0c;簡單郵件傳輸協議就可以…

求最小的起始正整數

題目描述 給你一個整數數組 nums 。你可以選定任意的 正數 startValue 作為初始值。 你需要從左到右遍歷 nums 數組&#xff0c;并將 startValue 依次累加上 nums 數組中的值。 請你在確保累加和始終大于等于 1 的前提下&#xff0c;選出一個最小的 正數 作為 startValue 。…

【Rust 日報】2023-11-23 - egui 0.24 發布

項目 - egui 0.24 發布 egui 是一個易于使用的 Rust GUI 庫&#xff0c;支持在本地環境和瀏覽器中運行。 egui 0.24 的重要新特性是多視窗功能。在支持的后端上&#xff08;如eframe&#xff09;&#xff0c;用戶可以利用全新的 viewport API 同時生成多個本機窗口。 此外&…

Git 的基本概念和使用方式。

Git 是一個開源的分布式版本控制系統&#xff0c;它可以記錄代碼的修改歷史&#xff0c;跟蹤文件的版本變化&#xff0c;并支持多人協同開發。Git 的基本概念包括&#xff1a; 1. 倉庫&#xff08;Repository&#xff09;&#xff1a;存放代碼和版本歷史記錄的地方。 2. 分支…

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用

ArkUI開發進階—@Builder函數@BuilderParam裝飾器的妙用與場景應用 HarmonyOS,作為一款全場景分布式操作系統,為了推動更廣泛的應用開發,采用了一種先進而靈活的編程語言——ArkTS。ArkTS是在TypeScript(TS)的基礎上發展而來,為HarmonyOS提供了豐富的應用開發工具,使開…

Educational Codeforces Round 158 (Rated for Div. 2)(A~E)(貪心,樹形DP)

A - Line Trip 題意&#xff1a;有一條路&#xff0c;可以用一條數線來表示。你位于數線上的點 0 &#xff0c;你想從點 0 到點 x &#xff0c;再回到點 0。你乘汽車旅行&#xff0c;每行駛 1個單位的距離要花費 1 升汽油。當您從點 0出發時&#xff0c;汽車已加滿油(油箱中的…

麒麟linux離線安裝dotnet core

1. 下載 dotnet core,以3.1為例 下載地址: 下載 .NET Core 3.1 (Linux、macOS 和 Windows) 查看linux cpu類型,然后根據類型下載 uname -m #結果是: aarch64 2. 放到指定目錄,比如:/usr/dotnet 3. 解壓dotnet-sdk-3.1.426-linux-arm64.tar.gz cd /usr/dotnet tar –zxvf a…