import 導入語句
import 語句用于從模塊中導入子模塊隧魄,類,函數(shù)等。語法大致有三種:
第一種
import module as name, module as name, ...
第二種
import 之后可以置于一個元組
from module import identifier as name, identifier as name, ...
第三種
from module import *
1
2
3
4
5
6
7
8
9
模塊 module 可以是高層級到低層級用屬性表示法引用的模塊返咱,例如 pandas.core.series。
as 及其后的別名 name 是可選的牍鞠。
語句可以導入單個或多個對象咖摹,用逗號分隔實際是多個子句。
第一種導入方法难述,如果成功獲取到模塊萤晴,則可以通過以下方式之一在 import 語句所在命名空間中使用它:
如果被導入模塊是最高層級模塊,模塊名被綁定胁后;
如果導入的模塊不是最高層級的模塊店读,則該模塊的最高層級模塊名被綁定,該模塊必須使用完整限定名訪問攀芯;
如果有 as屯断,則 as 之后的別名被綁定,模塊名不綁定侣诺。
如果沒有指定模塊殖演,引發(fā) ModuleNotFoundError。
import pandas
pandas
1
2
<module 'pandas' from 'F:\anaconda\lib\site-packages\pandas\init.py'>
1
del pandas
import pandas.core.series
pandas, pandas.core, pandas.core.series
1
2
3
(<module 'pandas' from 'F:\anaconda\lib\site-packages\pandas\init.py'>,
<module 'pandas.core' from 'F:\anaconda\lib\site-packages\pandas\core\init.py'>,
<module 'pandas.core.series' from 'F:\anaconda\lib\site-packages\pandas\core\series.py'>)
1
2
3
series # 必須完成限定名訪問
1
NameError Traceback (most recent call last)
<ipython-input-6-2859777d6f2b> in <module>
----> 1 series
NameError: name 'series' is not defined
1
2
3
4
5
6
7
8
9
del pandas
import pandas.core.series as pds
pds
1
2
3
<module 'pandas.core.series' from 'F:\anaconda\lib\site-packages\pandas\core\series.py'>
1
pandas # 只能使用別名訪問
1
NameError Traceback (most recent call last)
<ipython-input-8-609b6d5922fb> in <module>
----> 1 pandas
NameError: name 'pandas' is not defined
1
2
3
4
5
6
7
8
9
def f():
import pandas # 局部命名空間導入
pandas # 全局命名空間不能訪問
1
2
3
NameError Traceback (most recent call last)
<ipython-input-10-0b76d1984901> in <module>
1 def f():
2 import pandas # 局部命名空間導入
----> 3 pandas
NameError: name 'pandas' is not defined
1
2
3
4
5
6
7
8
9
10
11
第二種導入方法年鸳,如果成功獲取到模塊趴久,from 之后的模塊名不會被綁定,對于 import 子句導入的屬性或子模塊搔确,如果有 as 子句彼棍,則只能使用其指定的別名使用它,否則使用該屬性或子模塊的名稱 identifier 使用它妥箕。
如果屬性或子模塊不存在滥酥,或不能導入,引發(fā) ImportError畦幢。
from pandas.core import base
base
1
2
<module 'pandas.core.base' from 'F:\anaconda\lib\site-packages\pandas\core\base.py'>
1
pandas.core # 只導入了該模塊下的子模塊 base
1
NameError Traceback (most recent call last)
<ipython-input-2-37462de79a89> in <module>
----> 1 pandas.core
NameError: name 'pandas' is not defined
1
2
3
4
5
6
7
8
9
導入多個可置于元組中
from random import (random as r1,
randint as r2,)
r1, r2
1
2
3
4
(<function Random.random()>,
<bound method Random.randint of <random.Random object at 0x000001E531A14580>>)
1
2
pandas 下沒有 base坎吻,導入錯誤
from pandas import base
1
2
ImportError Traceback (most recent call last)
<ipython-input-7-7903c4949085> in <module>
----> 1 from pandas import base
ImportError: cannot import name 'base' from 'pandas' (F:\anaconda\lib\site-packages\pandas_init_.py)
1
2
3
4
5
6
7
8
9
第三種導入方法,則在模塊中定義的全部公有名稱都將綁定到 import 語句所在的命名空間宇葱。
公有名稱是由在模塊的命名空間中檢測一個名為 all 的變量來確定的瘦真;如果 all 沒有被定義刊头,則公有名稱的集合將包含模塊的命名空間中找到的所有不以下劃線字符 _ 打頭的名稱。
from random import *
randint
1
2
<bound method Random.randint of <random.Random object at 0x0000025E1DCC8180>>
1
當指定要導入哪個模塊時诸尽,你不必指定模塊的絕對名稱原杂。當一個模塊或包被包含在另一個包之中時,可以在同一個最高層級包中進行相對導入您机,而不必提及包名稱穿肄。
通過在 from 之后指定的模塊或包中使用前綴點號,你可以在不指定確切名稱的情況下指明在當前包層級結構中要上溯多少級际看。一個前綴點號表示是執(zhí)行導入的模塊所在的當前包咸产,兩個點號表示上溯一個包層級。三個點號表示上溯兩級仲闽,依此類推脑溢。例如:
package/
init.py
subpackage1/
init.py
moduleX.py
moduleY.py
subpackage2/
init.py
moduleZ.py
moduleA.py
1
2
3
4
5
6
7
8
9
10
假設當前位置是 subpackage1/moduleX.py,則:
from .moduleY import spam
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
1
2
3
4
5
都是有效的赖欣。