python from import什么意思_Python 引用From import介绍
一. 模塊的定義與分類
模塊是什么?
? 這幾天,我們進入模塊的學習。在學習模塊之前,我們首先要知道,什么是模塊?
? 一個函數(shù)封裝一個功能,你使用的軟件可能就是由n多個函數(shù)組成的(先不考慮面向?qū)ο?。比如抖音這個軟件,不可能將所有程序都寫入一個文件,所以咱們應該將文件劃分,這樣其組織結(jié)構(gòu)要好并且代碼不冗余。假如分了10個文件,每個文件里面可能都有相同的功能(函數(shù)),怎么辦?所以將這些相同的功能封裝到一個文件中,那么這個存儲著很多常用的功能的py文件,就是模塊。 模塊就是文件,存放一堆常用的函數(shù),比如:我要在大草原上策馬奔騰,應該怎么樣?我應該騎馬,你也要去浪,你是不是也要騎馬。我們說一個函數(shù)就是一個功能,那么把一些常用的函數(shù)放在一個py文件中,這個文件就稱之為模塊,模塊,就是一些列常用功能的集合體。
為什么要使用模塊?
從文件級別組織程序,更方便管理, 隨著程序的發(fā)展,功能越來越多,為了方便管理,我們通常將程序分成一個個的文件,這樣做程序的結(jié)構(gòu)更清晰,這時我們不僅僅可以把這些文件當做腳本去執(zhí)行,還可以把他們當做模塊來導入到其他的模塊中,實現(xiàn)了功能的重復利用
拿來主義,提升開發(fā)效率 同樣的原理,我們也可以下載別人寫好的模塊然后導入到自己的項目中使用,這種拿來主義,可以極大地提升我們的開發(fā)效率,避免重復造輪子.
人們常說的腳本是什么?
如果你在終端上編寫的代碼運行完后,退出python解釋器然后重新進入,那么你之前定義的函數(shù)或者變量都將丟失,因此我們通常將程序?qū)懙轿募幸员阌谰帽4嫦聛?#xff0c;需要時就通過python test.py方式去執(zhí)行,此時test.py被稱為腳本script。
所以,腳本就是一個python文件,比如你之前寫的購物車,模擬博客園登錄系統(tǒng)的文件等等。
模塊的分類
Python語言中,模塊分為三類。
? 第一類:內(nèi)置模塊,也叫做標準庫。此類模塊就是python解釋器給你提供的,比如我們之前見過的time模塊,os模塊。標準庫的模塊非常多(200多個,每個模塊又有很多功能),我們這幾天就講常用的十幾種,后面課程中還會陸續(xù)的講到。
? 第二類:第三方模塊,第三方庫。一些python大神寫的非常好用的模塊,必須通過pip install 指令安裝的模塊,比如BeautfulSoup, Django,等等。大概有6000多個。
? 第三類:自定義模塊。我們自己在項目中定義的一些模塊。
這幾天,我們先學第一類和第三類模塊,第二類模塊會在我們并發(fā)編程開始逐漸的接觸學習。
今天,我們先講第三類,自定義模塊。
我們先定義一個模塊,定義一個模塊其實很簡單就是寫一個文件,里面寫一些代碼(變量,函數(shù))即可。此文件的名字為meet.py,文件內(nèi)容如下:
print('from the meet.py')
name = '元寶'
def read1():
print('meet模塊:',name)
def read2():
print('meet模塊')
read1()
def change():
global name
name = "寶浪"
二. import
1.1 import 使用
import 翻譯過來是一個導入的意思。
這里一定要給同學強調(diào)哪個文件執(zhí)行文件,和哪個文件是被執(zhí)行模塊。
? 模塊可以包含可執(zhí)行的語句和函數(shù)的定義,這些語句的目的是初始化模塊,它們只在模塊名第一次遇到導入import語句時才執(zhí)行(import語句是可以在程序中的任意位置使用的,且針對同一個模塊import很多次,為了防止你重復導入,python的優(yōu)化手段是:第一次導入后就將模塊名加載到內(nèi)存了,后續(xù)的import語句僅是對已經(jīng)加載到內(nèi)存中的模塊對象增加了一次引用,不會重新執(zhí)行模塊內(nèi)的語句),如下 import meet 只在第一次導入時才執(zhí)行meet.py內(nèi)代碼,此處的顯式效果是只打印一次'from the meet.py',當然其他的頂級代碼也都被執(zhí)行了,只不過沒有顯示效果.
import meet
import meet
import meet
import meet
import meet
執(zhí)行結(jié)果:只是打印一次:
from the meet.py
重復導入會直接引用內(nèi)存中已經(jīng)加載好的結(jié)果
1.2 第一次導入模塊執(zhí)行三件事
? 1.創(chuàng)建一個以模塊名命名的名稱空間。
? 2.執(zhí)行這個名稱空間(即導入的模塊)里面的代碼。
? 3.通過此模塊名. 的方式引用該模塊里面的內(nèi)容(變量,函數(shù)名,類名等)。 這個名字和變量名沒什么區(qū)別,都是‘第一類的’,且使用meet名字的方式可以訪問meet.py文件中定義的名字,meet.名字與test.py中的名字來自兩個完全不同的地方。
1.3 被導入模塊有獨立的名稱空間
? 每個模塊都是一個獨立的名稱空間,定義在這個模塊中的函數(shù),把這個模塊的名稱空間當做全局名稱空間,這樣我們在編寫自己的模塊時,就不用擔心我們定義在自己模塊中全局變量會在被導入時,與使用者的全局變量沖突。
示例:
當前是test.py
import meet
name = 'alex'
print(name)
print(meet.name)
'''
運行結(jié)果:
from the meet.py
alex
元寶
'''
def read1():
print(666)
meet.read1()
'''
運行結(jié)果:
from the meet.py
meet模塊: 元寶
'''
name = '日天'
meet.change()
print(name)
print(meet.name)
'''
運行結(jié)果:
from the meet.py
日天
寶浪
'''
讓同學們將上面的代碼練習一下。
1.4 為模塊起別名
別名其實就是一個外號,我們小的時候,都喜歡給學生們起外號對吧。
1. 好處可以將很長的模塊名改成很短,方便使用.
import tbjx as t
t.read1()
2. 有利于代碼的擴展和優(yōu)化。
#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
elif db_type == 'oracle':
import oracle as db
db.sqlparse()
1.5 導入多個模塊
? 我們以后再開發(fā)過程中,免不了會在一個文件中,導入多個模塊,推薦寫法是一個一個導入。
import os,sys,json # 這樣寫可以但是不推薦
推薦寫法
import os
import sys
import json
多行導入:易于閱讀 易于編輯 易于搜索 易于維護。
三. from ... import ...
1.1 from ... import ... 使用
from ... import ... 的使用示例。
from meet import name, read1
print(name)
read1()
'''
執(zhí)行結(jié)果:
from the meet.py
金星
meet模塊: 元寶
'''
1.2 from...import... 與import對比
? 唯一的區(qū)別就是:使用from...import...則是將spam中的名字直接導入到當前的名稱空間中,所以在當前名稱空間中,直接使用名字就可以了、無需加前綴:tbjx.
from...import...的方式有好處也有壞處
? 好處:使用起來方便了
? 壞處:容易與當前執(zhí)行文件中的名字沖突
示例演示:
執(zhí)行文件有與模塊同名的變量或者函數(shù)名,會有覆蓋效果。
name = 'oldboy'
from meet import name, read1, read2
print(name)
'''
執(zhí)行結(jié)果:
郭寶元
'''
----------------------------------------
from meet import name, read1, read2
name = 'boy'
print(name)
'''
執(zhí)行結(jié)果:
boy
'''
----------------------------------------
def read1():
print(666)
from meet import name, read1, read2
read1()
'''
執(zhí)行結(jié)果:
meet模塊:元寶
'''
----------------------------------------
from meet import name, read1, read2
def read1():
print(666)
read1()
'''
執(zhí)行結(jié)果:
meet模塊: 666
'''
2. 當前位置直接使用read1和read2就好了,執(zhí)行時,仍然以meet.py文件全局名稱空間
#測試一:導入的函數(shù)read1,執(zhí)行時仍然回到meet.py中尋找全局變量 'alex'
#test.py
from meet import read1
name = 'alex'
read1()
'''
執(zhí)行結(jié)果:
from the meet.py
meet->read1->name = '元寶'
'''
#測試二:導入的函數(shù)read2,執(zhí)行時需要調(diào)用read1(),仍然回到meet.py中找
#read1()
#test.py
from meet import read2
def read1():
print('==========')
read2()
'''
執(zhí)行結(jié)果:
from the meet.py
meet模塊
meet模塊: 元寶
'''
1.3 from … import也支持as
通過這種方式引用模塊也可以對模塊進行改名。
from meet import read1 as read
read()
1.4 一行導入多個
from tbjx import read1,read2,name
1.5 from ... import *
? from meet import * 把meet中所有的不是以下劃線(_)開頭的名字都導入到當前位置
? 大部分情況下我們的python程序不應該使用這種導入方式,因為*你不知道你導入什么名字,很有可能會覆蓋掉你之前已經(jīng)定義的名字。而且可讀性極其的差,在交互式環(huán)境中導入時沒有問題。
可以使用all來控制*(用來發(fā)布新版本),在meet.py中新增一行
__all__=['name','read1'] #這樣在另外一個文件中用from spam import *就這能導入列表中規(guī)定的兩個名字
1.6 模塊循環(huán)導入問題
? 模塊循環(huán)/嵌套導入拋出異常的根本原因是由于在python中模塊被導入一次之后,就不會重新導入,只會在第一次導入時執(zhí)行模塊內(nèi)代碼
? 在我們的項目中應該盡量避免出現(xiàn)循環(huán)/嵌套導入,如果出現(xiàn)多個模塊都需要共享的數(shù)據(jù),可以將共享的數(shù)據(jù)集中存放到某一個地方在程序出現(xiàn)了循環(huán)/嵌套導入后的異常分析、解決方法如下(了解,以后盡量避免)
示范文件內(nèi)容如下
#創(chuàng)建一個m1.py
print('正在導入m1')
from m2 import y
x='m1
#創(chuàng)建一個m2.py
print('正在導入m2')
from m1 import x
y='m2'
#創(chuàng)建一個run.py
import m1
#測試一
執(zhí)行run.py會拋出異常
正在導入m1
正在導入m2
Traceback (most recent call last):
File "/python項目/run.py", line 1, in
import m1
File "/python項目/m1.py", line 2, in
from m2 import y
File "/python項目/m2.py", line 2, in
from m1 import x
ImportError: cannot import name 'x'
#測試一結(jié)果分析
先執(zhí)行run.py--->執(zhí)行import m1,開始導入m1并運行其內(nèi)部代碼--->打印內(nèi)容"正在導入m1"
--->執(zhí)行from m2 import y 開始導入m2并運行其內(nèi)部代碼--->打印內(nèi)容“正在導入m2”--->執(zhí)行from m1 import x,由于m1已經(jīng)被導入過了,所以不會重新導入,所以直接去m1中拿x,然而x此時并沒有存在于m1中,所以報錯
#測試二:執(zhí)行文件不等于導入文件,比如執(zhí)行m1.py不等于導入了m1
正在導入m1
正在導入m2
Traceback (most recent call last):
正在導入m1
File "/python項目/m1.py", line 2, in
from m2 import y
File "/python項目/m2.py", line 2, in
from m1 import x
File "/python項目/m1.py", line 2, in
from m2 import y
ImportError: cannot import name 'y'
#測試二分析
執(zhí)行m1.py,打印“正在導入m1”,執(zhí)行from m2 import y ,導入m2進而執(zhí)行m2.py內(nèi)部代碼--->打印"正在導入m2",執(zhí)行from m1 import x,此時m1是第一次被導入,執(zhí)行m1.py并不等于導入了m1,于是開始導入m1并執(zhí)行其內(nèi)部代碼--->打印"正在導入m1",執(zhí)行from m1 import y,由于m1已經(jīng)被導入過了,所以無需繼續(xù)導入而直接問m2要y,然而y此時并沒有存在于m2中所以報錯
# 解決方法:
方法一:導入語句放到最后
#m1.py
print('正在導入m1')
x='m1'
from m2 import y
#m2.py
print('正在導入m2')
y='m2'
from m1 import x
方法二:導入語句放到函數(shù)中
#m1.py
print('正在導入m1')
def f1():
from m2 import y
print(x,y)
x = 'm1'
# f1()
#m2.py
print('正在導入m2')
def f2():
from m1 import x
print(x,y)
y = 'm2'
#run.py
import m1
m1.f1()
一. py文件的兩種功能
編寫好的一個python文件可以有兩種用途: 一:腳本,一個文件就是整個程序,用來被執(zhí)行(比如你之前寫的模擬博客園登錄那個作業(yè)等) 二:模塊,文件中存放著一堆功能,用來被導入使用 python為我們內(nèi)置了全局變量__name__, 當文件被當做腳本執(zhí)行時:name 等于'main' 當文件被當做模塊導入時:__name__等于模塊名 作用:用來控制.py文件在不同的應用場景下執(zhí)行不同的邏輯(或者是在模塊文件中測試代碼)
if __name__ == '__main__':
print('from the meet.py')
__all__ = ['name', 'read1',]
name = '元寶'
def read1():
print('meet模塊:',name)
def read2():
print('meet模塊')
read1()
def change():
global name
name = '寶浪'
if __name__ == '__main__':
# 在模塊文件中測試read1()函數(shù)
# 此模塊被導入時 __name__ == meet 所以不執(zhí)行
read1()
二. 模塊的搜索路徑
當你引用一個模塊時,不見得每次都可以import到:
當咱們導入同一個目錄下的模塊的時候就能夠使用import成功,不是同一個目錄下的導入就會報錯
上面的示例可以得知,引用模塊也是按照一定規(guī)則進行引用的。
? Python中引用模塊是按照一定的規(guī)則以及順序去尋找的,這個查詢順序為:先從內(nèi)存中已經(jīng)加載的模塊進行尋找找不到再從內(nèi)置模塊中尋找,內(nèi)置模塊如果也沒有,最后去sys.path中路徑包含的模塊中尋找。它只會按照這個順序從這些指定的地方去尋找,如果最終都沒有找到,那么就會報錯。
? 內(nèi)存中已經(jīng)加載的模塊->內(nèi)置模塊->sys.path路徑中包含的模塊
模塊的查找順序
在第一次導入某個模塊時(比如meet),會先檢查該模塊是否已經(jīng)被加載到內(nèi)存中(當前執(zhí)行文件的名稱空間對應的內(nèi)存),如果有則直接引用(ps:python解釋器在啟動時會自動加載一些模塊到內(nèi)存中,可以使用sys.modules查看)
如果沒有,解釋器則會查找同名的內(nèi)置模塊
如果還沒有找到就從sys.path給出的目錄列表中依次尋找meet.py文件。
需要特別注意的是:我們自定義的模塊名不應該與系統(tǒng)內(nèi)置模塊重名。雖然每次都說,但是仍然會有人不停的犯錯
#在初始化后,python程序可以修改sys.path,路徑放到前面的優(yōu)先于標準庫被加載。
> > > import sys
> > > sys.path.append('/a/b/c/d')
> > > sys.path.insert(0,'/x/y/z') #排在前的目錄,優(yōu)先被搜索
> > > 注意:搜索時按照sys.path中從左到右的順序查找,位于前的優(yōu)先被查找,sys.path中還可能包含.zip歸檔文件和.egg文件,python會把.zip歸檔文件當成一個目錄去處理,
#首先制作歸檔文件:zip module.zip foo.py bar.py
import sys
sys.path.append('module.zip')
import foo,bar
#也可以使用zip中目錄結(jié)構(gòu)的具體位置
sys.path.append('module.zip/lib/python')
#windows下的路徑不加r開頭,會語法錯誤
sys.path.insert(0,r'C:\Users\Administrator\PycharmProjects\a')
#至于.egg文件是由setuptools創(chuàng)建的包,這是按照第三方python庫和擴展時使用的一種常見格式,.egg文件實際上只是添加了額外元數(shù)據(jù)(如版本號,依賴項等)的.zip文件。
#需要強調(diào)的一點是:只能從.zip文件中導入.py,.pyc等文件。使用C編寫的共享庫和擴展塊無法直接從.zip文件中加載(此時setuptools等打包系統(tǒng)有時能提供一種規(guī)避方法),且從.zip中加載文件不會創(chuàng)建.pyc或者.pyo文件,因此一定要事先創(chuàng)建他們,來避免加載模塊是性能下降。
明天我們就開始講解Python常用的內(nèi)置模塊,由于Python常用的模塊非常多,我們不可能將所有的模塊都講完, 所以只針對于工作中經(jīng)常用到模塊進行講解。剩下的模塊可以在課余時間自學。
總結(jié)
以上是生活随笔為你收集整理的python from import什么意思_Python 引用From import介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java swt 下拉列表_求助:SWT
- 下一篇: python合并数组输出重复项_pyth