1. 程式人生 > 其它 >模組匯入import和import from

模組匯入import和import from

今日內容概要

  • 面向過程程式設計(理論)
  • 模組簡介
  • import句式
  • from...import...句式
  • 迴圈匯入問題
  • 絕對匯入與相對匯入
  • 軟體開發目錄規範(理論)

今日內容詳細

面向過程程式設計(理論)

面向過程程式設計就好比在設計一條產品流水線

# 使用者註冊功能
1.獲取使用者名稱和密碼
2.組織成固定的格式
3.檔案操作寫入檔案

'''面向過程程式設計的缺陷在於:一旦要修改功能 那麼需要整體改造(牽一髮而動全身)'''
def get_info():
    username = input('username>>>:').strip()
    password = input('password>>>:').strip()
    if len(username) == 0 or len(password) == 0:
        print('使用者名稱或密碼不能為空')
        return
    user_idf = {
        '1':'admin',
        '2':'user',
    }
    print(user_idf)
    choice = input('請選擇您的身份>>>:').strip()
    if choice in user_idf:
        id = user_idf.get(choice)
        return deal_data(username, password,id)
    else:
        print('輸入不合法')
        return

def deal_data(username,password,id):
    data = '%s|%s|%s\n'%(username,password,id)
    return save_data(data)

def save_data(data):
    with open(r'userinfo','a',encoding='utf8') as f:
        f.write(data)
    print('註冊成功')


get_info()

模組簡介

python語言
	最早起源於linux運維、膠水語言、調包俠(貶義詞>>>褒義詞)

1.什麼是模組?
	模組:一系列功能的結合體
2.為什麼要用模組?
	為了提升開發效率(站在巨人肩膀)
3.模組三種來源
	1.內建的(python直譯器自帶能夠直接匯入使用)
    2.第三方的(別人寫好的釋出在網上的 需要先下載後使用)
    3.自定義的(自己寫的)
4.模組的四種表現形式
    1 使用python編寫的程式碼(.py檔案)
  2 已被編譯為共享庫或DLL的C或C++擴充套件
  3 包好一組模組的包(資料夾)
    	# 包其實就是多個py檔案(模組)的集合
        	包裡面通常會含有一個__init__.py檔案
  4 使用C編寫並連結到python直譯器的內建模組
"""
學習完模組之後 以後我在編寫大型專案的時候 
遇到一些比較複雜的功能可以先考慮是否有相應的模組可以呼叫
"""

import句式

# 在學習模組的時候 一定要區分誰是匯入檔案誰是模組檔案
import md  # 匯入py檔案模組 檔案字尾一定不要加


"""
多次匯入相同模組 只會執行一次

首次匯入md模組發生的事情
    1.執行匯入檔案(import句式.py)產生該檔案的全域性名稱空間
    2.執行md.py檔案
    3.產生md.py全域性名稱空間 執行md檔案內程式碼 將產生的名字全部存檔於md.py名稱空間
    4.在匯入檔名稱空間產生一個md的名字指向md.py全域性名稱空間

import句式匯入模組之後
    通過模組名點的方式就可以使用到模組中所有的名字 並且肯定不會產生衝突(指名道姓)
"""
# money = 999
# md.change()
# print(money)
# print(md.money)

from...import...句式

from md import money,read1,change


"""
from...import...多次匯入也只會匯入一次
    1.先產生執行檔案的全域性名稱空間
    2.執行模組檔案 產生模組的全域性名稱空間
    3.將模組中執行之後產生的名字全部存檔於模組名稱空間中
    4.在執行檔案中有一個money執行模組名稱空間中money指向的值
    
from...import...指名道姓的匯入某個名字
    在使用的時候直接寫名字即可 但是噹噹前名稱空間有相同名字的時候
    就會產生衝突 使用的就變成了當前名稱空間
"""
# money = 999
# print(money)
money = 999
# def read1():
#     print('董小姐')
# read1()
change()
print(money)

小總結

兩種方式的總結
1.import多用於專案根目錄下的包或者模組

2.都支援AS取別名
情況1
主要是在兩個模組下面函式名相同的情況,取個別名,可以保證不會出現問題
第二個函式會把第一個函式覆蓋掉

情況2
如果是模組同名,那麼也會被覆蓋掉,所以還是要起別名

匯入模組擴充套件用法

1.起別名
	既可以給模組名起別名也可以給模組中某個名字起別名
    import mdddddddd as m
    from mddddddd import name as n
    
2.連續匯入
	import 模組名1,模組名2
    	# 可以連續匯入多個模組 但是隻有當多個模組功能相似或者屬於同一個系列
        # 如果功能不同並且不屬於一個系列 那麼推薦分行匯入
        import 模組名1
        import 模組名2
    from 模組名1 import 名字1,名字2,名字3
 
3.通用匯入
	from md import *  # 將模組中所有的名字全部匯入(*表示所有)
    print(money)
    print(read1)
    print(read2)
    print(change)
    __all__ = ['money','read1']  # 在被匯入的模組檔案中可以使用__all__指定可以被匯入使用的名字

判斷檔案型別

# 判斷py檔案是作為模組檔案還是執行檔案
__name__當檔案是執行檔案的時候會返回__main__
如果檔案是被當做模組匯入則返回檔名(模組名)

if __name__ == '__main__':
  read1()
"""在pycharm中可以直接敲 main按tab鍵即可自動補全if判斷"""

迴圈匯入

"""以後我們在匯入模組的時候如果出現了迴圈匯入的情況 說明你程式設計的不合理"""
# 記住在以後的程式設計生涯中不允許出現迴圈匯入的現象!!!

模組匯入的順序

"""
1.先從記憶體中查詢
2.再去內建模組中查詢
3.最後去sys.path系統路徑查詢(自定義模組)
如果都沒有查詢到則報錯
"""

# 以後在給py檔案命名的時候儘量不要與內建模組名衝突

import sys
print(sys.path)  # 結果中第一個元素永遠是當前執行檔案所在的路徑


當某個自定義模組查詢不到的時候解決方案
	1.自己手動將該模組所在的路徑新增到sys.path中
    	import sys
        sys.path.append(r'D:\py20\day18\aaa')
    2.from...import...句式
    	from 資料夾名稱.資料夾名稱 import 模組名
        from 資料夾名稱.模組名稱 import 名字

路徑相對

想要匯入任意的模組和包,都必須寫在如下路徑下,才能被找到。
也可以自動手動在sys.path中新增指定路徑,然後再匯入可以,例如:

路徑處理

import os

import sys

abs_path = os.path.abspath(__file__)#獲取檔案路徑
path1=os.path.dirname(abs_path)#獲取當前路徑的上一級路徑
path2=os.path.dirname(os.path.dirname(os.path.abspath(__file__))#獲取當前路徑的上兩級路徑

sys.path.append(path1)

import xxxxx  # 匯入路徑path1下的一個xxxxx.py檔案

路徑心得

1.以後寫模組名稱時,千萬不能和內建和第三方的同名(新手容易犯錯誤)。重名,會按照預設目錄的列表進行讀取,預設目錄的優先順序的最高的是:當前目錄

2.專案執行檔案一般都在專案根目錄,如果執行檔案巢狀的記憶體目錄,就需要自己手動在sys.path中新增路徑。

3.pycharm中預設會將專案目錄加入到sys.path中