模塊語法

1、 模塊

    模塊就是一個包含python定義和聲明的文件,文件名就是模塊的名字加上.py後綴。換句話說,全部的py文件均可以當作是一個模塊。python

    模塊名有兩個:py文件名, __main__dom

1. 模塊的四個通用類別

  • 使用python編寫的py文件
  • 已被編譯爲共享庫或者DLL或C或者C++的擴展
  • 包好一組模塊的包
  • 使用c編寫並鏈接到python解釋器的內置模塊

2. 使用模塊的好處

  • 能夠把代碼進行分類
  • 能夠實現代碼的重用

3. 導入模塊時執行的三個動做

  • 先在sys.modules中查看當前導入的模塊是否已經被導入。若是已導入,則不會再重複導入,也就不會執行下面兩個操做
  • 開闢一片內存空間,在該空間中執行模塊中的代碼
  • 建立模塊的名字。並使用該名稱做爲該模塊在當前模塊中引用的名字

使用globals()查看模塊的名稱空間測試

import random


print(globals())


結果:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000275FF8DC2B0>, 

'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python_我的/day 024 模塊的語法/臨時/臨時.py',

'__cached__': None, 'random': <module 'random' from 'C:\\Python36\\lib\\random.py'>}

 

4. 導入模塊的順序

  • 先引入內置模塊
  • 再引入第三方模塊
  • 最後引入本身定義的模塊

2、導入模塊的兩種方式

1. import xxx

  • 應用場景:當不肯定要使用模塊中哪些功能時。
  • 設置別名:import xxx as xxx

模塊在導入的時候會建立其本身的名稱空間。因此,在使用模塊中的變量的時候通常是不會產生衝突的ui

test模塊:

main_person_one = "Jhon"


def foo():
    print(main_person_one)

 

 

# 調用方
import test

main_person_one = "Tom"

test.foo()  # Jhon
print(main_person_one)  # Tom

在模塊中使用globalspa

  • global表示把全局的內容引入到局部,但這個全局指的是py文件。換句話說,global指向的是模塊內部,並不會改變外部模塊的內容
# 模塊test中

main_person_one = "Jhon"


def foo():
    global main_person_one
    main_person_one = "Tom"
    print(main_person_one)

 

 

# 調用方
import test

main_person_one = "Linda"

test.foo()  # Tom

print(test.main_person_one)  # Tom
print(main_person_one)  # Linda

2. from xxx import xxx

    使用from xxx import xxx 時,與import方式同樣,python也會給模塊建立名稱空間。但不一樣的是,import會把整個模塊內容引入過來,而from方式則是部分引入。當一個模塊中的內容過多時,能夠採用此方式選擇性的導入要使用的內容code

  • 應用場景:當肯定要使用模塊中哪些功能時
  • 設置別名:from xxx import xxx as xxx
  • from xxx import *:導入全部內容

當從一個模塊中引入一個變量時,若是當前文件中出現了重名的變量時,會覆蓋掉模塊引入的那個變量blog

# test模塊:

main_person_one = "Jhon"


def foo():
    print(main_person_one)

 

 

# 調用方
from test import main_person_one, foo

main_person_one = "Tom"

foo()  # Jhon
print(main_person_one)  # Tom

3、修改模塊變量的方式(慎用)

  • 方式:模塊名.變量名 =  值 , 只能經過import方式修改
  • 後果:當某一調用方對模塊變量進行修改後,全部調用方拿到的這個變量的值都發生變化,由於模塊只會導入一次,共享名稱空間。
# test模塊:

main_person_one = "Jhon"


def foo():
    print(main_person_one)

 

# 調用方
import test

test.main_person_one = "Tom"

print(test.main_person_one)  # Tom

4、 __name__

    每一個模塊在完成代碼編寫後,都需對其功能進行測試,此時須要對其編寫測試代碼。但被調用方導入時不需執行測試代碼。此時能夠利用__name__過濾掉測試代碼的執行內存

    在python中,每一個模塊都有本身的__name__,但__name__的值是不定的。當把一個模塊做爲程序的入口時,此時該模塊的__name__是"__main__",而若是把模塊導入時,此時模塊內部的__name__就是該模塊自身的名字io

運行test模塊時:編譯

# test模塊:

def foo():
    print('----test----')


print(__name__)  # __main__

if __name__ == '__main__':
    foo()  # ----test----

運行調用方時:

# 調用方
import test

結果:
test # 即 test模塊中,__name__ = test

5、__all__

    在模塊中設置__all__, 能夠限制模塊可容許的導入內容,只對from xxx import * 有效

# test模塊
__all__ = ["x", "y"]
x = 2
y = 3
z = 5


def test():
    print("-----test-----")

 

# 調用方
from test import *

print(x)  # 2
print(z)  # NameError: name 'z' is not defined
相關文章
相關標籤/搜索