re模块,自定义模块

re模块:

 re

    findall()
finditer()
search()
match()

正则:在python中()表示分组 (?:)去掉python的分组
(?P<名字> 正则) 把正则匹配到的内容分组成"名字"组

自定义模块:
首先,我们先看⼀一个老⽣生常谈的问题. 什什么是模块. 模块就是⼀一个包含了了python定义和声
明的⽂文件, ⽂文件名就是模块的名字加上.py后缀. 欢聚话说我们⽬目前写的所有的py⽂文件都可以
看成是⼀一个模块但是我们import加载的模块⼀一共分成四个通⽤用类别:
1. 使⽤用pyhton编写的py⽂文件
2. 已被变异为共享库或者DLL或C或者C++的扩展
3. 包好⼀一组模块的包.
4. 使⽤用c编写并连接到python解释器的内置模块

为什什么要使⽤用模块? 为了了我们写的代码可以重⽤用. 不⾄至于把所有的代码都写在⼀一个⽂文件
内. 当项⽬目规模比较⼩小的时候. 完全可以使⽤用⼀一个py搞定整个项⽬目的开发. 但是如果是⼀一个⾮非
常庞⼤大的项⽬目. 此时就必须要把相关的功能进⾏行行分离. ⽅方便便我们的⽇日常维护. 以及新项⽬目的开
发.

如何使⽤用模块? 我们已经⽤用过很多模块了了. 导入模块有两种⽅方式
1. import 模块
2. from xxx import xxxx
⼆二. import
⾸首先. 我们先看import, 在使⽤用import的时候, 我们先创建⼀一个yitian.py. 在该⽂文件中创建
⼀一些武林林前辈和⼀一些打⽃斗场景, 代码如下.

print("⽚片头曲. 啊! 啊~ 啊! 啊. 啊啊啊啊啊啊啊...")
main_person_man = "张⽆无忌"
main_person_woman = "赵敏敏"
low_person_man_one = "成昆"
low_person_man_two = "周芷若"
def fight_on_light_top():
print("光明顶⼤大战", main_person_man, "破坏了了", low_person_man_one, "的⼤大阴


谋")
def fight_in_shaolin():
print("少林林寺⼤大战", main_person_man, "破坏了了", low_person_man_two, "的⼤大阴
谋")
接下来, ⾦金金庸上场.
import yitian
print(yitian.main_person_man) # 使⽤用模块中定义好的名字
print(yitian.low_person_man_one)
yitian.fight_in_shaolin() # 调⽤用模块中的函数
yitian.fight_on_light_top()

此时我们在⾦金金庸模块中引入了了yitian模块.

在Python中模块是不能够重复导入的. 当重复导入模块时. 系统会根据sys.modules来判
断该模块是否已经导入了了. 如果已经导入. 则不会重复导入
import sys
print(sys.modules.keys()) # 查看导⼊入的模块.
import yitian # 导⼊入模块. 此时会默认执⾏行行该模块中的代码
import yitian # 该模块已经导⼊入过了了. 不不会重复执⾏行行代码
import yitian
import yitian
import yitian
import yitian

导入模块的时候都做了了些什什么? ⾸首先. 在导入模块的⼀一瞬间. python解释器会先通过
sys.modules来判断该模块是否已经导入了了该模块. 如果已经导入了了则不再导入. 如果该模块
还未导入过. 则系统会做三件事.
1. 为导入的模块创⽴立新的名称空间
2. 在新创建的名称空间中运⾏行行该模块中的代码
3. 创建模块的名字. 并使⽤用该名称作为该模块在当前模块中引⽤用的名字.
我们可以使⽤用globals来查看模块的名称空间
print(globals())
打印结果:
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at
0x10bbcf438>, '__spec__': None, '__annotations__': {}, '__builtins__':
<module 'builtins' (built-in)>, '__file__':
'/Users/sylar/PycharmProjects/oldboy/模块/模块/⾦金金庸.py', '__cached__': None,
'yitian': <module 'yitian' from '/Users/sylar/PycharmProjects/oldboy/模块/模


块/yitian.py'>, 'sys': <module 'sys' (built-in)>}
注意. 由于模块在导入的时候会创建其⾃自⼰己的名称空间. 所以. 我们在使⽤用模块中的变量量
的时候⼀一般是不会产⽣生冲突的.
import yitian
main_person_man = "胡⼀一菲"
def fight_in_shaolin():
print(main_person_man, "⼤大战曾⼩小贤")
print(yitian.main_person_man) # 张⽆无忌
print(main_person_man) # 胡⼀一菲
yitian.fight_in_shaolin() # 倚天屠⻰龙记中的
fight_in_shaolin() # ⾃自⼰己的
注意. 在模块中使⽤用global. 我们之前说global表⽰示把全局的内容引入到局部. 但是. 这个
全局指的是py⽂文件. 换句句话说. global指向的是模块内部. 并不会改变外部模块的内容
模块 yitian 中:

print("⽚片头曲. 啊! 啊~ 啊! 啊. 啊啊啊啊啊啊啊...")
main_person_man = "张⽆无忌"
main_person_woman = "赵敏敏"
low_person_man_one = "成昆"
low_person_man_two = "周芷若"
def fight_on_light_top():
print("光明顶⼤大战", main_person_man, "破坏了了", low_person_man_one, "的⼤大阴
谋")
def fight_in_shaolin():
global low_person_man_two # 注意看, 此时的global是当前模块. 并不不会影响
其他模块
low_person_man_two = "战五渣"
print("少林林寺⼤大战", main_person_man, "破坏了了", low_person_man_two, "的⼤大阴
谋")
调⽤用⽅方:
import yitian
low_person_man_two = "刘海海柱"
yitian.fight_in_shaolin()


print(yitian.low_person_man_two) # 战五渣
print(low_person_man_two) # 刘海海柱. 并没有改变当前模块中的内容. 所以模块内部的
global只是⽤用于模块内部
特别特别要注意. 如果我们在不同的模块中引入了了同⼀一个模块. 并且在某⼀一个模块中改
变了了被引入模块中的全局变量量. 则其他模块看到的值也跟着边. 原因是python的模块只会引入
⼀一次. ⼤大家共享同⼀一个名称空间
⾦金金庸:
import yitian
yitian.main_person_man = "灭绝师太"
⾦金金庸⼆二号:
import yitian
import ⾦金金庸
print(yitian.main_person_man) # 灭绝师太.
上述问题出现的原因:
1. ⼤大家共享同⼀一个模块的名称空间.
2. 在⾦金金庸⾥里里改变了了主⻆角的名字
如何解决呢?
⾸首先. 我们不能去改python. 因为python的规则不是我们定的. 只能想办法不要改变主
⻆角的名字. 但是. 在⾦金金庸⾥里里我就有这样的需求. 那此时就出现了了. 在⾦金金庸被执⾏行行的时候要执⾏行行
的代码. 在⾦金金庸被别⼈人导入的时候我们不想执⾏行行这些代码. 此时, 我们就要利利⽤用⼀一下__name__
这个内置变量量了了. 在Python中. 每个模块都有⾃自⼰己的__name__ 但是这个__name__的值是不
定的. 当我们把⼀一个模块作为程序运⾏行行的入⼝口时. 此时该模块的__name__是"__main__" , ⽽而
如果我们把模块导入时. 此时模块内部的__name__就是该模块⾃自⾝身的名字
⾦金金庸:
print(__name__)
# 此时如果运⾏行行该⽂文件. 则__name__是__main__
⾦金金庸⼆二号:
import ⾦金金庸
#此时打印的结果是"⾦金金庸"
我们可以利利⽤用这个特性来控制模块内哪些代码是在被加载的时候就运⾏行行的. 哪些是在模
块被别⼈人导入的时候就要执⾏行行的. 也可以屏蔽掉⼀一些不希望别⼈人导入就运⾏行行的代码. 尤其是测
试代码.
if __name__ == '__main__':
yitian.main_person_man = "灭绝师太" # 此时, 只有从该模块作为⼊入⼝口运⾏行行的时候才
会把main_person_man设置成灭绝师太
print("哇哈哈哈哈哈") # 只有运⾏行行该模块才会打印. import的时候是不不会执⾏行行这⾥里里的代
码的



我们还可以对导入的模块进⾏行行重新命名:
import yitian as yt # 导⼊入yitian. 但是名字被重新命名成了了yt. 就好⽐比变量量赋值⼀一样.
a = 1 b = a

yt.fight_in_shaolin() # 此时可以正常运⾏行行
# yitian.fight_in_shaolin() # 此时程序报错. 因为引⼊入的yitian被重命名成了了yt
print(globals())
{'__name__': '__main__', '__doc__': None, '__package__': None,
'__loader__': <_frozen_importlib_external.SourceFileLoader object at
0x103209438>, '__spec__': None, '__annotations__': {}, '__builtins__':
<module 'builtins' (built-in)>, '__file__':
'/Users/sylar/PycharmProjects/oldboy/模块/模块/⾦金金庸.py', '__cached__': None,
'yt': <module 'yitian' from '/Users/sylar/PycharmProjects/oldboy/模块/模
块/yitian.py'>}

⼀一次可以引入多个模块
import time, random, json, yitian

正确的导入模块的顺序:
1. 所有的模块导入都要写在最上⾯面. 这是最基本的
2. 先引入内置模块
3. 再引入扩展模块
4. 最后引入你⾃自⼰己定义的模块
三. from xxx import xxx
第⼀一⼤大块关于import就说这么多. 接下来. 我们来看from xxx import xxx这种导入模块的
效果. 在使⽤用from的时候, python也会给我们的模块创建名称空间. 这⼀一点和import是⼀一样
的. 但是from xxx import xxx的时候. 我们是把这个空间中的⼀一些变量量引入过来了了. 说⽩白了了. 就
是部分导入. 当⼀一个模块中的内容过多的时候. 我们可以选择性的导入要使⽤用的内容.
from yitian import fight_in_shaolin
fight_in_shaolin()
此时是可以正常运⾏行行的. 但是我们省略略了了之前的模块.函数() 直接函数()就可以执⾏行行了了, 并
且from语句句也⽀支持⼀一⾏行行语句句导入多个内容.
from yitian import fight_in_shaolin, fight_on_light_top, main_person_man
fight_in_shaolin()
fight_on_light_top()
print(main_person_man)
同样⽀支持as
from yitian import fight_in_shaolin, fight_on_light_top, main_person_man as


big_lao
fight_in_shaolin()
fight_on_light_top()
print(big_lao)
最后. 看⼀一下from的坑. 当我们从⼀一个模块中引入⼀一个变量量的时候. 如果当前⽂文件中出现
了了重名的变量量时. 会覆盖掉模块引入的那个变量量.
from yitian import main_person_man
main_person_man = "超级⼤大灭绝"
print(main_person_man)

所以. 不要重名. 切记. 不要重名! 不仅仅是变量量名不要重复. 我们⾃自⼰己
创建的py⽂文件的名字不不要和系统内
置的模块重名. 否则. 引入的模块都是python内置的模块. 切记, 切记.

 
posted @ 2018-10-11 16:25  学习python1234  阅读(129)  评论(0编辑  收藏  举报
levels of contents