从C#到Python——5模块和包

Python025

从C#到Python——5模块和包,第1张

本章是《从到Python》系列连载的最后一章 内容较简单 主要介绍Python中模块与包的使用方法 如果你对这部分内容已经比较熟悉 就不要再浪费时间看了 写这一章只是为了整个系列完整而已 没什么新的东西(本章内容主要参考了《Python精要参考》的第八章《模块和包》)

  模块

Python的脚本都是用扩展名为py的文本文件保存的 一个脚本可以单独运行 也可以导入另一个脚本中运行 当脚本被导入运行时 我们将其称为模块(module) 模块是Python组织代码的基本方式

模块名与脚本的文件名相同 例如我们编写了一个名为Items py的脚本 则可在另外一个脚本中用import Items语句来导入它 在导入时 Python解释器会先在脚本当前目录下查找 如果没有则在sys path包含的路径中查找

在导入模块时 Python会做以下三件事

( ) 为模块文件中定义的对象创建一个名字空间 通过这个名字空间可以访问到模块中定义的函数及变量

( ) 在新创建的名字空间里执行模块文件

( ) 创建一个名为模块文件的对象 该对象引用模块的名字空间 这样就可以通过这个对象访问模块中的函数及变量 如

 import sys print sys path

如果要同时导入多个模块 可以用逗号分隔 如 import sys os

可以使用as关键字来改变模块的引用对象名 如 import os as system

也可以用from语句将模块中的对象直接导入到当前的名字空间(不创建模块名字空间的引用对象) 如 from socket import gethostname

from语句支持逗号分割的对象 也可以使用星号(*)代表模块中除下划线开头的所有对象 如 from socket import * 这是个懒省事的方法 我是经常用 不过用之前最好先搞清楚会不会覆盖当前名字空间中的函数名等 总之不是个好习惯:)

除了Python脚本(不仅限于py 还包括pyc和pyo) import语句还可以导入C或扩展(已编译为共享库或DLL文件) 包(包含多个模块 一会介绍)和内建模块(使用C编写并已链接到Python解释器内) 不过除了包 另外两个我也没用过:(

Python解释器在第一次import一个py文件的时候 会尝试将其编译为字节码文件 这个文件的扩展名通常为 pyc 它是已经完成语法检查并转译为虚拟机指令的代码 后边的导入操作会直接读取 pyc文件而不是 py文件 一般而言速度会更快

  包

Python的模块可以按目录组织为包(package) 一般来说 我们将多个关系密切的模块组织成一个包 以便于维护和使用 同时可有效避免名字空间冲突 创建一个包的步骤是 建立一个名字为包名字的文件夹 并在该文件夹下创建一个__init__ py文件 你可以根据需要在该文件夹下存放脚本文件 已编译扩展及子包

一个典型的包可能有以下结构:

   package /   __init__ py   subPack /   __init__ py   module_ py   module_ py   module_ py   subPack /   __init__ py  module_ py  module_ py  ……

只要目录下存在__init__ py 就表明此目录应被作为一个package处理 在最简单的例子中 __init__ py 是一个空文件 不过一般我们都要在__init__ py中做一些包的初始化动作 或是设定一些变量

最常用的变量是__all__ 当使用包的人在用from pack import * 语句导入的时候 系统会查找目录pack下的__init__ py文件中的__all__这个变量 __all__是一个list 包含了所有应该被导入的模块名称 例如 __all__ = [ m m m ] 表示当from pack import * 时会import 这三个module

如果没有定义__all__ from pack import * 不会保证所有的子模块被导入 所以要么通过__init py__ 要么显式地import 以保证子模块被导入 如 import pack m   pack m   pack m

  本章小结

本章介绍了Python中模块与包的使用方法 要点如下

( ) 模块是一个可以导入的Python脚本文件

( ) 包是一堆按目录组织的模块和子包 目录下的__init__ py文件存放了包的信息

( ) 可以用import import as form import 等语句导入模块和包

总之 模块与包是在物理上组织Python代码复用的一种有效方式 它有点类似于中的程序集(Assembly) 初学Python不一定要会自己建立模块和包 但一定要学会使用各种包 这正是Python的强大之处 Python带着各种各样的battery 当你想完成一项功能时 最好先去搜索是不是有相关的包能够复用(多数情况下是这样的 因为在各种领域都有太多的人在为Python作著贡献) 而且 绝大多数Python包都是开源的 研读优秀的代码也是提高编程能力的一种有效途径

进一步阅读的参考

《从C#到Python》系列连载到今天就全部写完了 非常感谢各位的支持 鼓励以及批评 使我能够不断完善和提高 读完这个连载 在Python的语法上应该够应付一阵了 当然结合具体的应用领域 还是有很多东西需要不断学习 在此向大家推荐一些有用的读物

[ ] 科学计算方面 这个是我的应用Python的主阵地 推荐HYRY Studio的《用Python做科学计算》(见) 我个人认为非常优秀的一本原创著作(这么好的书不知为何不正式出版 钦佩作者的rp !)

[ ] GUI开发方面 如果你用wxPython 那么肯定要看《wxPython in Action》(中文版见) 而我个人主要用PyQt 这方面值得推荐的读物是柴树杉翻译的《PyQt 编程简介》(见) 如果英文好 还是推荐看《Rapid GUI Programming with Python and Qt》(英文pdf版地址 Oct pdf)

[ ] 开发方面 这个我还没有涉及 Django的资料网上也是大把了 其它的Python Web开发框架也是多如牛毛 自己找找吧 )

lishixinzhi/Article/program/ASP/201311/21672

如果你有一定的计算机编程知识基础,那么很容易学;再如果你对编程十分感兴趣,那么很容易学的。

1,找到合适的入门书籍,大致读一次,循环啊判断啊,常用类啊,搞懂(太难的跳过)

2,做些简单习题,字符串比较,读取日期之类 Python Cookbook不错(太难太无趣的,再次跳过,保持兴趣是最重要的,不会的以后可以再学)

3,加入Python讨论群,态度友好笑眯眯(很重要,这样高手才会耐心纠正你错误常识)。很多小问题,纠结许久,对方一句话点播思路,真的节约你很多时间。耐心指教我的好人,超级超级多谢。

4,解决自己电脑问题。比如下载美剧,零散下载了2,4,5,8集,而美剧共12集,怎样找出漏下的那几集?然后问题分解,1读取全部下载文件名,2提取集的数字,3数字排序和(1--12)对比,找出漏下的。对于python初学者来说,能找到一个好老师学习格外重要,这能决定你是不是可以做出好的项目,在python开发的路上越走越轻松,如果现在的你缺乏学习经验,找不到老师指导你学习,可以加企 鹅扣-Q前面112再加上中间的983以及最后四位数4903,连在一起就可以了。

5,时刻记住目的,不是为了当程序员,是为了解决问题。比如,想偷懒抓网页内容,用urllib不行,用request也不行,才发现抓取内容涉及那么多方面(cookie,header,SSL,url,javascript等等),当然可以听人家劝,回去好好读书,从头读。 或者,不求效率,只求解决,用ie打开网页再另存为行不行?ie已经渲染过全部结果了。 问题变成:1--打开指定的10个网页(一行代码就行)。更复杂的想保存呢?利用已经存在的包,比如PAM30(我的是Python3),直接打开ie,用函数outHTML另存为文本,再用搜索函数(str搜索也行,re正则也行)找到数据。简单吧?而且代码超级短。

6,保持兴趣,用最简单的方式解决问题,什么底层驱动,各种交换,留给大牛去写吧。我们利用已经有的包完成。

7,耐心读文档,并且练习快速读文档。拿到新包,找到自己所需要的函数,是需要快速读一次的。这个不难,读函数名,大概能猜到是干嘛的,然后看看返回值,能判断是不是自己需要的。

8,写帮助文件和学习笔记,并发布共享。教别人的时候,其实你已经自己再次思考一次了。 我觉得学程序就像学英文,把高频率的词(循环,判断,常用包,常用函数)搞懂,就能拼装成自己想要的软件。 一定要保持兴趣,太复杂的跳过,就像小学数学,小学英语,都是由简入深。 网络很平面,无数国际大牛著作好书,关于Python,算法,电脑,网络,或者程序员思路,或者商业思维(浪潮之巅是本好书)等等,还有国际名校的网络公开课(中英文字幕翻译完毕,观看不是难事),讲计算机,网络,安全,或者安卓系统,什么都有,只要能持续保持兴趣,一点点学习下去,不是难事。 所有天才程序员,都曾是儿童,回到儿童思维来理解和学习。觉得什么有趣,先学,不懂的,先放着,遇到问题再来学,效果更好。 唯一建议是,不要太贪心,耐心学好一门优雅的语言,再学其它。虽然Javascript做特效很炫,或提某问题时,有大牛建议,用Ruby来写更好之类,不要改方向。就像老笑话:“要学习递归,必须首先理解递归。”然后死循环一直下去。坚持学好一门语言,再研究其他。 即使一门语言,跟网络,数据库等等相关的部分,若都能学好,再学其他语言,是很快的事情。 另外就是,用学英文的耐心来学计算机,英文遇到不懂的词,抄下,查询。 python里,看到Http,查查定义,看到outHtml,查查定义,跟初学英语时候一样,不要直接猜意思,因为精确描述性定义,跟含糊自然语有区别的。而新人瞎猜,很容易错误理解,wiki,google很有用。