Python进阶篇二:Python模块

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

1. Python普通模块制作和导入:

任何一个python程序都可以作为python的模块,通过导入语句被调用。python的导入语句import简而言之有以下三种形式:

import somemodule
from somemodule import somefunction
from somemodule import *

若使用语句import相应模块后解释器未产生任何异常,则表明模块成功导入。对于导入模块的名称,可以通过Model.__name__获得(详见参考资料1第213页)。制作并导入非python库模块的步骤如下:(以导入自己编写的Hellopy.py为例)

print "Hello, world!"
def hello():
    print "Hello, world!"

备注:在Windows平台下,若保存python模块为.py格式,则双击时模块通过DOS与用户交互。若保存为.pyw,则模块不调用DOS与用户交互。因此,制作python GUI程序通常会将脚本程序另存为.pyw格式。

(本步骤为导入任何自制或第三方库的办法)确认程序调试完成后,运行以下代码:

>>> import sys
>>> sys.path.append('E:/Program_Dirs/Py_workspace/Py_Study')
>>> import Hellopy
Hello, world!
>>> Hellopy.hello()
Hello, world!

其中,Hellopy导入了整个模块,而Hellopy.hello()使用了Hellopy模块中的hello()函数。

输入图片说明

备注:Python中,多次导入同一个模块与导入一次该模块效果是相同的,并且不推荐重载已导入的模块。在python2中使用reload函数可以重载模块,python3则需要使用exec函数以达到相同效果。

注意,在UNIX系统中,sys.path要求的路径名称需要完整,例如要用'/home/yourusername/python'而不是'~/python'。若需要省略完整路径,要使用sys.path.expanduser('~/python')。

备注:在cmd中使用python -m progname [args]指令可以是的progname只被执行,而不会生成pyc文件。

2. Python系统模块制作和导入:

在Python IDE中,可以通过以下代码查看python当前库函数搜索路径以确定是否需要增添路径变量,其中,pprint模块中的pprint方法是对print方法的优化:

>>> import sys, pprint
>>> pprint.pprint(sys.path)
['',
 'D:\\Develop_Tools\\Py27\\Lib\\idlelib',
 'C:\\Windows\\system32\\python27.zip',
 'D:\\Develop_Tools\\Py27\\DLLs',
 'D:\\Develop_Tools\\Py27\\lib',
 'D:\\Develop_Tools\\Py27\\lib\\plat-win',
 'D:\\Develop_Tools\\Py27\\lib\\lib-tk',
 'D:\\Develop_Tools\\Py27',
 'D:\\Develop_Tools\\Py27\\lib\\site-packages']
>>> 

备注:此处打印出来的lib事实上路径为大写的Lib
将您制作的模块放在这里的任何一个路径之后,都不再需要使用import sys.path.append语句了,而是可以直接调用。例如将刚才的Hellopy放在D:\Python27_13\Lib,然后程序就可以这么写:

>>> import Hellopy
>>> Hellopy.hello()
Hello, world!

关于上面提到的系统路径,还可以以这两种方式添加:

1、通过设置环境变量PYTHONPATH扩展系统路径

向系统增加一个变量PYTHONPATH,输入python模块包所在的路径即可。

输入图片说明

然后通过打出sys.path可以查看验证。

输入图片说明

2、通过制作.pth文件扩展系统路径

在python.exe(即用户自己的python安装路径)目录中的同一级,用户可以定义自己的模块或包路径文件,文件格式设置为.pth即可。这样的.pth模块还可以有多个。

输入图片说明

输入图片说明

3. Python的包:

Python中,包事实上是一个路径,该路径含有文件__init__.py。init.py文件中含有的内容即包的内容。比如有个被放在库函数搜索路径中的包叫做constants,其中有句代码PI = 3.14,则可以通过如下代码查看这个常量:

>>> import constants
>>> constants.PI
3.14

其他从包中导入模块的方式如下:

# (1) Imports the drawing package:
import drawing 
 # (2) Imports the colors module (a file of drawing):
import drawing.colors
# (3) Imports the shapes module
# (also a file of drawing):
from drawing import shapes 

python的每个模块即使一个python文件,从面向对象的角度来看,这文件也是一个命名空间。(namespace)。使用dir方法可以快速查看一个模块中所有的属性(attribute),包括这个模块中的各个类、方法、函数以及变量。

>>> a = (n for n in dir(copy) if n.startswith('_'))
>>> print list(a)
['_EmptyClass', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_copy_dispatch', '_copy_immutable', '_copy_inst', '_copy_with_constructor', '_copy_with_copy_method', '_deepcopy_atomic', '_deepcopy_dict', '_deepcopy_dispatch', '_deepcopy_inst', '_deepcopy_list', '_deepcopy_method', '_deepcopy_tuple', '_keep_alive', '_reconstruct', '_test']

使用

Model.__all__

可以查看一个包中的公共内容,也是

from Model import *

所能导入的可使用模块。例如,copy模块的公共内容可查看如下:

>>> copy.__all__
['Error', 'copy', 'deepcopy']

其他非公共模块则需要显式调用,比如PyStringMap的调用就要写

from copy import PyStringMap

在书写自己的包时,也可以对__all__.py文件进行设置。若不设置,默认情况所有非双下划线为开头的文件则都被认为是公共文件。

Python中,使用help(model)方法可以查看model模块的相关信息。而使用model.__doc__则可以查看对于该模块的文档说明。更多的python文档,请参考:https://www.python.org/doc/

Python中,使用__file__可以查看模块所在路径,例如:

>>> import copy
>>> print copy.__file__
D:\Python27_13\lib\copy.pyc

注:路径名最好不包括空格、Unicode字符等特殊符号

4. Python几个常用模块简介:

sys 模块:

例如,通过控制台传入参数并输出倒序参数的示例程序如下:

#Reverseargs.py
import sys
args = sys.argv[1: ]
args.reverse()
print ' '.join(args)

调用:
python Reverseargs.py This is a test
结果:
test a is This

python os模块收录一些常用的在python中进行系统操作的方法,详细资料见参考资料1第221-223页。例如,在python shell中打开QQ浏览器做法如下:

>>> os.startfile(r"D:\Internet_Tools\QQ_Browser\QQBrowser\QQBrowser.exe")

采用以下方法可在python shell中打开特定网页:

>>> import webbrowser
>>> webbrowser.open('http://www.python.org')
True
time 模块:

time模块使用举例1:asctime使用

>>> import time
>>> time.asctime(time.gmtime())
'Tue Mar 28 04:04:20 2017'
>>> time.asctime(time.localtime())
'Tue Mar 28 12:04:59 2017'
>>> time.asctime()
'Tue Mar 28 12:05:06 2017'

time模块使用举例2:strptime使用

>>> time.strptime("28 Mar 17", "%d %b %y")
time.struct_time(tm_year=2017, tm_mon=3, tm_mday=28, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=87, tm_isdst=-1)

备注:其中tm_wday表示本日在一周中(以周一为0)开始算对的天数,tm_yday表示当日在一年中的天数,tm_isdst表示是否使用日光时,1表示是,0表是否,-1表示不清楚。

关于time模块更多详细资料,可以见参考资料中有关time module的链接。

random 模块:

random模块使用举例:

from random import *
from time import *

#Generate a random time of this year:
date1 = (2017, 1, 1, 0, 0, 0, -1, -1, -1)
date2 = (2018, 1, 1, 0, 0, 0, -1, -1, -1)
time1 = mktime(date1)
time2 = mktime(date2)
rand_time = uniform(time1, time2)
print asctime(localtime(rand_time))

Sun Apr 09 22:16:14 2017
shelve模块:

本模块用于快速向系统硬盘读写数据字典(注意读入操作时,对字典的操作仅仅在其备份上进行)。以下是一个shelve模块的使用举例:

# database.py
import sys, shelve

def store_person(db):
    """
    Query user for data and store it in the shelf object
    """
    pid = raw_input('Enter unique ID number: ')
    """Add information of obj person,
        code omitted. """
    #Actually expand the shelve obj here.
    db[pid] = person
    
def lookup_person(db):
    """
    Query user for ID and desired field, and fetch the corresponding data from
    the shelf object
    """
    pid = raw_input('Enter ID number: ')
    #Example of looking person obj according to pid and field.
    print field.capitalize() + ':'+ db[pid][field]
    
def main():
    # You may want to change this name
    database = shelve.open('E:\\Program_Dirs\\Py_workspace\\Py_Study\\shelveDB.txt') 
    try:
        while True:
            cmd = enter_command()
            if cmd == 'store':
                store_person(database)
            elif cmd == 'lookup':
                lookup_person(database)
            #unimportant code, omitted.

    finally:
        """Do not forget to close in order to make 
            any possible update valid."""
        database.close()

if __name__ == '__main__': main()
re模块:

re模块为python的正则表达式模块,常用函数有compile, search, match, split, findall, sub, escape, group, start, end以及span等。主要用于python中正则表达式的处理操作。举例如:

>>> m = re.match(r'www\.(.*)\..{3}', 'www.python.org')
>>> m.group(1)
'python'
>>> m.start(1)
4
>>> m.end(1)
10
>>> m.span(1)
(4, 10)

关于re模块的参考资料比较丰富,在此不一一赘述。更多内容可以参考参考资料2。

参考资料:

  1. Magnus Lie Hetland, Beginning Python, From Novice to Professional, Second Edition, in Apress
  2. 彭博,Python正则表达式指南,URL:https://my.oschina.net/dtec/blog/40947
  3. Python lib, random module, URL: https://docs.python.org/2/library/random.html#random.SystemRandom
  4. Python lib, time module, URL: https://docs.python.org/2/library/time.html#module-time
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看