Python学习笔记(五)

上一篇 / 下一篇  2008-01-21 18:20:45 / 个人分类:读书笔记

模块

1.    简介

模块基本上就是一个包含了所有定义的函数和变量的文件,为了在其他程序中重用模块,模块的文件名必须以.py为扩展名.

例子:

import sys

print 'The command line arguments are:'

for i in sys.argv:

   print i

print '\n\nThe PYTHONPATH is',sys.path,'\n'

2.    字节编译的.pyc文件

通常认为,Python是一种解释性的语言,但是这种说法是不正确的,实际上,Python在执行时,首先会将.py文件中的源代码编译成Pythonbyte code(字节码),然后再由Python Virtual Machine来执行这些编译好的byte code。这种机制的基本思想跟Java.NET是一致的。然而,Python Virtual MachineJava.NETVirtual Machine不同的是,PythonVirtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说PythonVirtual MachineJava.NET的功能更强大,更拽,而是说和Java.NET相比,PythonVirtual Machine距离真实机器的距离更远。或者可以这么说,PythonVirtual Machine是一种抽象层次更高的Virtual Machine

Python在执行CodeObject.py时,首先需要进行的动作就是对其进行编译,编译的结果当然有字节码,然而除了字节码之外,还包含其它一些结果,其中包含了一些字符串,一些常量值,还有一些操作。实际上,这些在Python源代码中包含的静态的信息都会被Python收集起来,编译的结果中包含了字符串,常量值,字节码等等在源代码中出现的一切有用的静态信息。而这些信息最终会被存储在Python运行期的一个对象中,当Python运行结束后,这些信息甚至还会被存储在一种文件中: PyCodeObject对象和Pyc文件。.

每一个PyCodeObject对象中都包含了每一个代码块经过编译后得到的byte code。但是不幸的是,Python在执行完这些byte code后,会销毁PyCodeObject,所以下次再次执行这个.py文件时,Python需要重新编译源代码,Python应该提供一种机制,保存编译的中间结果,即byte code,或者更准确地说,保存PyCodeObject。事实上,Python确实提供了这样一种机制——Pyc文件。在执行一个.py文件中的源代码之后,Python并不会自动生成与该.py文件对应的.pyc文件。我们需要自己触发Python来创建pyc文件。在Python运行的过程中,如果碰到import abc,这样的语句,那么Python将到设定好的path中寻找abc.pycabc.dll文件,如果没有这些文件,而只是发现了abc.py,那么Python会首先将abc.py编译成相应的PyCodeObject的中间结果,然后创建abc.pyc文件,并将中间结果写入该文件。接下来,Python才会对abc.pyc文件进行一个import的动作,实际上也就是将abc.pyc文件中的PyCodeObject重新在内存中复制出来.

3.    from..import语句

如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打sys.),那么你可以使用from sys import argv语句。如果你想要输入所有sys模块使用的名字,那么你可以使用from sys import *语句。这对于所有模块都适用。一般说来,应该避免使用from..import而使用import语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。

4.from…import语句

如果你想要直接输入argv变量到你的程序中(避免在每次使用它时打sys.),那么你可以使用from sys import argv语句。如果你想要输入所有sys模块使用的名字,那么你可以使用from sys import *语句。这对于所有模块都适用。一般说来,应该避免使用from..import而使用import语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。

4.    模块的_name_

每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用——就如前面所提到的,当一个模块被第一次输入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的__name__属性完成。

使用模块的_name_的例子:

if __name__=='__main__':

   print 'this program is being run by itselt.'

else:

print 'i am being imported from another module.'

模块是对象,并且所有的模块都有一个内置属性__name__.如果import模块,那么__name__的徝通常为模块的文件名,不带路径或者文件扩展名.也可以象一个标准程序一样直接运行模块,这种情况下__name__的徝将是一个特别的缺省徝,__main__.

5.    制造你自己的模块

例子:
def sayhi():

   print 'hi,this is mymodule speaking.'

version='0.1'

import mymodule

mymodule.sayhi()

print 'version',mymodule.version

使用from…import的语法版本

from mymodule import sayhi,version

 

sayhi()

print 'version',version

6.    dir()函数

使用内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。

当你为dir()提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,它返回当前模块中定义的名称列表。

Del用来删除一个变量名称.


TAG: 读书笔记

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-10  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 37564
  • 日志数: 56
  • 建立时间: 2007-09-12
  • 更新时间: 2009-03-12

RSS订阅

Open Toolbar