12.模塊

一、實(shí)驗(yàn)?zāi)康?/h4>
  • 解釋器
  • 模塊的導(dǎo)入
  • 默認(rèn)/第三方模塊介紹
  • 命令行參數(shù)

二、知識要點(diǎn)

1.解釋器

實(shí)驗(yàn)1中我們解釋了在linux系統(tǒng)下解釋器的使用,在本文中我想通過學(xué)習(xí)Win32系統(tǒng)中解釋器來進(jìn)行復(fù)習(xí)。Python的編程模式分為兩種:交互式,腳本式,我們可以通過Win+R在運(yùn)行框中輸入cmd來啟動命令提示符,當(dāng)我們配置好Python環(huán)境時在命令提示符中輸入python并按下enter此時即可啟動Python的解釋器,如圖所示:

交互式編程

在這個窗口中輸入python語句就可以直接得到運(yùn)行的結(jié)果,這就是交互式編程。而我們通過記事本或者其他文本編輯器事先在文檔中輸入Python語句并保存為.py文件,通過命令提示符調(diào)用該文件模式成為腳本式,例如,我在路徑:D:\\python中保存了一個名為hello.py的腳本文件,通過:

腳本式編程

可以發(fā)現(xiàn)Python解釋器輸出了腳本的內(nèi)容。

2.模塊

當(dāng)我們退出解釋器再進(jìn)入時,我們定義的所有方法和變量就全部消失了,為此Python提供了一個方法,把這些定義存放在文件中,為一些腳本或者交互式的解釋器實(shí)例使用,這個文件就稱之為模塊。


模塊是一個包含了所有我們定義的函數(shù)和變量的文件,其后綴名為.py。模塊可以被別的程序引入,以使用該模塊中的函數(shù)等功能,這也是使用Python標(biāo)準(zhǔn)庫的方法。


import sys

print('命令行參數(shù)如下:')
for i in sys.argv:
    print(i)

print('\n\nPython路徑為:', sys.path, '\n')

我們通過命令提示符輸入:

python module.py 1 2

輸出為:

命令行參數(shù)如下:
module.py
1
2


Python路徑為: ['F:\\Python\\12', 'C:\\Users\\zzzzh\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\zzzzh\\AppDa
ta\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\zzzzh\\AppData\\Local\\Programs\\Python\\Python38\\lib', 'C:\\Users\\zzzzh\\Ap
pData\\Local\\Programs\\Python\\Python38', 'F:\\Python\\venv', 'F:\\Python\\venv\\lib\\site-packages', 'F:\\Python\\venv\\lib\\site-pack
ages\\setuptools-40.8.0-py3.8.egg', 'F:\\Python\\venv\\lib\\site-packages\\pip-19.0.3-py3.8.egg']

其中:


  • import sys 引入 python 標(biāo)準(zhǔn)庫中的sys.py模塊;這是引入某一模塊的方法。
  • sys.argv 是一個包含命令行參數(shù)的列表。
  • sys.path 包含了一個 Python 解釋器自動查找所需模塊的路徑的列表。

2.1 import
想使用 Python 源文件,只需在另一個源文件里執(zhí)行 import 語句,語法如下:

import module1[, module2[,... moduleN]

當(dāng)解釋器遇到 import 語句,如果模塊在當(dāng)前的搜索路徑就會被導(dǎo)入。搜索路徑是一個解釋器會先進(jìn)行搜索的所有目錄的列表。例如我們創(chuàng)建一個print_f模塊:

def print_f( par ):
    print ("Hello : ", par)
    return

將上述文件保存為print_f.py,在同一目錄創(chuàng)建新腳本test.py,在腳本中輸入:

# 導(dǎo)入模塊
import print_f

# 調(diào)用模塊中的函數(shù)
print_f.print_f("hello")

運(yùn)行會輸出:

Hello :  hello

一個模塊只會被導(dǎo)入一次,不管你執(zhí)行了多少次import,這樣可以防止導(dǎo)入的模塊被多次執(zhí)行,當(dāng)我們使用import語句時,Python解釋器就在他所具有的搜索路徑中搜索模塊,搜索路徑是由一系列目錄名構(gòu)成的,也可以通過定義環(huán)境變量的方式來確定搜索路徑。搜索路徑存儲在sys.path變量中:

import sys
print(sys.path)

我們會得到:

['F:\\Python\\12', 'F:\\Python', 'C:\\Users\\zzzzh\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\zzzzh\\AppData\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\zzzzh\\AppData\\Local\\Programs\\Python\\Python38\\lib', 'C:\\Users\\zzzzh\\AppData\\Local\\Programs\\Python\\Python38', 'F:\\Python\\venv', 'F:\\Python\\venv\\lib\\site-packages', 'F:\\Python\\venv\\lib\\site-packages\\setuptools-40.8.0-py3.8.egg', 'F:\\Python\\venv\\lib\\site-packages\\pip-19.0.3-py3.8.egg']

我們可以發(fā)現(xiàn),sys.path輸出是一個列表,其中第一項(xiàng)是當(dāng)前目錄,通過了解了搜索路徑的概念,我們就可以在腳本中修改sys.path來引入一些不在搜索路徑中的模塊。有關(guān)跨目錄搜索的問題我將會在另外的文章中詳細(xì)解釋。


2.2 import……from語句
Python 的 from 語句讓你從模塊中導(dǎo)入一個指定的部分到當(dāng)前命名空間中,語法如下:

from modname import name1[, name2[, ... nameN]]

我們創(chuàng)建一個名為Tmodule.py的模塊,在其中寫入如下代碼:

def module_1(var):
    print("模塊一已調(diào)用", var)


def module_2(var):
    print("模塊二已調(diào)用", var)

在同一目錄創(chuàng)建test.py,在test.py腳本中輸入:

from Tmodule import module_1

module_1(1)
module_2(1)

運(yùn)行結(jié)果為:

模塊一已調(diào)用 1
Traceback (most recent call last):
  File "F:/Python/12/test.py", line 8, in <module>
    module_2(1)
NameError: name 'module_2' is not defined

可以發(fā)現(xiàn),通過from……import語句,引入了Tmodule模塊中的module_1函數(shù)而未引入module_2函數(shù)。


我們可以通過from modname import *來導(dǎo)入一個模塊中的所有項(xiàng)目,但是這種聲明不該被過多的使用,這是因?yàn)椋K除了方法定義,還可以包括可執(zhí)行的代碼。這些代碼一般用于初始化這個模塊,這些代碼只有在第一次導(dǎo)入時才會被執(zhí)行,每個模塊有鴿子獨(dú)立的符號表,在模塊內(nèi)部為所有的函數(shù)作為全局符號表來使用,當(dāng)你將已有的模塊導(dǎo)入你的項(xiàng)目時,被導(dǎo)入的模塊的名稱將被放入當(dāng)前操作的項(xiàng)目符號表中,而如果已有模塊中與你的項(xiàng)目中的命名、定義相同,就會產(chǎn)生覆蓋問題。


2.3 __name__屬性
一個模塊被另一個程序第一次引入時,其主程序?qū)⑦\(yùn)行,而如果我們想在模塊被引入的時候模塊中的某一程序塊不執(zhí)行,我們可以使用__name__屬性來使該程序塊僅在該模塊自身運(yùn)行時運(yùn)行,例如我們在目錄下創(chuàng)建name.py,在其中輸入:

if __name__ == '__main__':
    print("我正在運(yùn)行")
else:
    print("我來自其他模塊")

我們執(zhí)行該腳本,會輸出我正在運(yùn)行,如果我們在另一腳本中調(diào)用該模塊:import name會輸出我來自其他模塊

2.4 dir()函數(shù)
內(nèi)置的函數(shù) dir() 可以找到模塊內(nèi)定義的所有名稱。以一個字符串列表的形式返回:
例如我們在test.py中引入上文創(chuàng)建的所有腳本:

import name
import module
import Tmodule
import Delimiter

print(dir(name))
print(dir(module))
print(dir(Tmodule))
print(dir(Delimiter))

在運(yùn)行的時候會輸出:

*
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'i', 'sys']
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'module_1', 'module_2']
['Less_d', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'mult_d', 'plus_d']

*的內(nèi)容為調(diào)用模塊執(zhí)行的程序


dir()函數(shù)不僅僅能顯示用戶自定義模塊中的名稱,只要是一個模塊,dir()函數(shù)都可顯示。


拓展:標(biāo)準(zhǔn)模塊
Python本身帶著一些標(biāo)準(zhǔn)的模塊庫,其中有些模塊被直接構(gòu)建在解析器里,這些雖然不是一些語言內(nèi)置的功能,但是他卻能很高效的使用,甚至是系統(tǒng)級調(diào)用也沒問題。這些組件會根據(jù)不同的操作系統(tǒng)進(jìn)行不同形式的配置,比如 winreg 這個模塊就只會提供給 Windows 系統(tǒng)。應(yīng)該注意到這有一個特別的模塊 sys ,它內(nèi)置在每一個 Python 解析器中。我們可以在Python的解釋器中輸入:

>>> help()

Welcome to Python 3.8's help utility!

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at https://docs.python.org/3.8/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics".  Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".

help> modules

Please wait a moment while I gather a list of all available modules...

Delimiter           _tkinter            glob                searchpath
Tmodule             _tracemalloc        gzip                secrets
__future__          _warnings           hashlib             select
_abc                _weakref            heapq               selectors
_ast                _weakrefset         hmac                setuptools
_asyncio            _winapi             html                shelve
_bisect             _xxsubinterpreters  http                shlex
_blake2             abc                 idlelib             shutil
_bootlocale         aifc                imaplib             signal
_bz2                antigravity         imghdr              site
_codecs             argparse            imp                 smtpd
_codecs_cn          array               importlib           smtplib
_codecs_hk          ast                 inspect             sndhdr
_codecs_iso2022     asynchat            io                  socket
_codecs_jp          asyncio             ipaddress           socketserver
_codecs_kr          asyncore            itertools           sqlite3
_codecs_tw          atexit              json                sre_compile
_collections        audioop             keyword             sre_constants
_collections_abc    base64              lib2to3             sre_parse
_compat_pickle      bdb                 linecache           ssl
_compression        binascii            locale              stat
_contextvars        binhex              logging             statistics
_csv                bisect              lzma                string
_ctypes             builtins            mailbox             stringprep
_ctypes_test        bz2                 mailcap             struct
_datetime           cProfile            marshal             subprocess
_decimal            calendar            math                sunau
_dummy_thread       cgi                 mimetypes           symbol
_elementtree        cgitb               mmap                symtable
_functools          chunk               module              sys
_hashlib            cmath               modulefinder        sysconfig
_heapq              cmd                 msilib              tabnanny
_imp                code                msvcrt              tarfile
_io                 codecs              multiprocessing     telnetlib
_json               codeop              name                tempfile
_locale             collections         netrc               test
_lsprof             colorsys            nntplib             testmodule
_lzma               compileall          nt                  textwrap
_markupbase         concurrent          ntpath              this
_md5                configparser        nturl2path          threading
_msi                contextlib          numbers             time
_multibytecodec     contextvars         opcode              timeit
_multiprocessing    copy                operator            tkinter
_opcode             copyreg             optparse            token
_operator           crypt               os                  tokenize
_osx_support        csv                 parser              trace
_overlapped         ctypes              pathlib             traceback
_pickle             curses              pdb                 tracemalloc
_py_abc             dataclasses         pickle              tty
_pydecimal          datetime            pickletools         turtle
_pyio               dbm                 pip                 turtledemo
_queue              decimal             pipes               types
_random             difflib             pkg_resources       typing
_sha1               dis                 pkgutil             unicodedata
_sha256             distutils           platform            unittest
_sha3               doctest             plistlib            urllib
_sha512             dummy_threading     poplib              uu
_signal             easy_install        posixpath           uuid
_sitebuiltins       email               pprint              venv
_socket             encodings           print_f             warnings
_sqlite3            ensurepip           profile             wave
_sre                enum                pstats              weakref
_ssl                errno               pty                 webbrowser
_stat               faulthandler        py_compile          winreg
_statistics         filecmp             pyclbr              winsound
_string             fileinput           pydoc               wsgiref
_strptime           fnmatch             pydoc_data          xdrlib
_struct             formatter           pyexpat             xml
_symtable           fractions           queue               xmlrpc
_testbuffer         ftplib              quopri              xxsubtype
_testcapi           functools           random              zipapp
_testconsole        gc                  re                  zipfile
_testimportmultiple genericpath         reprlib             zipimport
_testmultiphase     getopt              rlcompleter         zlib
_thread             getpass             runpy
_threading_local    gettext             sched

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose name or summary contain the string "spam".

我們通過help(str)可以得到字符串所有可用方法,其他內(nèi)容類似。較為常用的模塊與第三方模塊我將在其他文章中寫入。


3.包

包是一種管理 Python 模塊命名空間的形式,采用"點(diǎn)模塊名稱"。他能有效的避免不同庫之間的模塊重名的情況,如下圖的目錄中:


目錄只有包含一個叫做__init__.py的文件才會被認(rèn)作是一個包,最簡單的情況,放一個空的文件__init__.py就可以了。用戶可以每次只導(dǎo)入一個包里面的特定模塊,比如:

import people.type.color

這將會導(dǎo)入子模塊:people.type.color。 他必須使用全名去訪問:

people.type.color.eye(input, output)

還有一種導(dǎo)入子模塊的方法是:

from people.type import color

這同樣會導(dǎo)入子模塊: color,并且他不需要那些冗長的前綴,所以他可以這樣使用:

color.eye(input,output)

還有一種變化就是直接導(dǎo)入一個函數(shù)或者變量:

from people.type.color import eye

同樣的,這種方法會導(dǎo)入子模塊: color,并且可以直接使用他的 eye() 函數(shù):

eye(input,output)

如果我們使用from people.type import *,Python 會進(jìn)入文件系統(tǒng),找到這個包里面所有的子模塊,一個一個的把它們都導(dǎo)入進(jìn)來。但是在Windows系統(tǒng)中這種方法可能會出現(xiàn)問題,因?yàn)閃indows是一個不區(qū)分大小寫的系統(tǒng),因此,通常在目錄中的__init__.py文件中會存在一個名為__all__的列表變量,比如在people/type/__init__.py文件中包含代碼:

__all__ = ["color", "like"]

這表示當(dāng)我們使用from people.type import *這種用法時,只會導(dǎo)入包里面的這兩個子模塊,如果__all__沒有定義,則使用from people.type import *時不會導(dǎo)入包people.type中的任何子模塊,他只是把包people.type和她里面定義的所有內(nèi)容導(dǎo)入進(jìn)來。并且他不會破壞掉我們在這句話之前導(dǎo)入的所有明確指定的模塊。


無論是隱式的還是顯式的相對導(dǎo)入都是從當(dāng)前模塊開始的。主模塊的名字永遠(yuǎn)是"__main__",一個Python應(yīng)用程序的主模塊,應(yīng)當(dāng)總是使用絕對路徑引用。包還提供一個額外的屬性__path__。這是一個目錄列表,里面每一個包含的目錄都有為這個包服務(wù)的__init__.py,你得在其他__init__.py被執(zhí)行前定義??梢孕薷倪@個變量,用來影響包含在包里面的模塊和子包。這個功能并不常用,一般用來擴(kuò)展包里面的模塊。

三、實(shí)驗(yàn)內(nèi)容

1.分隔符

寫一個模塊用于輸出至少三種分隔符,調(diào)用包中的函數(shù),參數(shù)輸入數(shù)字,打印該數(shù)量的分割符,分隔符可以包括*,-,+


  • 代碼:
# ""
# Delimiter Modules
# ============
# ""

def plus_d(num):
    print("+"*num)

def Less_d(num):
    print("-"*num)

def mult_d(num):
    print("*"*num)
  • 結(jié)果:

我們通過在解釋器或者其他腳本中輸入:

import Delimiter

Delimiter.plus_d(10)
Delimiter.Less_d(10)
Delimiter.mult_d(10)

輸出為:

++++++++++
----------
**********

四、實(shí)驗(yàn)結(jié)果

1.下載文件程序

首先我們需要安裝第三方庫requests模塊,具體流程如下:

  • 在Python圖標(biāo)上單擊右鍵找到屬性,單擊打開文件位置??截悽谥械穆窂剑ㄈ绻谝淮尾榭次募恢檬强旖莘绞娇梢灾貜?fù)本操作)
拷貝路徑
  • 運(yùn)行命令提示符,在命令提示符中輸入:cd 你拷貝的路徑,回車之后再輸入cd Scripts并按下回車切換至pip文件目錄,pip是用于安裝第三方模塊的。
切換目錄
  • 繼續(xù)輸入pip3 install requests,此時將會下載安裝requests模塊
安裝模塊
  • 安裝成功后可以在Python解釋器中輸入dir(requests)得到該模塊中的名稱。

當(dāng)我們進(jìn)行到這一步,在命令提示符中輸入import requests已經(jīng)可以運(yùn)行了,但是在Pycharm中卻缺少該庫,我們可以通過File->Settings:

Pycharm

然后,在Project Interpreter中找到+并點(diǎn)擊:
Project Interpreter

搜索requests并安裝:
Requests

安裝完成之后即可在Pycharm中使用。


  • 代碼:
import requests

def download(url):
    '''
    從指定的 URL 中下載文件并存儲到當(dāng)前目錄
    url: 要下載頁面內(nèi)容的網(wǎng)址
    '''
    # 檢查 URL 是否存在
    try:
        req = requests.get(url)
    except requests.exceptions.MissingSchema:
        print('Invalid URL "{}"'.format(url))
        return
    # 檢查是否成功訪問了該網(wǎng)站
    if req.status_code == 403:
        print('You do not have the authority to access this page.')
        return
    filename = url.split('/')[-1]
    with open(filename, 'w') as fobj:
        fobj.write(req.content.decode('utf-8'))
    print("Download over.")

if __name__ == '__main__':
    url = input('Enter a URL: ')
    download(url)
  • 結(jié)果:
Enter a URL: https://codeload.github.com/iissnan/hexo-theme-next/zip/v5.1.4

敲擊回車文件開始下載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 模塊和包 一 模塊 1 什么是模塊? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是...
    go以恒閱讀 2,347評論 0 4
  • If you quit from the Python interpreter and enter it agai...
    linyk3閱讀 461評論 0 0
  • [TOC] 最開始寫程序的時候,都是一個文件里輸入幾行源碼(python 的一個 web 框架bottle就特別強(qiáng)...
    人世間閱讀 5,890評論 1 10
  • 用 python 解釋器來編程從 Python 解釋器退出再進(jìn)入,那么你定義的所有的方法和變量就都消失了。 為此...
    chen_000閱讀 580評論 0 3
  • 一、模塊 1、模塊和導(dǎo)入 當(dāng)程序代碼量變得相當(dāng)大、邏輯結(jié)構(gòu)變得非常復(fù)雜的時候,我們最好把代碼按照邏輯和功能劃分成一...
    常大鵬閱讀 3,270評論 0 9

友情鏈接更多精彩內(nèi)容