re模塊,自定義模塊

re模塊:python

 rejson

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

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

自定義模塊:
首先,咱們先看⼀一個老⽣生常談的問題. 什什麼是模塊. 模塊就是⼀一個包含了了python定義和聲
明的⽂文件, ⽂文件名就是模塊的名字加上.py後綴. 歡聚話說咱們⽬目前寫的全部的py⽂文件均可以
當作是⼀一個模塊可是咱們import加載的模塊⼀一共分紅四個通⽤用類別:
1. 使⽤用pyhton編寫的py⽂文件
2. 已被變異爲共享庫或者DLL或C或者C++的擴展
3. 包好⼀一組模塊的包.
4. 使⽤用c編寫並鏈接到python解釋器的內置模塊dom

爲什什麼要使⽤用模塊? 爲了了咱們寫的代碼能夠重⽤用. 不⾄至於把全部的代碼都寫在⼀一個⽂文件
內. 當項⽬目規模比較⼩小的時候. 徹底可使⽤用⼀一個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, "的⼤大陰ui


謀")
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/模塊/模it


塊/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 中:io

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()import


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內置的模塊. 切記, 切記.

相關文章
相關標籤/搜索