日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

day21.模块和包

發(fā)布時(shí)間:2025/3/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day21.模块和包 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
博客整理來源:http://www.cnblogs.com/Eva-J/articles/7292109.html

模塊

1.什么是模塊

常見的場(chǎng)景:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件,文件名就是模塊名字加上.py的后綴。

?但其實(shí)import加載的模塊分為四個(gè)通用類別: 

  1 使用python編寫的代碼(.py文件)

  2 已被編譯為共享庫(kù)或DLL的C或C++擴(kuò)展

  3 包好一組模塊的包

  4 使用C編寫并鏈接到python解釋器的內(nèi)置模塊

2.為何要使用模塊

? 如果你退出python解釋器然后重新進(jìn)入,那么你之前定義的函數(shù)或者變量都將丟失,因此我們通常將程序?qū)懙轿募幸员阌谰帽4嫦聛?#xff0c;

需要時(shí)就通過python test.py方式去執(zhí)行,此時(shí)test.py被稱為腳本script。

? ? 隨著程序的發(fā)展,功能越來越多,為了方便管理,我們通常將程序分成一個(gè)個(gè)的文件,這樣做程序的結(jié)構(gòu)更清晰,方便管理。

這時(shí)我們不僅僅可以把這些文件當(dāng)做腳本去執(zhí)行,還可以把他們當(dāng)做模塊來導(dǎo)入到其他的模塊中,實(shí)現(xiàn)了功能的重復(fù)利用,

3.如何使用模塊

3.1 import

示例文件:自定義模塊my_module.py,文件名my_module.py,模塊名my_module

#my_module.py print('from the my_module.py')money=1000def read1():print('my_module->read1->money',money)def read2():print('my_module->read2 calling read1')read1()def change():global moneymoney=0

?3.1.1? 模塊單次調(diào)用? ? ? ?                       

模塊可以包含可執(zhí)行的語(yǔ)句和函數(shù)的定義,這些語(yǔ)句的目的是初始化模塊,它們只在模塊名第一次遇到導(dǎo)入import語(yǔ)句時(shí)才執(zhí)行.

模塊第一次導(dǎo)入后加載進(jìn)內(nèi)存,后續(xù)的import語(yǔ)句加載內(nèi)存模塊,不會(huì)重復(fù)調(diào)用

#demo.py import my_module #只在第一次導(dǎo)入時(shí)才執(zhí)行my_module.py內(nèi)代碼,此處的顯式效果是只打印一次'from the my_module.py',當(dāng)然其他的頂級(jí)代碼也都被執(zhí)行了,只不過沒有顯示效果. import my_module import my_module import my_module''' 執(zhí)行結(jié)果: from the my_module.py '''

3.1.2 模塊變量不會(huì)影響自定義變量                      

每個(gè)模塊都是一個(gè)獨(dú)立的名稱空間,定義在這個(gè)模塊中的函數(shù),把這個(gè)模塊的名稱空間當(dāng)做全局名稱空間,這樣我們?cè)诰帉懽约旱哪K時(shí),

就不用擔(dān)心我們定義在自己模塊中全局變量會(huì)在被導(dǎo)入時(shí),與使用者的全局變量沖突

?

#測(cè)試一:money與my_module.money不沖突 #demo.py import my_module money=10 print(my_module.money)
print(money)
''' 執(zhí)行結(jié)果: from the my_module.py
1000
10
''' #測(cè)試二:read1與my_module.read1不沖突 #demo.py import my_module def read1():print('========') my_module.read1()''' 執(zhí)行結(jié)果: from the my_module.py my_module->read1->money 1000 '''

3.1.3 總結(jié)                 

總結(jié):首次導(dǎo)入模塊my_module時(shí)會(huì)做3件事

1.為源文件(my_module模塊)創(chuàng)建新的名稱空間,在my_module中定義的函數(shù)和方法若是使用到了global時(shí)訪問的就是這個(gè)名稱空間。

2.在新創(chuàng)建的命名空間中執(zhí)行模塊中包含的代碼,見初始導(dǎo)入import?my_module

3.創(chuàng)建名字my_module來引用該命名空間

3.1.4 為模塊重命名            

事例1:方便調(diào)用

有兩中sql模塊mysql和oracle,根據(jù)用戶的輸入,選擇不同的sql功能

#mysql.py def sqlparse():print('from mysql sqlparse') #oracle.py def sqlparse():print('from oracle sqlparse')#test.py db_type=input('>>: ') if db_type == 'mysql':import mysql as db    # 將mysql 和oracle 都命名為 db,調(diào)用mysql或oracle都可直接調(diào)用db,方便快捷 elif db_type == 'oracle':import oracle as db

3.1.5 一行導(dǎo)入多個(gè)模塊 (不常用)   

import sys,os,re

3.2 from ... import ...

3.2.1                      

對(duì)比import my_module,會(huì)將源文件的名稱空間'my_module'帶到當(dāng)前名稱空間中,使用時(shí)必須是my_module.名字的方式

而from 語(yǔ)句相當(dāng)于import,也會(huì)創(chuàng)建新的名稱空間,但是將my_module中的名字直接導(dǎo)入到當(dāng)前的名稱空間中,在當(dāng)前名稱空間中,直接使用名字就可以了、

#測(cè)試一:導(dǎo)入的函數(shù)read1,執(zhí)行時(shí)仍然回到my_module.py中尋找全局變量money #demo.py from my_module import read1 money=100 read1() ''' 執(zhí)行結(jié)果: from the my_module.py spam->read1->money 1000 '''#測(cè)試二:導(dǎo)入的函數(shù)read2,執(zhí)行時(shí)需要調(diào)用read1(),仍然回到my_module.py中找read1() #demo.py from my_module import read2 def read1():print('==========') read2()''' 執(zhí)行結(jié)果: from the my_module.py my_module->read2 calling read1 my_module->read1->money 1000 '''

如果當(dāng)前有重命名read1或者read2,那么會(huì)有覆蓋現(xiàn)象。(函數(shù)級(jí)別)

#測(cè)試三:導(dǎo)入的函數(shù)read1,被當(dāng)前位置定義的read1覆蓋掉了 #demo.py from my_module import read1 def read1():print('==========') read1() ''' 執(zhí)行結(jié)果: from the my_module.py ========== '''

需要特別強(qiáng)調(diào)的一點(diǎn)是:python中的變量賦值不是一種存儲(chǔ)操作,而只是一種綁定關(guān)系,如下:

?

from my_module import money,read1 money=100 #將當(dāng)前位置的名字money綁定到了100 print(money) #打印當(dāng)前的名字 read1() #讀取my_module.py中的名字money,仍然為1000''' from the my_module.py my_module->read1->money 1000 '''

3.2.2? 也支持重命名        

3.2.3? 也支持多行導(dǎo)入        

3.3 把模塊當(dāng)做腳本執(zhí)行

我們可以通過模塊的全局變量__name__來查看模塊名:
當(dāng)做腳本運(yùn)行:
__name__ 等于'__main__'

當(dāng)做模塊導(dǎo)入:
__name__=?模塊名

作用:用來控制.py文件在不同的應(yīng)用場(chǎng)景下執(zhí)行不同的邏輯
if __name__ == '__main__':

# 模塊a a = 100 print('這是模塊a') if __name__ == '__main__':print(a)# 模塊b import a b = 200 print('這是模塊b') print(b)
# 在模塊 b 中調(diào)入模塊a 的執(zhí)行結(jié)果: 這是模塊a 這是模塊b 200

當(dāng)你要導(dǎo)入某個(gè)模塊,但又不想改模塊的部分代碼被直接執(zhí)行,那就可以這一部分代碼放在“if __name__=='__main__':

二 包

1. 無論是import形式還是from...import形式,凡是在導(dǎo)入語(yǔ)句中(而不是在使用時(shí))遇到帶點(diǎn)的,都要第一時(shí)間提高警覺:這是關(guān)于包才有的導(dǎo)入語(yǔ)法

2. 包是目錄級(jí)的(文件夾級(jí)),文件夾是用來組成py文件(包的本質(zhì)就是一個(gè)包含__init__.py文件的目錄)

3. import導(dǎo)入文件時(shí),產(chǎn)生名稱空間中的名字來源于文件,import 包,產(chǎn)生的名稱空間的名字同樣來源于文件,即包下的__init__.py,導(dǎo)入包本質(zhì)就是在導(dǎo)入該文件

強(qiáng)調(diào):

  1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會(huì)報(bào)錯(cuò),而在python2中,包下一定要有該文件,否則import 包報(bào)錯(cuò)

  2. 創(chuàng)建包的目的不是為了運(yùn)行,而是被導(dǎo)入使用,記住,包只是模塊的一種形式而已,包即模塊

?

轉(zhuǎn)載于:https://www.cnblogs.com/jiuyachun/p/10592604.html

總結(jié)

以上是生活随笔為你收集整理的day21.模块和包的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。