
4.1 Python内置的标准模块
模块是开发者开发程序的利器。正是因为有了标准模块,使得开发者宛如站在巨人的肩膀上。
那么,Python到底有哪些内置的标准模块可供直接使用,又如何去获知这些模块的信息?通过以下两种方法可以查看Python内置的标准模块及其说明。
4.1.1 通过help()命令查看内置模块
通过“cmd”命令进入命令行方式,如图4-1所示。

图4-1 输入“cmd”命令
图4-2所示为命令行方式,在此方式下,可执行DOS命令,例如,复制文件用的copy命令,删除文件用的del命令等。命令行方式又被称为终端方式。

图4-2 命令行方式
然后输入并执行命令“python”,得到如图4-3所示的界面,也即进入Python终端方式。

图4-3 进入Python终端方式
在Python终端方式(命令行方式)下,执行通用帮助函数help(),出现如图4-4所示的界面。

图4-4 Python进入帮助系统界面
此时命令行提示符切换为“help>”,由图4-4所示的屏幕提示可知,通过输入相应的“modules”“keywords”“symbols”“topics”等关键词可查询模块、关键字、符号和主题。由此可见,如果输入“modules”,则可列出Python所有的内置模块,如图4-5所示,通过右侧的滑动块可上下翻看所有模块的名称。

图4-5 列举的Python内置模块名称(部分)
以下是通过粘贴得到的Python内置模块一览。
Please wait a moment while I gather a list of all available modules... __future__ _weakref heapq select _ast _weakrefset hmac selectors _asyncio _winapi html setuptools _bisect abc http shelve _blake2 aifc idlelib shlex _bootlocale antigravity imaplib shutil _bz2 argparse imghdr signal _codecs array imp site _codecs_cn ast importlib smtpd _codecs_hk asynchat inspect smtplib _codecs_iso2022 asyncio io sndhdr _codecs_jp asyncore ipaddress socket _codecs_kr atexit itertools socketserver _codecs_tw audioop json sqlite3 _collections base64 keyword sre_compile _collections_abc bdb lib2to3 sre_constants _compat_pickle binascii linecache sre_parse _compression binhex locale ssl _csv bisect logging stat _ctypes builtins lzma statistics _ctypes_test bz2 macpath string _datetime cProfile macurl2path stringprep _decimal calendar mailbox struct _dummy_thread cgi mailcap subprocess _elementtree cgitb marshal sunau _findvs chunk math symbol _functools cmath mimetypes symtable _hashlib cmd mmap sys _heapq code modulefinder sysconfig _imp codecs msilib tabnanny _io codeop msvcrt tarfile _json collections multiprocessing telnetlib _locale colorsys netrc tempfile _lsprof compileall nntplib test _lzma concurrent nt textwrap _markupbase configparser ntpath this _md5 contextlib nturl2path threading _msi copy numbers time _multibytecodec copyreg opcode timeit _multiprocessing crypt operator tkinter _opcode csv optparse token _operator ctypes os tokenize _osx_support curses parser trace _overlapped datetime pathlib traceback _pickle dbm pdb tracemalloc _pydecimal decimal pickle tty _pyio difflib pickletools turtle _random dis pip turtledemo _sha1 distutils pipes types _sha256 doctest pkg_resources typing _sha3 dummy_threading pkgutil unicodedata _sha512 easy_install platform unittest _signal email plistlib urllib _sitebuiltins encodings poplib uu _socket ensurepip posixpath uuid _sqlite3 enum pprint venv _sre errno profile warnings _ssl faulthandler pstats wave _stat filecmp pty weakref _string fileinput py_compile webbrowser _strptime fnmatch pyclbr winreg _struct formatter pydoc winsound _symtable fractions pydoc_data wsgiref _testbuffer ftplib pyexpat xdrlib _testcapi functools queue xml _testconsole gc quopri xmlrpc _testimportmultiple genericpath random xxsubtype _testmultiphase getopt re zipapp _thread getpass reprlib zipfile _threading_local gettext rlcompleter zipimport _tkinter glob runpy zlib _tracemalloc gzip sched _warnings hashlib secrets Enter any module name to get more help. Or, type"modules spam"to search for modules whose name or summary contain the string "spam".
如果要查看Python的所有关键字,则可输入并执行“keywords”命令。
help> keywords
该命令被执行后,将列出Python的所有关键字,具体结果如下:
Here is a list of the Python keywords. Enter any keyword to get more help. False def if raise None del import return True elif in try and else is while as except lambda with assert finally nonlocal yield break for not class from or continue global pass
如果要查看某个模块的详细信息,那么只需输入模块名称即可。例如,要查看poplib模块的详细信息,输入的命令如下:
help>poplib
执行该命令后,即可得到poplib模块的详细信息,如图4-6所示。如果与模块相关的信息较多,不能在当前屏幕上显示所有内容,则会自动分页显示,并在每页信息的下方显示“——more——”字样,此时按任意键可翻看剩余的内容。如果要退出查看,则只需按【Q】键即可。

图4-6 查看特定模块的详细信息(图中是poplib模块)
4.1.2 通过IDLE的【Help】菜单查看内置模块
运行Python的IDLE,进入IDLE的主界面,如图4-7所示。

图4-7 IDLE的主界面
单击图4-7中的【Help】菜单,可以看到的界面如图4-8所示。

图4-8 IDLE的【Help】菜单及其选项
单击【Python Docs】选项,或在IDLE状态下直接按【F1】键,均可进入Python的帮助系统,如图4-9所示。

图4-9 Python的帮助系统
从图4-9中可以看到,在左侧的目录栏中有很多条目,它们对应不同条目的帮助文档,其中有“The Python Standard Library(Python标准库)”,如图4-10所示,里面分门别类地详细描述了Python所有的内置模块及其使用、内置函数及其使用。

图4-10 “The Python Standard Library”条目
例如,Tkinter模块就在图4-11所示的条目里,单击它左侧的【+】即可看到该条目对应的详细信息列表。

图4-11 Tkinter模块所在的条目
4.1.3 常用内置模块及其功能介绍
对于初学者而言,Python常用的内置模块及其功能如表4-1所示。
表4-1 Python常用的内置模块及其功能

4.1.4 内置模块的主要函数(方法)简介
1.os模块
os模块用于提供系统级别的操作,其主要函数(方法)如表4-2所示。
表4-2 os模块的主要函数(方法)

2.sys模块
sys模块用于提供与解释器相关的操作,它的主要函数(方法)如表4-3所示。
表4-3 sys模块的主要函数(方法)

3.hashlib模块
hashlib模块用于提供与加密相关的操作,它代替了原先的md5和sha模块,主要提供SHA1、SHA224、SHA256、SHA384、SHA512、MD5等加密算法,这些加密算法被称为“哈希算法”。
哈希算法又被称为“摘要算法”“散列算法”,常被用于与加密相关的操作。它通过一个函数,把任意长度的数据转换为一个长度固定的字符串,通常是用十六进制表示的字符串。
关于SHA1、SHA224、SHA256、SHA384、SHA512、MD5等加密算法的详细介绍,本书不予提供,此处仅举一例以说明它的使用。
举例1:SHA256加密。
>>> import hashlib >>> hash = hashlib.sha256() >>> hash.update(bytes('admin', encoding='utf-8')) >>> print(hash.hexdigest()) 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 >>>
从上面的运行中可以看出,“admin”经SHA256加密后以十六进制表示的字符串(摘要)为8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918。
在举例1程序中涉及4个函数(方法)。
· hashlib.sha256():用于创建对象。
· hash.update():将指定字符串转换为长度固定的摘要,即加密后的字符串。注意,该函数对原字符串有编码格式要求,建议先使用bytes()函数进行编码格式转换。
· hash.hexdigest():返回以十六进制表示的字符串(摘要);如果使用hash.digest(),则返回以二进制表示的字符串(摘要)。
4.json和pickle模块
json和pickle是用于将数据序列化(格式化)的两个模块,两者均具有序列化和反序列化两类接口函数。json模块主要用于字符串与Python数据类型之间的转换,而pickle模块则用于Python特有的类型与Python的其他数据类型之间的转换。准确地说,json模块用于不同语言之间交换数据,而pickle模块只用于Python之间交换数据。json模块只能用于将Python最基本的数据类型序列化,即把常用的数据类型序列化,如列表、字典、字符串、数字,而无法用于对日期格式、类对象等进行序列化;而pickle模块则可以序列化所有的数据类型,包括类、函数。这两个模块的主要函数(方法)如表4-4所示。
表4-4 json和pickle模块包含的主要函数(方法)

5.shutil模块
shutil模块用于对文件、文件夹和压缩包进行处理,它是专门用于处理文件的高级模块。该模块的主要函数(方法)如表4-5所示。
表4-5 shutil模块的主要函数(方法)

6.logging模块
logging模块用于便捷地记录日志。
很多程序都有记录日志的需求。Python的logging模块提供了标准的日志接口,可通过该接口存储各种格式的日志。日志级别被分为5级,按级别从高到低排列分别如下。
· CRITICAL:严重错误,如出现此类错误,则表明程序已经不能继续运行。
· ERROR:一般错误,如出现此类错误,则表明软件已经不能执行某些功能。
· WARNING:表明发生一些意外,或即将发生问题,如“磁盘满了”。出现此类问题,程序尚可正常运行。
· INFO:程序按照预期在运行时发送的信息。
· DEBUG:最为详细的信息,一般只用于调试时。
该模块的主要函数(方法)如表4-6所示。
表4-6 logging模块的主要函数(方法)

7.time模块
time模块用于执行与时间相关的操作。
在Python中,时间通常有3种表示方式。
· 时间戳:指的是从1970年1月1日开始至此刻的秒数,即time.time()。
· 格式化的字符串:如2014-11-11 11:11,即time.strftime('%Y-%m-%d')。
· 结构化时间:含年、日、星期等的time.struct_time元组,即time.localtime()。
该模块的主要函数(方法)如表4-7所示。
表4-7 time模块的主要函数(方法)

8.re模块
re模块用于对Python的正则表达式执行相关操作。
正则表达式是特殊的字符序列,它可被简便地用于检查一个字符串是否与某种模式相匹配。自Python 1.5版本开始增加了re模块,它是Perl风格的正则表达式模式。凭借re模块,使Python语言拥有正则表达式的所有功能。
关于正则表达式的符号和语法,请自行查阅相关资料,此处仅列举其中的一部分。
· .:匹配除换行符以外的任意字符。
· \w:匹配字母、数字、下画线或汉字。
· \s:匹配任意的空白符。
· \d:匹配数字。
· \b:匹配单词的开始或结束。
· ^:匹配字符串的开始。
· $:匹配字符串的结束。
· *:重复零次或更多次。
· +:重复一次或更多次。
· ? :重复零次或一次。
· {n}:重复n次。
· {n, }:重复n次或更多次。如果在逗号后加m,则重复n~m次。
正则表达式举例:11位手机号码的正则表达式为phone="^1[3|4|5|8][0-9]\d{8}$"。请自行分析该正则表达式的含义。
表4-8归纳了re模块的主要函数(方法)。
表4-8 re模块的主要函数(方法)

9.random模块
random是用于操作随机数的模块。
什么是“随机数”?随机数可被分为“真随机数”和“伪随机数”两种。例如,掷骰子得到的点数是真随机数,而由计算机产生的随机数则是伪随机数。伪随机数是可预测的随机数,从严格意义上讲,它不具有随机性质,因为它通常是通过数学公式产生的,如统计分布、平方取中等。当然,在大多数应用场景下,由计算机产生的随机数已经足够“随机”,足以满足应用的需要。
什么是“随机数种子”?正如数列需要首项,产生伪随机数需要一个初值,由它计算整个序列,这个初值被称为“种子”。种子可以是固定的值,也可以是根据当前系统状态确定的不固定值。由于“种子”决定了伪随机数的随机质量,所以强烈建议使用系统的“时间戳”作为种子。默认的种子即“时间戳”。
表4-9列示了random模块的主要函数(方法)。
表4-9 random模块的主要函数(方法)

10.datetime模块
datetime模块用于对日期和时间进行操作。
Python中提供了多个对日期和时间进行操作的内置模块,包括time(时间模块)、datetime(日期时间模块)和calendar(日历模块)。
time模块是通过调用C库实现的,所以有些方法在部分平台上可能无法使用,但是它提供的大部分方法与C标准库time.h中的函数基本一致。
datetime模块是date和time模块的合集。与time模块相比,datetime模块提供的接口函数更直观、易用,功能也更强大。datetime模块有两个常量:MAXYEAR和MINYEAR,分别代表最大的年份和最小的年份,它们的值分别是9999和1。
datetime模块定义了5个类,所有对日期和时间的操作均以类的形式进行。表4-10列举了该模块中datetime类的主要方法。为了使用datetime模块,首先必须理解这些类。
表4-10 datetime模块中datetime类的主要方法

· datetime.date:表示日期的类。
· datetime.datetime:表示日期时间的类。
· datetime.time:表示时间的类。
· datetime.timedelta:表示时间间隔的类,即两个时间点的间隔。
· datetime.tzinfo:表示时区相关信息的类。
举例2:利用datetime模块得到时间差。
import time #引用time模块 from datetime import datetime #引用datetime模块中的datetime类 starttime=datetime.now() #获取当前日期时间 time.sleep(5.3) #延时5.3s endtime=datetime.now() #获取当前日期时间 print((endtime-starttime).seconds) #显示时间差中的秒数
在IDLE中运行上述程序,得到的结果如下:
5 >>>
4.2 内置模块的应用举例
4.2.1 与路径相关的应用举例
路径是在文件操作中经常被使用的信息,有绝对路径和相对路径之分。简单地说,绝对路径就是完整的路径,而相对路径就是当前路径。
以下举例是为了演示如何借助os等内置模块,在计算机上新建一个文件夹,文件夹的具体信息如下:e:\mydemo\myapp\data。
很显然,“e:\mydemo\myapp\data”就是一个绝对路径,它包含从盘符到文件夹的完整信息。为了新建该文件夹,必须首先判断是否存在“E”盘,然后判断是否存在“e:\mydemo”文件夹,接下来判断是否存在“e:\mydemo\myapp”文件夹,最后判断该文件夹下是否存在“data”文件夹。在上述判断过程中,如果发现存在相应的文件夹,则直接跳过;如果不存在,则必须新建它。
举例3:新建一个文件夹。
''' 内置模块应用举例:新建一个指定的文件夹 使用os模块 沈红卫 绍兴文理学院 机械与电气工程学院 2018年8月24日 ''' import os # 首先判断是否存在E盘 if(os.path.exists("e:/")): # 继续判断子文件夹 if(os.path.exists("e:/mydemo")): if(os.path.exists("e:/mydemo/myapp")): os.mkdir('e:/mydemo/myapp/data') else: os.mkdir('e:/mydemo/myapp') os.mkdir('e:/mydemo/myapp/data') else: os.makedirs('e:/mydemo/myapp/data') print("亲,文件夹已经为你新建好了!") else: print("对不起,你的电脑没有E盘,无法新建你的文件夹!")
从上述程序中可以看出,路径中的分隔符是“/”而不是“\”。这是因为,如果采用“\”作为分隔符,则必须写成“\\”。
4.2.2 与时间相关的应用举例
日期和时间在程序中经常被用到,使程序能自动而准确地获取当前时间信息的通常做法是使用datetime模块。
以下举例展示了如何获取当前日期和时间,可根据它举一反三地写出更多关于时间应用的程序。
举例4:显示当前日期和时间。
>>> import datetime >>> dt=datetime.datetime.now() >>> dt datetime.datetime(2018, 8, 24, 14, 49, 26, 941621) >>> print("今天是:{}年{}月{}日".format(dt[0], dt[1], dt[2])) Traceback (most recent call last): File "<pyshell#8>", line 1, in <module> print("今天是:{}年{}月{}日".format(dt[0], dt[1], dt[2])) TypeError: 'datetime.datetime' object is not subscriptable >>> type(dt) <class 'datetime.datetime'> >>> print("今天是:{}年{}月{}日".format(dt.year, dt.month, dt.day)) 今天是:2018年8月24日 >>> print("现在是:{}时{}分{}秒".format(dt.hour, dt.minute, dt.second)) 现在是:14时49分26秒 >>>
4.3 Python的内置函数
内置函数(Built-in Functions)就是Python内置的可供直接使用的函数,往往用于实现最频繁或最基本的操作。借助内置函数,可极大地方便程序开发,提高开发效能。Python 3.6提供了68个内置函数,它们可以供开发者编程时直接调用。能不能用好这些内置函数,也是检验Python学习者学习成效的一把尺子。
4.3.1 如何查看Python有哪些内置函数
为了使用内置函数,必须首先了解内置函数有哪些。那么,如何查看Python有哪些内置函数呢?查看的方法有多种,这里介绍一种最为简单的方式,具体过程如下。
运行IDLE后,选择【Help】→【Python Docs】命令(见图4-12),或直接按功能键【F1】,进入如图4-13所示的Python帮助系统。

图4-12 选择【Help】→【Python Docs】命令

图4-13 Python帮助系统
在图4-13中,选择【The Python Standard Library】,双击它或单击它左侧的【+】,可使该项内容被展开,得到如图4-14所示的内容。

图4-14 Python标准库帮助文档选项
在图4-3中,可看到【Built-in Functions】选项,单击它后出现如图4-15所示的界面,在该界面的右侧列出了Python所有的内置函数。按照列表所示,共有68个内置函数。

图4-15 Python内置函数一览表
单击其中的任何一个函数,如bin()函数,可以看到该函数的使用说明及举例,如图4-16所示。

图4-16 内置函数bin()的使用说明及举例
4.3.2 内置函数及其功能
Python所有的内置函数及其功能如表4-11所示。
表4-11 Python所有的内置函数及其功能

续表

续表

4.3.3 内置函数的应用举例
举例5:bytes()的使用——将一个字符串转换为字节类型。
自Python 3以后,字符串和bytes类型被彻底分开了。字符串是以字符为单位进行处理的,而bytes类型是以字节为单位进行处理的。bytes数据类型在所有的操作甚至内置函数中与字符串数据类型基本一样,它也是不可变的序列对象。
字符串类型与bytes类型最直接的互换方式如下:
>>>ss=b"asf34".decode("utf-8") #将bytes对象通过解码转换为UTF-8格式的字符串 >>> ss 'asf34' >>>ss.encode("utf-8") #将字符串通过编码成UTF-8格式转换为bytes对象 b'asf34' >>>
而函数bytes()提供了一种将字符串转换为bytes类型的新途径。它的主要用法有以下3种形式。
语法形式1——bytes(string, encoding[, errors])。
将字符串对象string以指定的编码格式encoding转换为bytes类型,其中errors为可选参数,通常可不用。
例如:
>>> ss='I love you! ' >>> bs=bytes(ss, encoding="utf-8") >>> print(bs) b'I love you! ' >>> bs=bytes(ss) Traceback (most recent call last): File "<pyshell#24>", line 1, in <module> bs=bytes(ss) TypeError: string argument without an encoding >>>
从上面的代码中可以看出,在此方式下,前两个参数都是必需的。
语法形式2——bytes(int)。
生成给定字节数的空bytes字符串。注意,不是空格,而是空字符串。
例如:
>>> ss=bytes(10) >>> print(ss) b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>>
语法形式3——bytes()。
生成一个空的bytes对象。它通常被用来初始化一个bytes对象。
例如:
>>> ss=bytes() >>> print(ss) b''
举例6:hasattr()的使用——判断对象object是否包含名为name的属性或方法。
该函数的语法形式如下:
hasattr(object, name)
其中,参数object为被判断对象,参数name为属性或方法名称。如果object包含name对应的属性或方法,则返回True;否则返回False。
例如:
>>> hasattr(list, "del") False >>> hasattr(list, "delete") False >>> hasattr(list, "append") True >>> ss=(1,2,3) >>> hasattr(ss, "append") False >>> hasattr(ss, "add") False >>>
举例7:sorted()的使用——排序。
在程序设计过程中,经常需要对列表(List)和字典(Dict)对象进行排序。Python提供了两种方法来实现排序功能。
方法1——用List的方法sort()进行排序,该方法不返回副本。
例如:
>>> ll=[1.3,6.7,3.4,89] >>> ll.sort() >>> ll [1.3, 3.4, 6.7, 89] >>> ll1=ll.sort() >>> ll1 >>>
方法2——用内置函数sorted()进行排序,它返回副本,而原始输入不变。
它的语法形式如下:
sorted(iterable, key=None, reverse=False)
其中,3个参数及其含义分别如下。
· iterable:可迭代对象,它是被排序的对象,可为列表(List)、字典(Dict)等类型。
· key:以可迭代对象的某个属性或函数作为关键字进行排序,默认值为空。
· reverse:reverse = True对应降序,reverse = False对应升序(默认)。
例如:
>>>sorted([36,6, -12,9, -22]) #列表排序 [-22, -12, 6, 9, 36] >>>newl=sorted([36,6, -12,9, -22]) #返回副本 >>> newl [-22, -12, 6, 9, 36] >>>sorted(['bob', 'about', 'Zoo', 'Credit']) #字符串排序,按照ASCII码大小排序 ['Credit', 'Zoo', 'about', 'bob'] >>> a = [('b',2), ('a',1), ('c',0)] >>>sorted(a, key=lambda x:x[1]) #按照元组第二个元素排序 [('c', 0), ('a', 1), ('b', 2)] >>>sorted([36,6, -12,9, -22], key=abs) #高阶函数,按照绝对值大小排序 [6, 9, -12, -22, 36] >>>sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower) #忽略大小写排序 ['about', 'bob', 'Credit', 'Zoo'] >>>
举例8:range()的使用——根据需要生成一个指定范围内的数字。
range()函数返回的是一个可迭代对象。注意,是可迭代对象,而不是列表类型。因此,不能使用print()函数打印range()函数的返回值。
该函数的语法形式如下:
range(start, end[, step])
其中,start为起始值,end为结束值(不含该值,也就是最后一个值必须减去1), step为步长。
例如:
>>> ll=range(1,10,2) >>> ll range(1, 10, 2) >>> range(1,10,2) range(1, 10, 2) >>>ll1=list(range(1,10,2)) #必须转换为列表才能被打印 >>> ll1 [1, 3, 5, 7, 9] >>> ll2=list(range(10)) >>> ll2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>
从上述结果中可以看出,range()函数返回的对象很像一个列表,但不是一个列表,它只在迭代的情况下才返回被索引的值,这种对象被称为可迭代对象。也就是说,range()函数不会在内存中产生列表对象,这是为了节约内存空间。还有一种对象被称为迭代器,list()函数就是这样一个迭代器,它可将range()函数返回的对象转换为列表。
举例9:filter()的使用——过滤器,用于构造一个序列。
filter()是过滤器,用于构造一个序列,其功能等价于:
item for item in iterable if function(item)
上述表达式的含义是:在函数中设定过滤条件,逐一循环迭代器中的元素,将返回值为True时的元素保留,形成一个新的序列对象。
filter()函数的语法形式如下:
filter(function, iterable)
它返回的并不是一个列表,而是一个filter对象,可通过list()函数将其转换为列表,从而使之可被打印。其中,function为过滤用函数;iterable为可迭代对象。
例如:
>>> def myfilter(x): if x%3==0 and x%5==0: return True else: return False >>> mylist=list(filter(myfilter, range(1,500))) >>> mylist [15,30,45,60,75,90,105,120,135,150,165,180,195,210,225,240,255,270,285,300,315,330,345, 360,375,390,405,420,435,450,465,480,495] >>>
从上述举例中应该不难理解过滤器的功能和使用方法,还可以看出过滤器的神奇之处。
以上仅仅对部分内置函数的使用进行了演示。内置函数所具有的强大威力有待于在学习过程中和具体的应用中去发现和挖掘。