1. 程式人生 > 其它 >今日學習內容總結1.8

今日學習內容總結1.8

今日學習內容總結

      在昨日的學習中,我們學習了生成器及其表示式。並且對模組以及模組的匯入進行一定的瞭解。而今天我們還是針對模組進行學習。在學習過程中,要記住我們的專案中的檔名肯定都是以英文為主。儘量不要使用中文,儘量做到見名知意。

迴圈匯入問題

      迴圈匯入就是兩個檔案彼此匯入彼此。而兩個模組直接相互匯入,且相互使用其名稱空間中的名字,但是有些名字沒有產生就使用,就出現了迴圈匯入問題。迴圈匯入的時候極有可能出現某個名字還沒有被建立就使用的情況導致報錯:

  # 模組teset
  import test1
  def a():
      test1.d()
  a()

  # 模組 test1
  import teset
  def d():
      teset.a()
  d()

  # 這個時候執行會報錯 module 'test1' has no attribute 'd'

      在以後的程式設計裡,要儘量去避免出現迴圈匯入的問題。但是如果確實需要迴圈匯入,那麼需要確保雙方使用的名字都必須提前定義好。解決方法1:將匯入模組的句式寫在定義名字的下面。解決方法2:將匯入模組的句式寫在函式體程式碼內。

判斷檔案型別

      py檔案可以被分為兩種型別:1.執行檔案。2.被匯入檔案。

      有一個內建變數__name__,當__name__所在的檔案是執行檔案的時候 結果是__main__。當__name__所在的檔案是被匯入檔案時候 結果是檔名。程式碼示例:

  # 執行檔案
  print(__name__)  # __main__

  # 被匯入檔案  test1
  print(__name__)  # test1
    

      name 是屬於 python 中的內建類屬性,就是它會天生就存在與一個 python 程式中,代表對應程式名稱。因此在被匯入檔案可以使用這個方法,設定判斷是執行檔案才執行的程式碼:

  # pycharm中快捷方式:main+tab鍵
  if __name__ == '__main__':

模組的查詢順序

      模組的查詢順序:從記憶體空間中查詢 > 從內建模組中查詢 > 去sys.path查詢(類似於我們前面學習的環境變數)。如果在這三個地方都沒找到,會直接報錯。

驗證先從記憶體空間找

  import test1
  import time
  time.sleep(15)  # 睡眠期間將md1檔案刪除
  print(test1.name)  # jason
  # 在操作過程中,我們首先執行這個檔案。然後刪除,在硬碟內就會從佔有態變成自由態。而在記憶體裡面還在,因為我們已經執行了這個檔案。所以最終還是能打印出結果。這也是先從記憶體空間查詢的證明。

驗證再從內建模組中查詢

  import time
  print(time)
  print(time.time())
  執行結果:
  <module 'time' (built-in)>
  1648215037.89744
  
  # 在建立py檔案時候一定不要跟模組名(內建、第三方)衝突。

驗證sys.path(類似於我們前面學習的環境變數)

  import sys
  print(sys.path)  # 下面的註釋內就是列印結果
 
'''
  ['C:\\Users\\Administrator\\Desktop\\Typora\\day15\\day15', 'C:\\Users\\Administrator\\Desktop\\Typora\\day15\\day15', 'D:\\PyCharm 2020\\plugins\\python\\helpers\\pycharm_display', 'D:\\Python36\\python36.zip', 'D:\\Python36\\DLLs', 'D:\\Python36\\lib', 'D:\\Python36', 'D:\\Python36\\lib\\site-packages', 'D:\\PyCharm 2020\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
'''
  # 我們發現結果是一個列表,裡面存放了很多路徑。其實sys.path中雖然有很多路徑,但是隻需要重點關注第一個。第一個其實就是執行檔案所在的路徑。因為當記憶體中和內建中都沒有要查詢的模組時,就會去下面的路徑中挨個查詢。這也是說為什麼類似於之前學習的環境變數。

      當使用上面三種方法都沒有找到你要找的模組,那麼這裡有兩種解決方法。

解決方法1:

  import sys
  #因為sys.path是一個列表所以我們可以使用append方法進行追加
  sys.path.append(r'D:\pythonproject\test\AAA')
  import a
  a.f1()
  # pycharm會自動將專案目錄所在的路徑新增到sys.path中

解決方法2:

  # 利用from...import...句式指名道姓的查詢
  from a import name  從資料夾a中匯入name模組
  from a.b import c 從a資料夾中的子檔案b中匯入模組c

絕對匯入與相對匯入

      在匯入模組的時候一切查詢模組的句式都是以執行檔案為準。無論匯入的句式是在執行檔案中還是在被匯入檔案中。

絕對匯入

      永遠按照執行檔案所在的路徑一層層往下查詢(無腦查詢即可)。在python的執行檔案或模組中,使用類似import 模組名、import 包名.模組名 、from 包名.模組名 import 內容等匯入語法時,就是在用絕對路徑匯入模組。

相對匯入

      相當匯入打破了必須參照執行檔案的所在路徑的要求 只需要考慮當前模組所在的路徑然後使用特殊符號.去查詢其他模組即可。使用相對匯入,就不需要考慮執行檔案到底是誰了,只需要知道模組與模組之間的相對位置。如:

  from . import test1  # 匯入當前目錄下的test1
  from .. import test1  # 匯入上一級目錄下的test1
  '''
      .表示當前路徑
      ..表示上一層路徑
      ../..表示上上一層路徑
  '''

      以後如果想一勞永逸,那麼就只使用絕對匯入即可。因為絕對路徑不需要動腦子。

      包,就是內部含有__init__.py的資料夾,也是模組的另一種形式。在pycharm中甚至直接提供了建立包的選項(python package)。

      匯入包,其實就是向包裡面的__init__.py索要名字。1.如果想直接通過包的名字使用包裡面所有的模組 那麼需要在__init__.py中提前匯入。好處在於__init__可以提前幫你準備好可以使用的名字。2.也可以直接忽略__init__的存在使用絕對匯入即可。好處在於不需要考慮包的存在,直接當成普通資料夾即可。

程式設計思想演變

      1.小白階段,此階段寫程式碼就是在一個檔案內不停地堆疊程式碼的行數(麵條版本)

      2.函式階段,此階段寫程式碼我們學會了將一些特定功能的程式碼封裝到函式中供後續反覆呼叫

      3.模組階段,此階段不單單是將功能程式碼封裝成函式,並且將相似的程式碼功能拆分到不同的py檔案中便於後續的管理

軟體開發目錄規範

1.bin資料夾

      存放程式的啟動檔案 start.py

2.conf資料夾

      存放程式的配置檔案 settings.pyy

3.core資料夾

      存放程式的核心業務 src.py 就是最為重要的程式碼 能夠實現具體需求

4.lib資料夾

      存放程式公共的功能 common.py

5.db資料夾

      存放程式的資料 userinfo.txt

6.log資料夾

      存放程式的日誌記錄 log.log

7.readme文字檔案

      存放程式的說明、廣告等額外的資訊

8.requirements.txt文字檔案

      存放程式需要使用的第三方模組及對應的版本

      目錄的名字可以不一致,但是主要的思想是一致的。就是為了便於管理。拿到啟動檔案之後直接執行即可,需考慮程式內部的複雜程度。