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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python好用的模块和包_Python模块和包详细讲解与实例分析

發(fā)布時(shí)間:2023/12/4 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python好用的模块和包_Python模块和包详细讲解与实例分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一丶模塊

我們經(jīng)常說(shuō)模塊模塊的,究竟什么是模塊呢?

一個(gè)模塊就是包含了Python定義和聲明的文件,文件名就是模塊名字加上.py的后綴

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

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

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

3.包好一組模塊的包

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

import

from?import導(dǎo)入的過(guò)程中發(fā)生了什么事兒?

1.找到要被導(dǎo)入的模塊

2.判斷這個(gè)模塊是否被導(dǎo)入過(guò)

3.如果這個(gè)模塊沒(méi)被導(dǎo)入

創(chuàng)建一個(gè)屬于這個(gè)模塊的命名空間

執(zhí)行這個(gè)文件

找到你要導(dǎo)入的變量

給你要導(dǎo)入的變量創(chuàng)建一個(gè)引用,指向你要導(dǎo)入的變量

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

importsysprint(sys.modules) #導(dǎo)入的模塊會(huì)寫在這里面

sys.path.append(my_module) #將my_module模塊寫入里面

import my_module #導(dǎo)入my_module模塊

print(my_module.name) #調(diào)用my_module中的name

為模塊起別名

#給模塊起別名

importmy_moudle as m

m.read1#給模塊起別名,起了別名之后,使用這個(gè)模塊就都使用別名引用變量了

導(dǎo)入多個(gè)模塊

#導(dǎo)入多個(gè)模塊

importos,timeimportos as o,time as t#規(guī)范建議:先導(dǎo)入內(nèi)置模塊,再導(dǎo)入擴(kuò)展(第三方)模塊,再導(dǎo)入自定義模塊

from..import

from my_module importread1defread1():print('in my read1')from my_module importread2

read1()

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

from my_module importmoney,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'''

from?my_module?import *

from my_module import * #將模塊my_module中所有的名字都導(dǎo)入到當(dāng)前名稱空間

print(money)print(read1)print(read2)print(change)'''執(zhí)行結(jié)果:

from the my_module.py

'''

__all__能約束*導(dǎo)入的變量的內(nèi)容

__all__ = ['name','read1','read2']from my_module import *

print(name)

read1()

read2()

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

當(dāng)一個(gè)py文件

當(dāng)做一個(gè)腳本的時(shí)候:能夠獨(dú)立的提供一個(gè)功能,能自主完成交互

當(dāng)成一個(gè)模塊的時(shí)候,能夠被導(dǎo)入這個(gè)調(diào)用這個(gè)功能,不能自主交互

我們可以通過(guò)模塊的全局變量__name__來(lái)查看模塊名:

當(dāng)做腳本運(yùn)行:

__name__等于'__main__'

當(dāng)做模塊導(dǎo)入:

__name__=模塊名

作用:用來(lái)控制.py文件在不同的應(yīng)用場(chǎng)景下執(zhí)行不同的邏輯

if__name__=='__main__'

deffib(n):

a, b= 0, 1

while b

a, b= b, a+bprint()if __name__ == "__main__":print(__name__)

num= input('num :')

fib(int(num))

模塊搜索路徑

Python解釋器在啟動(dòng)時(shí)會(huì)自動(dòng)加載一些模塊,可以使用sys.modules查看

在第一次導(dǎo)入某個(gè)模塊時(shí)(比如my_module),會(huì)先檢查該模塊是否已經(jīng)被加載到內(nèi)存中,如果有則直接引用,如果沒(méi)有,解釋器則會(huì)查找同名的內(nèi)建模塊,如果還沒(méi)有找到就送sys.path給出的目錄列表中依次尋找my_module.py文件

所以總結(jié)模塊的查找順序是:內(nèi)存中已經(jīng)加載的模塊->內(nèi)置模塊->sys.path路徑中包含的模塊

importsysimportcalculateprint(sys.path)

path= r'D:Learnday21模塊的循環(huán)引用'sys.path.append(path)

編譯Python文件

1.如果是在命令中被直接導(dǎo)入模塊,則按照這種方式,每次導(dǎo)入都會(huì)重新編譯,并且不會(huì)存儲(chǔ)編譯后的結(jié)果

2.如果源文件不存在,那么緩存的結(jié)果也不會(huì)被使用,如果想在沒(méi)有源文件的情況下來(lái)使用編譯后的結(jié)果,則編譯后的結(jié)果必須在源目錄下

dir()函數(shù)

內(nèi)建函數(shù)dir是用來(lái)查找模塊中定義的名字,返回一個(gè)有序字符串列表.如果沒(méi)有參數(shù),dir()列舉出當(dāng)前定義的名字

importmy_module

dir(my_module)

二丶包

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

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

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

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

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

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

importos

os.makedirs('glance/api')

os.makedirs('glance/cmd')

os.makedirs('glance/db')

l=[]

l.append(open('glance/__init__.py','w'))

l.append(open('glance/api/__init__.py','w'))

l.append(open('glance/api/policy.py','w'))

l.append(open('glance/api/versions.py','w'))

l.append(open('glance/cmd/__init__.py','w'))

l.append(open('glance/cmd/manage.py','w'))

l.append(open('glance/db/models.py','w'))

map(lambda f:f.close() ,l)

創(chuàng)建目錄代碼

glance/ #Top-level package

├──__init__.py #Initialize the glance package

├── api#Subpackage for api

│ ├──__init__.py

│ ├── policy.py

│ └── versions.py

├── cmd#Subpackage for cmd

│ ├──__init__.py

│ └── manage.py

└── db#Subpackage for db

├──__init__.py

└── models.py

目錄結(jié)構(gòu)

#文件內(nèi)容

#policy.py

defget():print('from policy.py')#versions.py

defcreate_resource(conf):print('from version.py:',conf)#manage.py

defmain():print('from manage.py')#models.py

defregister_models(engine):print('from models.py:',engine)

文件內(nèi)容

在導(dǎo)入包時(shí)必須遵守一個(gè)原則:凡是在導(dǎo)入時(shí)帶點(diǎn)的,點(diǎn)的左邊都必須是一個(gè)包

from..import

需要注意的是from后導(dǎo)入的模塊,必須是明確的一個(gè)不能帶點(diǎn),否則會(huì)有語(yǔ)法錯(cuò)誤

from glance.db importmodels

models.register_models('mysql')from glance.db.models importregister_models

register_models('mysql')

import

importglance.db.models

glance.db.models.register_models('mysql')

__init__.py文件

不管是哪種方式,只要是第一次導(dǎo)入包或者包的任何其他部分,都會(huì)依次執(zhí)行包下的__init__.py文件,這個(gè)文件可以為空,但是也可以存在一些初始化包的代碼

from?glance.api?import *

此處是想從包api中導(dǎo)所有,實(shí)際上該語(yǔ)句只會(huì)導(dǎo)入包api下__init__.py文件中定義的名字,我們可以在這個(gè)文件中定義__all__:

#在__init__.py中定義

x=10

deffunc():print('from api.__init.py')__all__=['x','func','policy']

絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入

絕對(duì)導(dǎo)入:以glance作為起始

相對(duì)導(dǎo)入:用.或者..的方式最為起始(只能在一個(gè)包中使用,不能用于不同的目錄內(nèi))

例如:我們?cè)趃lance/api/version.py中想要導(dǎo)入glance/cmd/manage.py

在glance/api/version.py#絕對(duì)導(dǎo)入

from glance.cmd importmanage

manage.main()#相對(duì)導(dǎo)入

from ..cmd importmanage

manage.main()

特別需要注意的是:可以用import導(dǎo)入內(nèi)置或者第三方模塊(已經(jīng)在sys.path中),但是要絕對(duì)避免使用import來(lái)導(dǎo)入自定義包的子模塊(沒(méi)有在sys.path中),應(yīng)該使用from... import ...的絕對(duì)或者相對(duì)導(dǎo)入,且包的相對(duì)導(dǎo)入只能用from的形式。

絕對(duì)導(dǎo)入:

glance/├──__init__.py from glance importapifrom glance importcmdfrom glance importdb

├── api

│ ├──__init__.py from glance.api importpolicyfrom glance.api importversions

│ ├── policy.py

│ └── versions.py

├── cmdfrom glance.cmd importmanage

│ ├──__init__.py

│ └── manage.py

└── dbfrom glance.db importmodels

├──__init__.py

└── models.py

絕對(duì)導(dǎo)入

絕對(duì)導(dǎo)入

相對(duì)導(dǎo)入:

glance/├──__init__.py from . import api #.表示當(dāng)前目錄

from . importcmdfrom . importdb

├── api

│ ├──__init__.py from . importpolicyfrom . importversions

│ ├── policy.py

│ └── versions.py

├── cmdfrom . importmanage

│ ├──__init__.py

│ └── manage.pyfrom ..api importpolicy#..表示上一級(jí)目錄,想再manage中使用policy中的方法就需要回到上一級(jí)glance目錄往下找api包,從api導(dǎo)入policy

└── dbfrom . importmodels

├──__init__.py

└── models.py

相對(duì)導(dǎo)入

相對(duì)導(dǎo)入

單獨(dú)導(dǎo)入包

單獨(dú)導(dǎo)入包名稱時(shí)不會(huì)導(dǎo)入包中所有包含的所有子模塊,如:

#在與glance同級(jí)的test.py中

importglance

glance.cmd.manage.main()'''執(zhí)行結(jié)果:

AttributeError: module 'glance' has no attribute 'cmd''''

解決方法:

#glance/__init__.py

from . importcmd#glance/cmd/__init__.py

from . import manage

執(zhí)行:

#在于glance同級(jí)的test.py中

importglance

glance.cmd.manage.main()

import?glance?之后直接調(diào)用模塊中的方法

glance/├──__init__.py from .api import *

from .cmd import *

from .db import *├── api

│ ├──__init__.py __all__ = ['policy','versions']

│ ├── policy.py

│ └── versions.py

├── cmd__all__ = ['manage']

│ ├──__init__.py

│ └── manage.py

└── db__all__ = ['models']

├──__init__.py

└── models.pyimportglance

policy.get()import glance

View Code

軟件開(kāi)發(fā)規(guī)范

總結(jié)

以上是生活随笔為你收集整理的python好用的模块和包_Python模块和包详细讲解与实例分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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