day 20 02 模塊的導入 運行結果: 9. 兩種不同導入的優缺點: (1)import demo demo:裡面的名字都會導入 會占很多記憶體 裡面的命名空間和不是模塊裡面的命名空間是分開的,所以外面如果有和demo裡面相同的變數名,也是不會相互影響 (2)from demo import 變數 ...
day 20 02 模塊的導入
1.
模塊:就是一個文件:放置一些通用的有獨立功能程式或者函數.
比如建立一個py文件,文件名為:demo,文件裡面的內容:
demo模塊:
print('嗨大米')
def tx():
print('123')#函數沒有進行調用
2.
怎麼導入demo的:首先import+文件名(文件名要符合命名規則)
1.import demo#此時就可以導入並且運行出demo的結果
2.demo.tx()#調用demo文件裡面的函數tx,此時寫好的函數就可以調用了
(每次要使用模塊裡面的參數函數名字,都得通過demo.名字才可以使用)
3.
每次import一個模塊所做的事情:
找到模塊(文件:有它自己的路徑)
創建這個模塊的命名空間
把文件中的名字都放到命名空間裡面
4.
假設demo裡面有一個參數money=100而在導入的模塊外面也有一個參數money=200
導入模塊後面的代碼:
import demo#此時就可以導入並且運行出demo的結果 money=200 demo.tx()#調用demo文件裡面的函數tx print(demo.money)
#當調用demo裡面的函數tx的時候,裡面的money是等於100的,因為在demo模塊裡面有自己的命名空間, 自己裡面有就使用自己文件裡面的,與外面的money=200不相關
demo模塊裡面的代碼:
print('嗨大米') money = 100 def tx(): print('123',money)
運行結果:
嗨大米 123 100 100
5.
為什麼一個模塊不會被重覆導入:
import sys
print(sys.modules.keys())
print(sys.path)
先從sys.modules裡面查看是否已經被導入(正是因為這樣查看是否被導入,被導入後,後面的都不會去看了,所以才不會被重覆導入)
#如果沒有被導入,就依據sys.path路徑去尋找模塊
#找到了就導入
#創建這個模塊的命名空間
#執行文件,把文件中的名字都放到命名空間裡面
6.
給一個模塊起別名:即重命名
import time as t print(t.time())
為什麼要起別名:寫一個代碼可以在兩個地方都可以用,即代碼具有相容性
兩個資料庫:Oracle和mysql,對這兩個資料庫的使用的操作一般都是:
連接資料庫:
登入資料庫
增刪改查
關閉資料庫
oracle.connect mysql.connect
同樣方式只是導入的模塊名字不一樣而已,此時給兩個資料庫起同一個別名就方便簡單的多:
if 資料庫=='oracle':
import oracle as db
elif 資料庫=='mysql':
import mysql as db
import time as t
time.time #報錯:重命名為t了,原來的time就不能用了
7. 寫程式的時候,應該先一次性把使用的模塊都在文件開頭依次導入:
內置模塊
擴展模塊:別人寫好的,需要安裝的
自定義的模塊:自己寫的
最好不要寫一點程式就導入一個模塊
import time,sys,os 一行可以導入多個模塊
8.
單獨從某個模塊當中導入一個方法或者是變數,就用:from 模塊 import 方法/變數
from time import sleep #從time模塊當中導入sleep方法 sleep(1) #直接調用sleep方法
from demo import tx tx() #此時的執行結果中的money還會使用demo模塊裡面函數tx外面的money=100,但是我只是調用了函數而已,為什麼會這樣呢: 因為在導入模塊的時候,都會一次將模塊裡面的代碼看過並且將參數保存起來,當使用到的時候會直接拿來用
9.
兩種不同導入的優缺點:
(1)import demo demo:裡面的名字都會導入 會占很多記憶體 裡面的命名空間和不是模塊裡面的命名空間是分開的,所以外面如果有和demo裡面相同的變數名,也是不會相互影響
(2)from demo import 變數名:不占記憶體 但是只是導入單一的變數或者方法,不方便後面使用,這裡的變數名如果在模塊外面存在一樣的變數名的話,就會依據外面的變數名為準,demo裡面的將不會存在
from demo import money,tx print(money) tx() money=200 tx()#調用tx還是會繼續使用demo裡面的money,而不會使用200
運行結果:
嗨大米 123 100 100 100 123 100
10.
_all_ = ['demo模塊裡面的變數名/方法']與import*
demo模塊:
_all_ = ['tx'] #這裡沒有money,下麵的demo.money就不能使用,即money沒有被導入,存在_all_裡面的才會被導入 print('嗨大米') money = 100 def tx(): print('123',money)
導入模塊後的代碼:
import sys print(sys.path) from demo import * #如果demo模塊裡面沒有_all_ = ['tx']的話,這裡就會導入全部的變數名,但是此時有,就受到了限制,沒有在列表裡面的變數名或者方法都不會被導入
tx() #tx已經被導入
print(demo.money) #報錯,money沒有被導入
11.
_name_與_main_
如果在demo模塊裡面 print(_name_),此時的列印結果,_name_=_main_
當我們使用其他模塊,而在其他模塊裡面引用demo模塊的時候,這個模塊中的_name_=demo
我們可以用 if _name_=_main_,來判斷是否執行模塊裡面的某個獨立功能的函數,這樣在導入模塊的時候就不會全部都執行
12.
複習總結: # 所有模塊導入儘量往上寫:且導入順序: 內置模塊 擴展模塊:需要安裝的都是擴展模塊 自定義模塊 # import 模塊名 #模塊名. 變數名 和本文件中的變數名完全不衝突 import 模塊名 as 重命名的模塊名:提高代碼的相容性 import 模塊1,模塊2 # from import from 模塊名 import 變數名 直接使用 變數名 就可以完成操作 如果本文件中有相同的變數名會發生衝突 from 模塊名 import 變數名 as 重命名變數名 from 模塊名 import 變數名1,變數名2.. from 模塊名 import * # 將模塊中的所有變數名都放到記憶體中 # 如果文件中有相同的變數名會發生衝突 # from 模塊名 import * 和_all_是一對 沒有這個變數,就會導入所有名字 有_all_就導入_all_列表裡面的名字而已 # 包:一大堆模塊的集合