Python 标准库系列之模块介绍

Python的模块其实就是封装了一个或者多个功能的代码集合,以便于重用,模块可以是一个文件也可以是一个目录,目录的形式称作包。

模块分类

内置模块

内置模块可以理解成当你安装好python环境之后,直接可以使用import导入的就是内置模块,默认模块路径为:C:Python35lib,你也可以通过以下方式获取内置模块的路径:

# 导入sys模块

>>>importsys

# 最后一个目录就是内置模块的路径

>>>forninsys.path:

...print(n)

...

C:Python35libsite-packagespip-8.1.1-py3.5.egg

C:Python35python35.zip

C:Python35DLLs

C:Python35lib

C:Python35

C:Python35libsite-packages

第三方模块

第三方模块通常是开发者自己编写的模块,然后提交到python官方的库中,这样我们就可以下载安装使用了,默认安装目录为C:Python35libsite-packages,

自定义模块

自己编写的模块

模块的导入方式

把一个模块当做成一个整体来进行导入

import sys

从一个模块中导入特定的变量或者是方法

from sys import path

调用的时候直接使用方法名path

>>>path

['','C:\Python35\lib\site-packages\pip-8.1.1-py3.5.egg','C:\Python35\python35.zip','C:\Python35\DLLs','C:\Python35\lib','C:\Python35','C:\Python35\lib\site-packages']

给导入的模块或者方法起一个别名

from sys import path as path_alias

调用的时候使用别名path_alias

>>>path_alias

['','C:\Python35\lib\site-packages\pip-8.1.1-py3.5.egg','C:\Python35\python35.zip','C:\Python35\DLLs','C:\Python35\lib','C:\Python35','C:\Python35\lib\site-packages']

添加默认的环境变量,当前生效

sys.path.append("PATH_NAME")

可以使用imp模块中的reload方法重新载入某个模块的方法,例如下面的实例:

$catsimple.py

#!/use/bin/env python

print('Hello, World!')

spam=1

>>>import simple

Hello,World!

>>>simple.spam

1

>>>simple.spam+=1

>>>importsimple

>>>simple.spam

2

>>>importimp

>>>imp.reload(simple)

Hello,World!

>>>simple.spam

1

模块导入顺序

先在当前脚本目录寻找有没有与导入模块名称相同的文件,如果有就把这个文件当作模块导入(据不完全统计,这是个坑,测试re模块没有问题,但是测试sys模块就有问题了)

查找模块路径下面有没有对应的模块名

如果没有找到模块名就报错

import是如何工作的?

模块在被导入的时候会执行以下三个步骤:

通过环境变量找到模块文件;

编译成字节码文件,如果有字节码文件则导入字节码文件;

执行模块中的代码来创建所定义的对象;

以上的三个步骤只有在程序运行时,模块被第一次导入时才会进行。如果已经导入了这个模块然后再次导入的时候会跳过上面的三个步骤,它会直接提取内存中已经加载的模块对象。Python已经导入的模块会保存在sys.modules字典中。

_X与__all__

在模块中的所有变量以_开头的都不会被from *所导入

$catsimple.py

#!/use/bin/env python

_spam1=1

spam2=1

>>>from simple import *

>>>dir()

# _spam1没有被导入

['__builtins__','__doc__','__name__','__package__','spam2']

相反的__all__列表里面的变量则会被from *所导入,没有在__all__列表里面的变量则不会被导入

$catsimple.py

#!/use/bin/env python

__all__=['spam2']

spam1=1

spam2=1

>>>from simple import *

>>>dir()

# spam1没有被导入

['__builtins__','__doc__','__name__','__package__','spam2']

注意事项

据不完全统计,如果导入的模块的名称在当前目录下有这个文件,那么只会把当前目录下的这个文件当作模块,如下演示:

创建一个脚本文件,名称为scripts

[root@iZ28i253je0Z ~]# touch scripts.py

内容为

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

# 导入一个模块re

importre

# 输出匹配到的字符串abc

print(re.match('w+',"abc").group())

执行脚本

[root@iZ28i253je0Z~]# python scripts.py

# 把匹配到的结果abc输出出来

abc

创建一个.py文件,名称为re.py

[root@iZ28i253je0Z ~]# touch re.py

内容为

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

# 输出内容modus

print("Hello Word")

再次执行scripts.py脚本

[root@iZ28i253je0Z~]# python scripts.py

# 先输出Hello Word

HelloWord

# 然后再报错没有match这个方法

Traceback(most recent calllast):

File"scripts.py",line6,in

print(re.match('w+',"abc").group())

AttributeError:'module'objecthas noattribute'match'

这是为什么呢?因为python把re.py当成模块re了,继续往下看:

更改scripts.py文件内容如下

[root@iZ28i253je0Z~]# cat scripts.py

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

importre

re.py文件内容不变,然后我们在执行脚本scripts.py

[root@iZ28i253je0Z~]# python scripts.py

HelloWord

看到了吧,他会把re.py文件内的代码拿到scripts.py文件中去执行,这是个坑,最好别踩。

导入当前目录下子目录下的文件

[root@ansheng~]# tree ./

./

├──modules

│├──__init__.py

│├──lib01.py

│└──lib02.py

└──scripts.py

1directory,4files

[root@ansheng~]# cat scripts.py

#!/usr/bin/env python

# 导入modules包下面的lib01模块

from modules importlib01

# 导入modules包下面的lib02模块

from modules importlib02

[root@ansheng~]# cat modules/__init__.py

#!/usr/bin/env python

[root@ansheng~]# cat modules/lib01.py

#!/usr/bin/env python

# lib01.py文件会输出"Hello lib01"

print("Hello lib01")

[root@ansheng~]# cat modules/lib02.py

#!/usr/bin/env python

# lib02.py文件会输出"Hello lib02"

print("Hello lib02")

执行结果

[root@ansheng~]# python scripts.py

# 会执行modules/lib02.py与modules/lib01.py文件内容

Hello lib01

Hellolib02

包含目录下的文件时需要在目录下声明一个__init__.py文件,即使这个文件是空的也可以。学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是301,还有056,最后是051,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。如果你看了觉得还可以的麻烦给我点个赞谢谢

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容