python基础教程_学习笔记:充电时刻——模块_第1页
python基础教程_学习笔记:充电时刻——模块_第2页
python基础教程_学习笔记:充电时刻——模块_第3页
python基础教程_学习笔记:充电时刻——模块_第4页
python基础教程_学习笔记:充电时刻——模块_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、充电时刻模块python的标准安装包括一组模块,称为标准库。模块»> import math»> math.sin(o)0.0模块是程序任何python程序都可以作为模块导入。$ cat hello.py# !/usr/bin/pythonprint "hello,signjing!"$ ./hello.pyhello.signjing!假设将python程序保存ize/home/ggz2/magiccube/mysh/pys目录屮,执行下面的代码:»> import sys »> sys.path.appen

2、d(7home/ggz2/magiccube/mysh/pys,)这里所做的只是告诉解释器:除了从默认的目录中寻找之外,还需要从目录/home/ggz2/magiccube/mysh/pys 111寻找模块。完成这个步骤丿舌,就能导入自己的模块了:»> import hellohello,signjing!注意:在导入模块的时候,可能会看到有新文件出现,本例中是/home/ggz2/magiccube/mysh/pys/hello.pyco这个以.pyc为扩展名的文件是(平台无关的)经 过处理(编译)的,已经转换成python能够更加有效地处理的文件。如果稍后导入同一个 模块,

3、python会导入.pyc文件而不是.py文件,除非.py文件己经改变在这种情况下,会 生成新的.pyc文件。删除pyc文件不会损害程序(只要等效的.py文件存在即可)一一必要 的时候会创建新的.pyc文件。如你所见,在导入模块的时候,英中的代码就被执行了。不过再次导入该模块,就不会发生 什么了。»> import hello>»因为导入模块并不意味着在导入吋执行某些操作。它们主要用于定义。此外,因为只需要定 义这些东西一次,导入模块多次和导入一次的效果是一样的。模块用于定义模块在笫一次导入程序中时被执行。这看起來有点用一一但并不算很有用。真正的用处在于 它们(

4、像类一样)可以保持自己的作用域。这就意味着定义的所有类和函数以及赋值后的变 量都成为了模块的特性。在模块中定义函数$ cat hello2.py# !/usr/bin/pythondefhelloo:print "morning,signjing"»> import hello2»> hello2.hello()mor nin g,sig njing可以通过同样的方法来使用任何在模块的全局作用域中定义的名称。为了让代码可重用,请将它模块化!在模块中增加测试代码模块用來定义函数、类和其他一些内容,但有些时候(事实上是经常),在模块中添加一些 检

5、查模块本身是否正常工作的测试代码是很有用的。# !/usr/bin/pythondef helloq:print "hello!"# a testhelloo»> import hello3hello!»> hello3.hello0hello!避免这种情况的关键在于:“告知”模块本身是作为程序运行还是导入到其他程序。为了实现这一点,需要使用name(双下划线)变量:»> _name_ fhello3f可见,在主程序(包括解释器的交互式提示符在内)中,变量name_的值是 而在导入的模块屮,这个值被设定为模块的名字。因此,为了

6、让模块的测试代码更加好用, 可以将其放置在if语句中:$ cat hello4.py# !/usr/bin/pythondef helloo:print "hello"deftest。:helloq if _name_=l_main_f:test()»> import hello4>»»> hello4.hello()让你的模块可用将模块放置在正确位置 将你的模块放置在正确位置(或者某个正确位置)是很容易的。只需要找python解释器 从哪里查找模块,然后将口己的文件放置在那里即可。linux系统:»> imp

7、ort sys,pprint»> pprint.pprint(sys.path).'7usr/lib64/python26.zip7usr/lib64/python2.67usr/lib64/python2.6/plat-linux2','/usr/lib64/python2.6/lib-tk7usr/lib64/python2.6/lib-old7usr/lib64/python2.6/lib-dynload',7usr/lib64/pytho n2.6/sit e packages',7usi71ib64/python2.6/site

8、packages/gtk2.0:7usr/lib/python2.6/s 让packages'windows 系统:»> import syspprint»> pprint.pprint(sys.path)r,'d:software(x86python27libidlelib'c:windowssystem32python27.zip,d:software(x86)python27dlls'd:software(x86)python27lib','d:software(x86)python27libplat-win

9、','d:software(x86)python27liblib-tk'd:software(x86)python27','d:software(x86)python27libsitepackages'每个字符串都提供了一个放置模块的目录,解释器可以从这些目录中找到所需的模块。尽管这些目录都可以使用,但site-packages 录是最佳选择,因为它就是用来做这些事情的。在 windows 操作系统中的 d:software(x86)python27libsite-packages f创建文件another_hello.py:def hello。

10、:print "hello,win7"»> import another_hello»> another_hello.helloq hello,win7可见,只要将模块放入类似site-packages这样的目录中,所有程序就都能将其导入了。告诉编译器去哪里找“将模块放置在正确的位置"这个解决方案在以下几种情况下可能并不适用:1)不希望将自己的模块填满pylhon解释器的目录;2)没有python解释器目录中存储文件的权限;3)想将模块放在其他地方既然如此,那就告诉解释器去哪里找。之前提到了 sys.path,但这不是通用的方法。标

11、准的 实现方法是在pythonpath环境变量中包含模块所在的目录。pythonpath环境变量的内容会因为使用的操作系统不同而有所差异,但从基本上来说, 它与sys.path很类似个目录列表。环境变量并不是python解释器的一部分,它们是操作系统的一部分。提示:不需要使用pythonpath来更改sys.path0路径配置文件提供了一个有用的捷径, 可以让python替你完成这些工作。路径配置文件是以.p(h为扩展名的文件,包扌舌应该添加 到sys.path小的目录信息。空行和以#开头的行都会被忽略。以import开头的文件会被执行。 对 windows来说,使用sys.prefix定义的

12、目录名;在unix和mac osx中则使用site-packages目录。命名模块包含模块代码的文件要和模块名一样一一再加上.py扩展名。在windows系统中,也可以使 用.pyw扩展名。包为了组织好模块,可以将它们分组为包。包基本上就是另外一类模块。有趣的地方就是它们 都能包含其他模块。当模块存储在文件中吋(扩展名为.py),包就是模块所在的目录。为 了让python将其作为包对待,它必须包含一个命名为_init_py的文件(模块)。如果将它 作为普通模块导入的话,文件的内容就是包的内容。比如有个名为constants的包,文件 constants/_init_.py包括语句pi=3.14

13、,那么可以这么做:import constantsprint constants.pi为了将模块放置在包内,直接把模块放在包目录内即可。探究模块如何独立地探究模块,是极有价值的技能。因为职业生涯中可能会遇到很多有用的模块。 模块中有什么探究模块最直接的方式就是在python解释器中研究它们。第一件事就是导入它。假设有个叫做copy的标准模块:»> import copy使用dir查看模块中包含的内容可以使用dir函数,会将对象(以及模块的所有函数、类、变量等)的所有特性列出。»> dir(copy)error: tystringmap1, 'jempty

14、class:f_builtins_ f_doc_,_name_ f_package_ copy_dispatch: '_copy_immutab】e: f_copy_inst: copy_with_constructor: lcopy_ with_copy_method ldeepcopy_atomic ldeepcopy_dict deepcopy-dispatch: ideepcopy n st: ldeepcopyjist '_deepcopy_method: ideepcopy.tuple: lkeep_alive: rec on struct: te st: &quo

15、t;copy: 'deepcopy: "dispatchtable: 'error: 'name: 't 'weakref一些名字以下划线开始一一暗示(约定俗成)它们并不是为在模块外部使用而准备的。过滤 到它们:»> n for n in dir(copy) if not n.startswith('_')rerror fpystringmap "copy; 'deepcopy: 'dispatch_table 'error: 'name: rweakrefall变量_a

16、ll_这个名字包含一个列表,在copy模块内部被设置。»> copy._all_i'error', "copy; 'deepcopy'它定义了模块的公共接口。更准确地说,它告诉解释器:从模块导入所有名字代表什么含义。使用如下代码from copy import *,则只能使用all变量中的函数。要导入pystringmap的话,就得显式地实现,或者导入copy然后使用copy.pystringmap,或者使用from copy import pystringmapo在编写模块的时候,像设置_all_这样的技术还是相当有用的。因为模块屮可

17、能会有一大堆 其他程序不需要或不想要的变量、函数和类,_all_会“客气地”将它们过滤了出去。如果 没有设定_川1_,用import *语句默认将会输出模块中所有不以下划线开头的全局名称。 用help获取帮助对于探究工作,交互式解释器是个非常强大的工具,而对该语言的精通程度决定了对模块探 允的程度。不过还有个标准函数能够为你提供日常所需的信息,这个函数叫做helpo»> help(copy.copy)help on function copy in module copy: copy(x)shallow copy operation on arbitrary python ob

18、jects.see the module's _doc_ string for more info.>»事实上,上面的帮助文档是从copy函数的文档字符串中提取出的:»> print copy.copy._doc_shallow copy operation on arbitrary python objects.see the module's _doc_ string for more info使用help与直接检查文档字符串相比,好处在于获得更多信息。help(copy)会打印出更多信息,此处略;文档并非每个模块或函数都有不错的文档字符串(尽管都应该有),有些时候可能需要十分透彻 地描述这些模块和函数是如何工作的o 学习python编程最有用的文档莫过于python库参考,它对所有标准库中的模块都有描述。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论