导航
导航
文章目录
  1. 8.1 简介
    1. 使用sys模块
    2. 输出
    3. 如何工作
  2. 8.2 字节编译的.pyc文件
  3. 8.3 from..import语句
  4. 8.4 模块的__name__
    1. 使用模块的__name__
    2. 输出
    3. 如何工作
  5. 8.5 制作你自己的模块
    1. 创建你自己的模块
    2. 输出
    3. 如何工作
    4. from..import
  6. 8.6 dir()函数
    1. 使用dir函数
    2. 如何工作

简明Python教程-8.模块

8.1 简介

上一章介绍了如何通过在程序中定义函数而重用代码,如果想在其他程序中重用很多函数呢?
模块基本上就是一个包含了所有你定义的函数和变量的文件
* 为了在其他程序中重用模块,模块的文件名 必须 以.py为扩展名
模块可以从其他程序 导入 以使用它的功能,这也是我们使用Python标准库的方法

使用sys模块

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python
# Filename: using_sys.py

import sys

print 'The command line arguments are:'
for i in sys.argv:
print i

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

输出

1
2
3
4
5
6
7
8
9
10
11
12
$ python using_sys.py we are arguments
The command line arguments are:
using_sys.py
we
are
arguments


The PYTHONPATH is ['/home/swaroop/byte/code', '/usr/lib/python23.zip',
'/usr/lib/python2.3', '/usr/lib/python2.3/plat-linux2',
'/usr/lib/python2.3/lib-tk', '/usr/lib/python2.3/lib-dynload',
'/usr/lib/python2.3/site-packages', '/usr/lib/python2.3/site-packages/gtk-2.0']

如何工作

1、利用import语句, 导入 sys模块,这句语句告诉Python,我们想要使用这个模块
* sys模块包含了与Python解释器和它的环境有关的函数
2、Python执行import sys语句的时候,它在sys.path变量中所列目录中寻找sys.py模块。如果找到了这个文件,这个模块的主块中的语句将被运行,然后这个模块就能够 使用 了。
注意,初始化过程仅在 第一次 导入模块的时候进行。另外sys是system的缩写
3、sys模块中的argv变量通过使用点号指明——sys.argv
优势:名称不会与你的程序中使用的argv变量冲突;清晰地表明了这个名称是sys模块的一部分
4、sys.argv是一个字符串的 列表 ,包含了 命令行参数 的列表,即用命令行传递给程序的参数
如果使用IDE,请在菜单中寻找指定程序命令行参数的方法
执行python using_sys.py we are arguments,即使用python命令运行using_sys.py模块,后面跟着的内容被作为参数传递给程序,Python为我们把它存储在sys.argv变量中
5、脚本名称总是sys.argv列表的第一个参数
Python从0开始计数,’using_sys.py’是sys.argv[0]、’we’是sys.argv[1]、’are’是sys.argv[2]以及’arguments’是sys.argv[3]
6、sys.path包含导入模块的目录名列表,与PYTHONPATH环境变量是相同的

8.2 字节编译的.pyc文件

导入模块相对费时,Python做了一些技巧。
包括创建 字节编译的文件 ,这些文件以.pyc作为扩展名
字节编译的文件与Python变换程序的中间状态有关(见第一章介绍中的“解释性”)
导入模块时.pyc文件快得多,因为一部分导入模块所需的处理已经完成了,且这些字节编译文件也是平台无关的

8.3 from..import语句

如果想要直接用argv,而不是sys.argv来使用变量,可以使用 from sys import argv 语句
如果想要导入所有sys模块使用的名字,可以使用 from sys import * 语句
这对所有模块都适用
一般来说,应避免使用 from..import ,而使用import语句,使程序更加易读,也避免名称冲突

8.4 模块的__name__

每个模块都有一个名称,在模块中可以通过语句来找出。
当第一次导入一个模块时,将运行它的主块。
可以利用__name__属性,来区分程序本身被使用还是被别的模块导入:

使用模块的__name__

1
2
3
4
5
6
7
#!/usr/bin/python
# Filename: using_name.py

if __name__ == '__main__':
print 'This program is being run by itself'
else:
print 'I am being imported from another module'

输出

1
2
3
4
5
6
7
$ python using_name.py
This program is being run by itself

$ python
>>> import using_name
I am being imported from another module
>>>

如何工作

每个Python模块都有__name__,如果它是__main__,则说明该模块被用户单独运行。

8.5 制作你自己的模块

创建模块非常简单,我们也一直在这样做。每个Python程序也是一个模块。

创建你自己的模块

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# Filename: mymodule.py

def sayhi():
print 'Hi, this is mymodule speaking.'

version = '0.1'

# End of mymodule.py

上面是一个 模块 的例子,它与普通的Python程序相比没有什么特别之处
在别的Python程序中使用这个模块(模块应放置在导入它的程序同目录或sys.path的目录中):

1
2
3
4
5
6
7
#!/usr/bin/python
# Filename: mymodule_demo.py

import mymodule

mymodule.sayhi()
print 'Version', mymodule.version

输出

1
2
3
$ python mymodule_demo.py
Hi, this is mymodule speaking.
Version 0.1

如何工作

Python重用了点号,来使用模块的成员

from..import

使用from..import语法的版本:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python
# Filename: mymodule_demo2.py

from mymodule import sayhi, version
# Alternative:
# from mymodule import *

sayhi()
print 'Version', version

Mymodule_demo2.py的输出与mymodule_demo.py完全相同

8.6 dir()函数

內建的dir函数可以列出模块定义的标识符,包括函数、类和变量
提供参数为模块名时,返回该模块定义的名称列表
不提供参数时,返回当前模块中定义的名称列表

使用dir函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ python
>>> import sys
>>> dir(sys) # get list of attributes for sys module
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__',
'__stdin__', '__stdout__', '_getframe', 'api_version', 'argv',
'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
'copyright', 'displayhook', 'exc_clear', 'exc_info', 'exc_type',
'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval',
'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding',
'getrecursionlimit', 'getrefcount', 'hexversion', 'maxint', 'maxunicode',
'meta_path','modules', 'path', 'path_hooks', 'path_importer_cache',
'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags',
'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout',
'version', 'version_info', 'warnoptions']
>>> dir() # get list of attributes for current module
['__builtins__', '__doc__', '__name__', 'sys']
>>>
>>> a = 5 # create a new variable 'a'
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'sys']
>>>
>>> del a # delete/remove a name
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
>>>

如何工作

首先,在引入的sys模块上使用dir,查看其属性列表
然后,不给dir函数传递参数,默认地,返回当前模块的属性列表
引入的模块同样是列表的一部分
定义新变量a并赋值,观察到列表中增加了相同的值,使用del语句删除当前模块中的变量/属性,变化反映在了dir的输出中
del语句在运行后可以 删除 一个变量/名称,del a之后变量a将无法再使用,就像没存在过一样