1. 程式人生 > 其它 >模組和軟體目錄規範

模組和軟體目錄規範

今日內容概要

  • 迴圈匯入問題

  • 判斷檔案型別

  • 模組的查詢順序

  • 絕對匯入與相對匯入

  • 模組與包(簡單)

  • 程式設計思想的演變

  • 軟體開發目錄規範

  • 常用內建模組(需要滾瓜爛熟)

     

今日內容詳細

強調

以後在工作中專案的檔名肯定都是以英文為主

一、迴圈匯入問題

# 兩個檔案彼此匯入彼此
  迴圈匯入的時候極有可能出現某個名字還沒有被建立就使用的情況導致報錯的現象
   """所以在以後的程式設計生涯中 儘量去避免出現迴圈匯入的問題"""
   如果確實需要迴圈匯入 那麼需要確保雙方使用的名字都必須'提前定義好'
  (一錯再錯的辦法)  迴圈匯入的缺陷:它會讓一些程式碼重複執行
   方法1:將匯入模組的句式寫在定義名字的下面即可
   方法2:將匯入模組的句式寫在函式體程式碼內
   比如:
   name ='from a'
   def index():
       import b
       print(b.name)
   index()

 

 

 

 

二、判斷檔案型別

# py檔案可以被分為兩種型別
1.執行檔案
2.被匯入模組檔案

我們在呼叫該程式碼時我們只需要該程式碼的核心功能部分 針對測試部分或其他的程式碼我們不需要
解決辦法:利用__name__

有一個內建變數__name__  
   當__name__所在的檔案是執行檔案的時候 結果是__main__  如:print(__name__)  # __main__
   當__name__所在的檔案是被匯入模組檔案時候 結果是檔名(模組名)  如:print(__name__)  # md
   
   __name__的作用用法:將程式碼核心功能與測試部分割槽分開
   def index():
   print('from index')
def func():
   print('from func')
if __name__ == '__main__':
   # 作為模組開發者 也需要先測試程式碼能否正常執行
   index()  # 測試程式碼 可能會很多
   func()   # 測試程式碼 可能會很多 我們在呼叫該程式碼時我們只需要該程式碼的核心功能部分 針對測試部分或其他的程式碼我們不需要
   
   可以藉助於__name__區分開被匯入的程式碼和測試程式碼
   if __name__ =='__main__'
   當前檔案是執行檔案的時候才會執行的子程式碼塊 否則只會出現模組名,函式子程式碼不會執行
   """"""
   由於上述程式碼在很多啟動指令碼中經常使用 所以有簡寫方式
   直接輸入main之後按tap鍵即可

 

 

 

 

三、模組的查詢順序

"""
1.先從記憶體空間中查詢
2.再去內建模組中查詢
3.最後去sys.path查詢(類似於我們前面學習的環境變數)
如果上述三個地方都找不到 那麼計算機會直接報錯
"""
# 先在記憶體中找
# import md1
# import time
# time.sleep(20) # 睡眠期間將md1檔案刪除
# print(md1.name)
# 2.驗證再從內建模組中查詢
# import time   # F:\Python36\python.exe "F:/pythonday 17/03.模組的查詢順序.py" 查詢的是模組中的time,而不是py檔案中的time.py
# print(time.time()) # 1648197429.7457595
# 強調:在建立py檔案時候一定不要跟模組名(內建、第三方)衝突!!!!
# 3.驗證sys.path中查詢 類似於我們前面學習的環境變數
import sys
print(sys.path)  # 結果是一個列表
#這個路徑有什麼用? 就是在記憶體中和內建模組中找不到就去這些路徑中一個一個去查詢 比如:import md 先去記憶體中去找 然後再去內建中去找 最後再去路徑中一個一個找 直到找到後在載入給記憶體執行
# ['F:\\pythonday 17', 'F:\\pythonday 17', 'F:\\PyCharm 2020.3.3\\plugins\\python\\helpers\\pycharm_display', 'F:\\Python36\\python36.zip', 'F:\\Python36\\DLLs', 'F:\\Python36\\lib', 'F:\\Python36', 'F:\\Python36\\lib\\site-packages', 'F:\\PyCharm 2020.3.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
 # 例題:比如在idea檔案內在加一個mddddd.py檔案
 import mdddd  # 找不到 首先在記憶體中找不到 在內建中也找不到 然後找第一個路徑只有到idea 無法在繼續找到idea下的檔案 所以需要注意看檔案路徑的第一個路徑為準 也就是執行檔案所在的路徑
 # 查詢模組時候只需要站在執行檔案所在得路徑檢視即可 路徑上有就可以 沒有就不行

 # 那麼如何解決這個問題呢?
 #方式一:主動新增sys.path路徑(類似於新增環境變數)
 # 由於sys.path是一個列表 所以我們可以:
 import sys
 sys.path.append(r'F:\\pythonday 17/idea') # idea的所在路徑
 import mdddd
 print(mdddd.name)   # 都是一群傻鳥 這樣就能執行mdddd的執行程式碼
 # 比如在舉個例子:
 # 我們在idea下的mdddd.py檔案內輸入 import md 問是否能找得到? # 答案:顯然是找不到的 原因 :因為通過print(sys.path)我們發現mdddd是執行檔案 它最多看到的路徑就是他的上一級idea的路徑 而idea與md是同一級檔案 所以他只能找到idea 找不到md
 # 但是在pycharm中 pycharm會自動將專案目錄所在的路徑新增到sys.path中 如果不借助pycharm軟體就找不到
 
 # 方式二:利用from....import.....句式指名道姓的查詢
 from idea import mdddd  # 從資料夾idea中匯入mdddd模組
 print(mdddd.name)
 
 例題1:
 from.aaa.bbb.ccc import mm # 通過點的方式進入下一層目錄
 print(mm.name)
"""如果不在pycharm中執行 如何相容?"""方法後面目錄規範再學

 

 

 

 

四、絕對匯入與相對匯入

1.在匯入模組的時候一切查詢模組的句式都是以執行檔案為準
  無論匯入的句式是在執行檔案中還是在被匯入檔案中!!!!
# 絕對匯入
    永遠按照執行檔案所在的路徑一層層往下查詢(無腦查詢即可)   from bbb.ddd.eee import a  基於當前執行檔案
# 相對匯入
    相當於匯入打破了必須參照執行檔案的所在路徑的要求 只需要考慮當前模組所在的路徑然後使用特殊符號.去查詢其他模組即可""""""  from .import a 基於當前匯入模組檔案  
   相對匯入只能在被匯入模組檔案中使用 不能在執行檔案中使用  侷限性較大
   """
  預備知識
  .表示當前路徑
  ..表示上一層路徑
  ../..表示上上一層路徑"""
   """"""
   "以後如果想一勞永逸" 那麼就只使用絕對匯入即可

五、包

# 從專業的角度來解釋的話
   包就是內部含有__init__.py的資料夾
# 從實際的角度來解釋的話
   包就是多個模組的結合體(內部存放了多個模組檔案)
   eg:我們的電腦某個資料夾下面有很多不同型別的檔案
       視訊檔案、音訊檔案、文字檔案、圖片檔案
       為了方便管理我們會習慣性的建立不同的資料夾分類管理
       學習視訊
      J老師視訊合集
         R老師視訊合集
         C老師視訊合集
       學習筆記
      D老師經典語錄
         A老師經典語錄
      ...
# 在pycharm中甚至直接提供了建立包的選項
   本質就是資料夾裡面有一個__init__.py檔案
   """"""
   在匯入包的時候 索要名字其實是跟包裡面的__init__.py要
   1.如果想直接通過包的名字使用包裡面所有的模組那麼需要在__init__.py中提前匯入
   上述方法的好處在於__init__可以提前幫你準備好可以使用的名字
   
   2.也可以直接忽略__init__的存在使用絕對匯入即可
      上述方式的好處在於不需要考慮包的存在 直接當成普通資料夾即可
       
 # 包裡面的__init__可以看成是你的管家
你可以吩咐它幫你做事 也可以直接架空它自己動手
   

六、程式設計思想演變

1.小白階段
   此階段寫程式碼就是在一個檔案內不停的堆疊程式碼的行數(麵條版本)
   
2.函式階段
   此階段寫程式碼我們學會了將一些特定功能的程式碼封裝到函式中供後續反覆呼叫
   
3.模組階段
    此階段不單單是將功能程式碼封裝成函式 並且將相似的程式碼功能拆分到不同的py檔案中便於後續的管理
  """"""
"為什麼要如此演變???"
我們將這個過程形象成使用電腦的過程
   小白階段相當於在c盤下直接存取各種型別的檔案
   
   函式階段相當於在c盤下建立資料夾管理檔案
   模組階段相當於考慮效能在不同的盤下存檔不同的資料
   
   答案:更加方便、快捷、高效的管理資源

七、軟體開發目錄規範

# 我們實際工作中編寫的程式軟體都是有很多資料夾和檔案組成
  這些資料夾和檔案其實都是有各自存在的意義和主要功能
   
   1.bin資料夾
        存放程式的啟動檔案   start.py
   2.conf資料夾
        存放程式的配置檔案    settings.py
   3.core資料夾
        存放程式的核心業務    src.py
        就是最為重要的程式碼  能夠實現具體需求
   4.lib資料夾
        存放程式公共的功能  common.py
   5.db資料夾
        存放程式的資料     userinfo.txt
   6.log資料夾
        存放程式的日誌記錄  log.log
   7.readme文字檔案
        存放程式的說明、廣告等額外的資訊
   8。requirements.txt文字檔案
        存放程式需要使用的第三方模組及對應的版本
       
  """目錄的名字可以不一樣 但是主要的思想是一致的  
  就是為了便於管理 解耦合
  拿到啟動檔案之後直接執行即可 無需考慮程式內部的複雜程度 便於管理
  當代碼越來越多的時候 你才能體會到拆分的好處"""