python学习之旅笔记总结:第十章、开箱即用

            至此,你掌握了Python语言的大部分基础知识。Python不仅语言核心非常强大,还提供了其他工具以供使用。标准安装包含一组称为标准库(standard library)的模块,你见过其中的一些(如math和cmath),但还有其他很多。本章简要介绍模块的工作原理以及如何探索模块以获悉其提供的功能,然后概述标准库,重点是几个很有用的模块

1、模块

1 .1模块就是程序

           下面来看看如何编写自己的模块

           任何Python程序都可作为模块导入。假设你编写了如下所示的程序,并将其保存在文件aaa.py中,这个文件的名称(不包括扩展名.py)将成为模块的名称

       

          文件的存储位置也很重要,将在下一节详细介绍。

          要告诉解释器去哪里查找这个模块,可执行如下命令

       

          这告诉解释器,除了通常将查找的位置外,还应到目录E:\编程软件\python\ling1中去查找这个模块。这样做后,就可以导入这个模块了,注意:只要将目录加入到系统路径后,该目录下的模块都可以导入,即只要将目录加入一次,以后就都可以用,不用再次加入

              

          注意 当你导入模块时,可能发现其所在目录中除源代码文件外,还新建了一个名为__pycache__的子目录(在较旧的Python版本中,是扩展名为.pyc的文件)。这个目录包含处理后的文件,Python能够更高效地处理它们。以后再导入这个模块时,如果.py文件未发生变化,Python将导入处理后的文件,否则将重新生成处理后的文件。删除目录__pycach

          如你所见,导入这个模块时,执行了其中的代码。但如果再次导入它,什么事情都不会发生

          这次为何没有执行代码呢?因为模块并不是用来执行操作(如打印文本)的,而是用于定义变量、函数、类等。鉴于定义只需做一次,因此导入模块多次和导入一次的效果相同

1.2 模块是用来下定义的

          模块在首次被导入程序时执行。这看似有点用,但用处不大。让模块值得被创建的原因在于它们像类一样,有自己的作用域。这意味着在模块中定义的类和函数以及对其进行赋值的变量都将成为模块的属性。

1.2.1  在模块中定义函数

         假设你编写了一个如下所示的模块,并将其存储在文件hello2.py中。另外,假设你将这个文件放在了Python解释器能够找到的地方

              

             执行import hello2时,这将执行这个模块,也就是在这个模块的作用域内定义函数hello

             在模块的全局作用域内定义的名称都可像下面这样访问,通过模块名加函数名(或变量名)

                 

                 为何要这样做呢?为何不在主程序中定义一切呢?主要是为了重用代码。通过将代码放在模块中,就可在多个程序中使用它们

1.2.2  在模块中添加测试代码

            模块用于定义函数和类等,但在有些情况下(实际上是经常),添加一些测试代码来检查情况是否符合预期很有用。例如,如果要确认函数hello管用,你可能将模块hello2重写为如下所示的模块hello3

          这看似合理:如果将这个模块作为普通程序运行,将发现它运行正常。然而,如果在另一个程序中将其作为模块导入,以便能够使用函数hello,也将执行测试代码,就像本章的第一个hello模块一样

                

              注意:上图中,导入hello3模块时执行了一次hello函数,调用hello函数时又执行一次

                  

                  注意:只有第一次导入模块时才会执行该模块的函数,再次导入时不会执行

                 这不是你想要的结果。要避免这种行为,关键是检查模块是作为程序运行还是被导入另一个程序。为此,需要使用变量__name__

                

          如你所见,在主程序中(包括解释器的交互式提示符),变量__name__的值是'__main__',而在导入的模块中,这个变量被设置为该模块的名称。因此,要让模块中测试代码的行为更合理,可将其放在一条if语句中

         如果将这个模块作为程序运行,将执行函数hello;如果导入它,其行为将像普通模块一样

               

              

               

1.3 让模块可用

            在前面的示例中,我修改了sys.path。sys.path包含一个目录(表示为字符串)列表,解释器将在这些目录中查找模块。然而,通常你不想这样做。最理想的情况是,sys.path一开始就包含正确的目录(你的模块所在的目录)

           为此有两种办法:将模块放在正确的位置;告诉解释器到哪里去查找。接下来的两节将分别讨论这两种解决方案。如果要让别人能够轻松地使用你的模块,那就是另外一码事了

1.3.1. 将模块放在正确的位置

            将模块放在正确的位置很容易,只需找出Python解释器到哪里去查找模块,再将文件放在这个地方即可。在你使用的计算机中,如果Python解释器是管理员安装的,而你有没有管理员权限,就可能无法将模块保存到Python使用的目录中。在这种情况下,需要采用随后要介绍的另一种解决方案:告诉解释器去哪里查找

          如果要打印的数据结构太大,一行容纳不下,可使用模块pprint中的函数pprint(而不是普通print语句)。pprint是个卓越的打印函数,能够更妥善地打印输

               

                 这里的要点是,每个字符串都表示一个位置,如果要让解释器能够找到模块,可将其放在其中任何一个位置中。虽然放在这里显示的任何一个位置中都可行,但目录site-packages是最佳的选择,因为它就是用来放置模块的

1.3.2 高速解释器到哪里去查找

             将模块放在正确的位置可能不是合适的解决方案,其中的原因很多。

             不希望Python解释器的目录中充斥着你编写的模块。
             没有必要的权限,无法将文件保存到Python解释器的目录中。
             想将模块放在其他地方

            最重要的是,如果将模块放在其他地方,就必须告诉解释器到哪里去查找。前面说过,要告诉解释器到哪里去查找模块,办法之一是直接修改sys.path,但这种做法不常见。标准做法是将模块所在的目录包含在环境变量PYTHONPATH中

             环境变量PYTHONPATH的内容随操作系统而异,但它基本上类似于sys.path,也是一个目录列表

1.4 包

            为组织模块,可将其编组为包(package)。包其实就是另一种模块,但有趣的是它们可包含其他模块。

            模块存储在扩展名为.py的文件中,而包则是一个目录。

            要被Python视为包,目录必须包含文件__init__.py

            如果像普通模块一样导入包,文件__init__.py的内容就将是包的内容。例如,如果有一个名为constants的包,而文件constants/__init__.py包含语句PI = 3.14,就可以像下面这样做:

            import constants 
             print(constants.PI) 

2、探索模块

          当前的标准库很大,足以编写专著来论述(市面上也确实有这样的专著),而且还在不断增大。每个新Python版本都新增了模块,通常还会对一些既有模块进行细微的修改和改进。另外,你在网上肯定会找到一些很有用的模块。如果能快速而轻松地理解它们,编程工作将有趣得多

2.1 模块包含什么

           要探索模块,最直接的方式是使用Python解释器进行研究。为此,首先需要将模块导入。假设你听说有一个名为copy的标准模块

                 

                没有引发异常,说明确实有这样的模块。但这个模块是做什么用的呢?它都包含些什么呢?

2.1.1 使用dir

             要查明模块包含哪些东西,可使用函数dir,它列出对象的所有属性(对于模块,它列出所有的函数、类、变量等),如果将dir(copy)的结果打印出来,将是一个很长的名称列表,如下所示

                 

                      在这些名称中,有几个以下划线打头。根据约定,这意味着它们并非供外部使用。

2.2  使用 help 获取帮助

               然而,有一个标准函数可提供你通常需要的所有信息,它就是help。

           

      上述帮助信息指出,函数copy只接受一个参数x,且执行的是浅复制。在帮助信息中,还提到了模块的__doc__字符串

3、标准库:一些受欢迎的模块

               在Python中,短语“开箱即用”(batteries included)最初是由Frank Stajano提出的,指的是Python丰富的标准库。

3.1 sys

              模块sys让你能够访问与Python解释器紧密相关的变量和函数

3.2 os

         模块os让你能够访问多个操作系统服务。它包含的内容很多,表10-3只描述了其中几个最有用的函数和变量。除此之外,os及其子模块os.path还包含多个查看、创建和删除目录及文件的函数,以及一些操作路径的函数(例如,os.path.split和os.path.join让你在大多数情况下都可忽略os.pathsep)

3.3 time

             模块time包含用于获取当前时间、操作时间和日期、从字符串中读取日期、将日期格式化为字符串的函数。

           日期可表示为实数(从“新纪元”1月1日0时起过去的秒数。“新纪元”是一个随平台而异的年份,在UNIX中为1970年)也可表示为包含9个整数的元组。表10-6解释了这些整数。例如,元组(2008, 1, 21, 12, 2, 56, 0, 21, 0)表示2008年1月21日12时2分56秒。这一天是星期一,2008年的第21天(不考虑夏令时)。

       

       

            

3.4 random

           模块random包含生成伪随机数的函数,有助于编写模拟程序或生成随机输出的程序。请注意,虽然这些函数生成的数字好像是完全随机的,但它们背后的系统是可预测的。如果你要求真正的随机(如用于加密或实现与安全相关的功能),应考虑使用模块os中的函数urandom。模块random中的SystemRandom类基于的功能与urandom类似,可提供接近于真正随

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值