<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Python 模塊 > 原文: [http://zetcode.com/lang/python/modules/](http://zetcode.com/lang/python/modules/) 在 Python 教程的這一部分中,我們將使用 Python 模塊。 幾個示例說明了如何創建和使用 Python 模塊。 模塊是一個包含 Python 代碼的文件。 Python 模塊具有`.py`擴展名。 可以使用以下方法管理 Python 代碼: * 函數 * 類 * 模組 * 包裝 Python 模塊用于組織 Python 代碼。 例如,與數據庫相關的代碼位于數據庫模塊內部,安全代碼位于安全模塊中,等等。較小的 Python 腳本可以具有一個模塊。 但是較大的程序分為幾個模塊。 模塊組合在一起形成包裝。 ## Python 模塊名稱 模塊名稱是帶有`.py`擴展名的文件名。 當我們有一個名為`empty.py`的文件時,模塊名稱為空。 `__name__`是一個變量,其中包含要引用的模塊的名稱。 當前模塊,正在執行的模塊(也稱為主模塊)有一個特殊名稱:`'__main__'`。 使用此名稱,可以從 Python 代碼中引用它。 當前工作目錄中有兩個文件:`empty.py`和`test_empty.py`。 第二個模塊是執行的主模塊。 導入第一個模塊。 使用`import`關鍵字導入模塊。 `empty.py` ```py """ An empty module """ ``` 這是`empty.py`模塊。 `test_empty.py` ```py #!/usr/bin/env python import empty import sys print(__name__) print(empty.__name__) print(sys.__name__) ``` 在此代碼示例中,我們導入兩個模塊:內置模塊`sys`和一個自定義模塊`empty`。 我們將模塊的名稱打印到控制臺。 ```py $ ./test_empty.py __main__ empty sys ``` 正在執行的模塊的名稱始終為`'__main__'`。 其他模塊以文件名命名。 可以使用`import`關鍵字將模塊導入其他模塊。 ## Python 定位模塊 導入模塊時,解釋器首先搜索具有該名稱的內置模塊。 如果找不到,它將在變量`sys.path`給定的目錄列表中搜索。 `sys.path`是一個字符串列表,用于指定模塊的搜索路徑。 它由當前工作目錄,在`PYTHONPATH`環境變量中指定的目錄名稱以及一些其他與安裝有關的目錄組成。 如果找不到該模塊,則會引發`ImportError`。 `locating_modules.py` ```py #!/usr/bin/env python import sys import textwrap sp = sorted(sys.path) dnames = ', '.join(sp) print(textwrap.fill(dnames)) ``` 該腳本從`sys.path`變量打印所有目錄。 ```py import textwrap ``` `textwrap`模塊用于輕松設置段落格式。 ```py sp = sorted(sys.path) ``` 我們從`sys.path`變量中檢索目錄列表并對它們進行排序。 ```py dnames = ', '.join(sp) ``` 我們從列表中取出一個字符串。 ```py $ ./locating_modules.py /home/janbodnar/.local/lib/python3.5/site-packages, /home/janbodnar/PycharmProjects/Simple, /home/janbodnar/PycharmProjects/Simple, /usr/lib/python3.5, /usr/lib/python3.5/lib-dynload, /usr/lib/python3.5/plat-x86_64-linux- gnu, /usr/lib/python3/dist-packages, /usr/lib/python35.zip, /usr/local/lib/python3.5/dist-packages ``` 這是一個示例輸出。 ## Python `import`關鍵字 `import`關鍵字可以以多種方式使用。 ```py from module import * ``` 此構造會將所有 Python 定義導入另一個模塊的名稱空間。 有一個例外。 不導入以下劃線字符`_`開頭的對象。 預期它們只能由導入的模塊在內部使用。 不建議使用這種方式導入模塊。 `everything.py` ```py #!/usr/bin/python from math import * print(cos(3)) print(pi) ``` 此導入構造已從內置`math`模塊導入了所有定義。 我們可以直接調用數學函數,而無需引用`math`模塊。 ```py $ ./everything.py -0.9899924966004454 3.141592653589793 ``` 使用此導入構造可能會導致名稱空間污染。 我們可能有多個同名的對象,并且它們的定義可以被覆蓋。 `pollution.py` ```py #!/usr/bin/env python from math import * pi = 3.14 print(cos(3)) print(pi) ``` 該示例將在控制臺上打印 3.14。 這可能不是我們想要的。 在大型項目中,命名空間污染可能變得至關重要。 ## 未導入的 Python 對象 以下示例顯示了未使用此`import`構造導入的定義。 `names.py` ```py #!/usr/bin/env python """ names is a test module """ _version = 1.0 names = ["Paul", "Frank", "Jessica", "Thomas", "Katherine"] def show_names(): for i in names: print(i) def _show_version(): print(_version) ``` 這是`names.py`模塊。 `test_names.py` ```py #!/usr/bin/env python from names import * print(locals()) show_names() ``` `_version`變量和`_show_version()`函數未導入到`test_names`模塊中。 我們在命名空間中看不到它們。 `locals()`函數為我們提供了模塊中所有可用的定義。 ## 導入特定對象 使用`from`和`import`關鍵字,可以僅導入某些對象。 ```py from module import fun, var ``` 此導入構造僅從模塊導入特定對象。 這樣,我們僅導入我們需要的定義。 `import_specific.py` ```py #!/usr/bin/python from math import sin, pi print(sin(3)) print(pi) ``` 我們從`math`模塊導入兩個對象。 我們無法引用其他定義(例如`cos`函數)。 `imnames.py` ```py #!/usr/bin/python from names import _version, _show_version print(_version) _show_version() ``` 我們也可以導入下劃線開頭的定義。 但這是一個不好的做法。 ```py $ ./imnames.py 1.0 1.0 ``` ## Python 導入模塊 最后一種構造使用最廣泛。 ```py import module ``` 它防止名稱空間污染,并允許從模塊訪問所有定義。 `impmod.py` ```py #!/usr/bin/env python import math pi = 3.14 print(math.cos(3)) print(math.pi) print(math.sin(3)) print(pi) ``` 在這種情況下,我們通過模塊名稱引用定義。 如我們所見,我們可以使用兩個`pi`變量。 我們的定義來自`math`模塊。 ```py $ ./impmod.py -0.9899924966004454 3.141592653589793 0.1411200080598672 3.14 ``` ## Python 別名模塊 我們可以使用`as`關鍵字為模塊創建別名。 `importas.py` ```py #!/usr/bin/python # importas.py import math as m print(m.pi) print(m.cos(3)) ``` 我們可以更改引用模塊的名稱。 為此,我們使用`as`關鍵字。 ```py $ ./importas.py 3.14159265359 -0.9899924966 ``` ## `ImportError` 如果無法導入模塊,則會引發`ImportError`。 `importerror.py` ```py #!/usr/bin/env python try: import empty2 except ImportError as e: print('Failed to import:', e) ``` 我們尚未創建`empty2`模塊。 因此引發了異常。 ```py $ ./importerror.py Failed to import: No module named empty2 ``` 示例輸出。 ## 執行 Python 模塊 模塊可以導入其他模塊,也可以執行。 模塊作者經常創建測試套件來測試模塊。 僅當模塊作為腳本執行時,`__name__`屬性等于`'__main__'`。 我們將在斐波那契模塊上對此進行演示。 斐波那契數是一個數字序列,其中每個數字都是其兩個直接前輩的總和。 `fibonacci.py` ```py #!/usr/bin/env python """ A module containing the fibonacci function. """ def fib(n): a, b = 0, 1 while b < n: print(b, end=" ") (a, b) = (b, a + b) # testing if __name__ == '__main__': fib(500) ``` 通常可以照常導入該模塊。 該模塊也可以執行。 ```py $ ./fibonacci.py 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ``` 如果確實導入了`fibonacci`模塊,則不會自動執行測試。 ```py >>> import fibonacci as fib >>> fib.fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 ``` 導入了`fibonacci`模塊,并執行了`fib()`函數。 ## Python `dir`函數 內置的`dir()`函數提供了包含模塊定義名稱的字符串排序列表。 `dirfun.py` ```py #!/usr/bin/env python """ This is dirfun module """ import math, sys version = 1.0 names = ["Paul", "Frank", "Jessica", "Thomas", "Katherine"] def show_names(): for i in names: print(i) print(dir()) ``` 在此模塊中,我們導入兩個系統模塊。 我們定義一個變量,一個列表和一個函數。 ```py print(dir()) ``` `dir()`函數返回模塊當前名稱空間中所有可用的名稱。 ```py $ ./dirfun.py ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'math', 'names', 'show_names', 'sys', 'version'] ``` 我們可以看到一些內置名稱,例如`'__file__'`或`'__name__'`,以及我們定義和導入的所有其他名稱。 ## Python 全局函數 `globals()`函數返回代表當前全局??名稱空間的字典。 它是全局名稱及其值的字典。 它是當前模塊的字典。 `globalsfun.py` ```py #!/usr/bin/env python import textwrap version = 1.0 def myfun(): pass gl = globals() gnames = ', '.join(gl) print(textwrap.fill(gnames)) ``` 我們使用`globals()`函數來打印當前模塊的所有全局名稱。 ```py $ ./globalsfun.py textwrap, __package__, version, __builtins__, __name__, __spec__, __doc__, gl, __cached__, myfun, __loader__, __file__ ``` 這些是當前模塊的全局名稱。 ## Python `__module__`屬性 `__module__`類屬性具有定義該類的模塊的名稱。 `animals.py` ```py """ module animals """ class Cat: pass class Dog: pass ``` 這是`animals.py`文件的內容。 我們有兩個類。 `mclass.py` ```py #!/usr/bin/env python from animals import Cat class Being: pass b = Being() print(b.__module__) c = Cat() print(c.__module__) ``` 在此代碼中,我們使用`__module__`屬性。 ```py from animals import Cat ``` 從`animals`模塊,我們導入`Cat`類。 ```py class Being: pass ``` 在當前模塊中,我們定義一個類`Being`。 ```py b = Being() print(b.__module__) ``` 創建`Being`類的實例。 我們打印其模塊的名稱。 ```py c = Cat() print(c.__module__) ``` 我們從`Cat`類創建一個對象。 我們還將在定義模塊的位置打印。 ```py $ ./mclass.py __main__ animals ``` 當前模塊的名稱為`'__main__'`。 `Cat's`模塊的名稱是動物。 本章是關于 Python 中的模塊的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看