Python学习 Day 025 -模块相关
主要內(nèi)容:
- 1. 模塊
- 2. import
- 3. from xxx import xxx
1.模塊
? ?(1)模塊的概述
? ?模塊就是一個(gè)包含了python定義和聲明的文件, 文件名就是模塊的名字加上.py后綴,也就是說(shuō)我們目前寫(xiě)的所有的py文件都可以看成是一個(gè)模塊
? ?但是我們import加載的模塊一共分成四個(gè)通用類(lèi)別.
- ?使用pyhton編寫(xiě)的py文件
- ?已被變異為共享庫(kù)或者DLL或C或者C++的擴(kuò)展
- ?包好?組模塊的包.
- ?使用c編寫(xiě)并連接到python解釋器的內(nèi)置模塊
(2)模塊的使用緣由
使用模塊是為了我們寫(xiě)的代碼可以重用,不至于把所有的代碼都寫(xiě)在一個(gè)文件內(nèi),當(dāng)項(xiàng)目規(guī)模比較小的時(shí)候. 完全可以使用一個(gè)py搞定整個(gè)項(xiàng)目的開(kāi)發(fā),但是如果是一個(gè)非常龐大的項(xiàng)目,此時(shí)就必須要把相關(guān)的功能進(jìn)行分離,方便我們?nèi)粘>S護(hù),以及新項(xiàng)目的開(kāi)發(fā).? ?
(3)模塊的使用? ? ? ? ? ? ?
? ? ?導(dǎo)入模塊有兩種方式? ? ? ? ? ?
- import 模塊? ? ? ? ? ?
- from xxx import xxxx
2. import
print("片頭曲,倚天屠龍........") main_person_man = "張無(wú)忌" main_person_woman = "趙敏"bad_person_one = "成昆" bad_person_two = "周芷若"def fight_on_light_top():print(main_person_man, "粉碎了",bad_person_one ,"的陰謀")def fight_in_shaolin():print(main_person_man, "粉碎了", bad_person_two, "的陰謀")打開(kāi)另一個(gè)py文件
import yitian print(yitian.main_person_man) # 使?用模塊中定義好的名字 print(yitian.bad_person_one)yitian.fight_in_shaolin() # 調(diào)?用模塊中的函數(shù) yitian.fight_on_light_top()此時(shí)在這個(gè)py文件中引入了yitian模塊
注: 在Python中模塊是不能夠重復(fù)導(dǎo)入的,當(dāng)重復(fù)導(dǎo)入模塊時(shí),系統(tǒng)會(huì)根據(jù)sys.modules來(lái)判斷該模塊是否已經(jīng)導(dǎo)入了,如果已經(jīng)導(dǎo)入,則不會(huì)重復(fù)導(dǎo)
import sys print(sys.modules.keys()) # 查看導(dǎo)?入的模塊. import yitian # 導(dǎo)?入模塊. 此時(shí)會(huì)默認(rèn)執(zhí)行該模塊中的代碼 import yitian # 該模塊已經(jīng)導(dǎo)入過(guò)了. 不會(huì)重復(fù)執(zhí)行代碼 import yitian import yitian導(dǎo)入模塊(import之后)時(shí)候做了什么?
- python解釋器會(huì)先通過(guò) sys.modules來(lái)判斷該模塊是否已經(jīng)導(dǎo)入了該模塊. 如果已經(jīng)導(dǎo)入了則不再導(dǎo)入.
- 為導(dǎo)入的模塊創(chuàng)立新的名稱(chēng)空間? ? ? ? ? ?
- 在新創(chuàng)建的名稱(chēng)空間中運(yùn)行該模塊中的代碼? ? ? ? ? ?
- 創(chuàng)建模塊的名字,并使用該名稱(chēng)作為該模塊在當(dāng)前模塊中引用的名字.
我們可以使用globals來(lái)查看模塊的名稱(chēng)空間
import yitian print(globals()) #{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000018141DE4A90>, # '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/Python_workspace/day 025/金庸.py', '__cached__': None, # 'yitian': <module 'yitian' from 'E:\\Python_workspace\\day 025\\yitian.py'>}注意. 由于模塊在導(dǎo)入的時(shí)候會(huì)創(chuàng)建其自己的名稱(chēng)空間,所以,我們?cè)谑褂媚K中的變量的時(shí)候一般是不會(huì)產(chǎn)生沖突的
import yitian main_person_man="蕭峰" def fight_in_shaolin():print(main_person_man+"大戰(zhàn)掃地僧") print(yitian.main_person_man) #張無(wú)忌 print(main_person_man) #蕭峰 yitian.fight_in_shaolin() #張無(wú)忌粉碎了周芷若的陰謀 fight_in_shaolin() #蕭峰大戰(zhàn)掃地僧注意. 在模塊中使用global. 我們之前說(shuō)global表示把全局的內(nèi)容引入到局部,但是,這個(gè)全局指的是py文件,換句句話說(shuō). global指向的是模塊內(nèi)部. 并不會(huì)改變外部模塊的內(nèi)容?
print("片頭曲,倚天屠龍........") main_person_man = "張無(wú)忌" main_person_woman = "趙敏"bad_person_one = "成昆" bad_person_two = "周芷若"def fight_on_light_top():print(main_person_man+"粉碎了"+bad_person_one+"的陰謀")def fight_in_shaolin():global bad_person_twobad_person_two = "戰(zhàn)五渣"print(main_person_man+"粉碎了"+bad_person_two+"的陰謀")# 調(diào)用方 import yitian bad_person_two = "宋青書(shū)" yitian.fight_in_shaolin() print(yitian.bad_person_two) # 戰(zhàn)五渣 print(bad_person_two) # 宋青書(shū),并沒(méi)有改變當(dāng)前模塊中的內(nèi)容. 所以模塊內(nèi)部的 global只是用于模塊內(nèi)部特別特別要注意:如果我們?cè)诓煌哪K中引入了同一個(gè)模塊. 并且在某一個(gè)模塊中改變了被引入模塊中的全局變量,則其他模塊看到的值也跟著邊,原因是python的模塊只會(huì)引入一次,大家共享同一個(gè)名稱(chēng)空間
金庸: import yitian yitian.main_person_man = "滅絕師太" 金庸二號(hào): import yitian import 金庸 print(yitian.main_person_man) # 滅絕師太?上述問(wèn)題出現(xiàn)的原因:? ? ? ? ? ? ?
- 大家共享同一個(gè)模塊的名稱(chēng)空間? ? ? ? ??
- 在金庸里改變了主角的名字? ? ? ? ?
可以利用一下__name__ 這個(gè)內(nèi)置變量
在Python中,每個(gè)模塊都有自己的__name__ 但是這個(gè)__name__的值是不定的.
當(dāng)我們把?個(gè)模塊作為程序運(yùn)行的入口時(shí),此時(shí)該模塊的__name__是"__main__" ,而如果我們把模塊導(dǎo)入時(shí),此時(shí)模塊內(nèi)部的__name__就是該模塊自?身的名字
金庸: print(__name__) # 此時(shí)如果運(yùn)行該文件. 則__name__是__main__ 金庸二號(hào): import 金庸 #此時(shí)打印的結(jié)果是"金庸"?我們可以利用這個(gè)特性來(lái)控制模塊內(nèi)哪些代碼是在被加載的時(shí)候就運(yùn)行的,哪些是在模塊被別人導(dǎo)入的時(shí)候就要執(zhí)行的,也可以屏蔽掉一些不希望別人導(dǎo)入就運(yùn)行的代碼,尤其是測(cè)試代碼.
if __name__ == '__main__': yitian.main_person_man = "滅絕師太" # 此時(shí), 只有從該模塊作為?口運(yùn)行的時(shí)候才會(huì)把main_person_man設(shè)置成滅絕師太 print("哇哈哈哈哈哈") # 只有運(yùn)行該模塊才會(huì)打印. import的時(shí)候是不會(huì)執(zhí)行這里的代碼的? 我們還可以對(duì)導(dǎo)入的模塊進(jìn)行重新命名:
import yitian as yt # 導(dǎo)入yitian. 但是名字被重新命名成了yt. 就好比變量賦值一樣. a = 1 b = a yt.fight_in_shaolin() # 此時(shí)可以正常運(yùn)行 # yitian.fight_in_shaolin() # 此時(shí)程序報(bào)錯(cuò). 因?yàn)橐氲膟itian被重命名成了了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'>}
一次可以引入多個(gè)模塊
import time, random, json, yitian? 正確的導(dǎo)入模塊的順序:? ? ? ? ? ?
- 所有的模塊導(dǎo)入都要寫(xiě)在最上面,這是最基本的? ? ? ? ? ?
- 先引入內(nèi)置模塊? ? ? ? ? ?
- 再引入擴(kuò)展模塊? ? ? ? ? ?
- 最后引入你自己定義的模塊
?
3. from xxx import xxx
在使用from的時(shí)候, python也會(huì)給我們的模塊創(chuàng)建名稱(chēng)空間,這一點(diǎn)和import是?樣的,但是from xxx import xxx的時(shí)候,我們是把這個(gè)空間中的一些變量引入過(guò)來(lái)了,說(shuō)白了,就 是部分導(dǎo)入,當(dāng)一個(gè)模塊中的內(nèi)容過(guò)多的時(shí)候. 我們可以選擇性的導(dǎo)入要使用的內(nèi)容.?
from yitian import fight_in_shaolinfight_in_shaolin()
此時(shí)是可以正常運(yùn)行的. 但是我們省略了之前的模塊,函數(shù)() 直接函數(shù)()就可以執(zhí)行了, 并且from語(yǔ)句也支持?行語(yǔ)句導(dǎo)入多個(gè)內(nèi)容.?
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的坑,當(dāng)我們從一個(gè)模塊中引入一個(gè)變量的時(shí)候,如果當(dāng)前文件中出現(xiàn)了重名的變量時(shí). 會(huì)覆蓋掉模塊引入的那個(gè)變量.
from yitian import main_person_man main_person_man = "超級(jí)大滅絕" print(main_person_man)所以,不要重名 切記. 不要重名! 不僅是變量量名不要重復(fù),我們自己創(chuàng)建的py文件的名字不要和系統(tǒng)內(nèi)置的模塊重名.否則,引入的模塊都是python內(nèi)置的模塊. 切記, 切記.?
?
轉(zhuǎn)載于:https://www.cnblogs.com/wcx666/p/9772765.html
總結(jié)
以上是生活随笔為你收集整理的Python学习 Day 025 -模块相关的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery的位置信息和事件
- 下一篇: CSS颜色