Python中模塊的使用

  • 作過開發工做的童鞋應該都知道, 在一個完整的項目中, 會有大量的代碼, 並且慢慢代碼量會愈來愈多, 代碼也就愈來愈難以維護;
  • 隨着你的程序變得愈來愈長,你可能想要將它分割成幾個更易於維護的文件。
  • 你也可能想在不一樣的程序中使用順手的函數,而不是把代碼在它們之間中拷來拷去
  • 爲了解決相似問題, 咱們把不少功能類似的函數分組, 分別放到不一樣的文件中,這樣每一個文件中的代碼相對較少, 且函數功能類似;
  • GitHub代碼示例目地址

概述

模塊簡述

  • Python中提供了一個方法能夠從文件中獲取定義,在腳本或者解釋器的一個交互式實例中使用, 這樣的文件被稱爲模塊;
  • 模塊中的定義能夠導入到另外一個模塊或主模塊中(在腳本執行時能夠調用的變量集位於最高級,而且處於計算器模式)
  • 模塊是包括 Python 定義和聲明的文件。文件名就是模塊名加上 .py 後綴。
  • 模塊的模塊名(作爲一個字符串)能夠由全局變量 __name__ 獲得
  • 模塊主要分爲內置模塊, 三方模塊和自定義模塊

模塊優勢

  • 提升了代碼的可維護性
  • 提升了代碼的服用度, 當一個模塊完畢, 能夠被多個地方引用
  • 可避免函數名和變量名的衝突

標準庫模塊

下面是一個使用python標準庫中模塊的例子python

import sys

print('命令行參數以下:')
for i in sys.argv:
   print(i)

print('\n\nPython 路徑爲:', sys.path, '\n')


# 輸出結果以下
命令行參數以下:
../GitHub/PythonDemo/PythonStudy/7-模塊/1-模塊概述.py

Python 路徑爲: ['/Users/../GitHub/PythonDemo/PythonStudy/7-模塊', '/Users/../GitHub/PythonDemo/PythonStudy', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages', '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend'] 
複製代碼
  • argv: 獲取命令行參數的列表
  • import sys 引入python標準庫中的sys.py模塊
  • import: 這是引入一個模塊的方法(後面會提到)
  • sys.path: 包含了一個Python解釋器自動查找所需模塊的路徑的列表

自定義模塊

  • Python中不但可使用第三方模塊和系統模塊, 同時咱們還可使用自定義模塊,
  • Python中一個.py文件就是一個模塊
  • 下面是我自定義的一個Titan.py模塊, 代碼以下
print('這是Titan模塊')

# 定義變量
age = 20
name = 'titan'

# 定義方法
def sayGood():
    print('good')

def sayNice():
    print('nice')

def sayBad():
    print('bad')
複製代碼

導入模塊

import方式

Python中導入另外一個文件或者模塊, 受用的語法是importgit

# 引入單個或多個模塊
import module1[, module2[,... moduleN]

# 示例
# 一次導入多個模塊
import time, random, os
# 一次導入一個模塊
import calendar
複製代碼

須要注意的是: github

  • 一個模塊只會被導入一次,無論你執行了多少次import, 能夠防止模塊被重複引用
  • 引入任何模塊時(包括自定義模塊), 不用加.py後綴
  • 當咱們使用import語句的時候,Python解釋器是怎樣找到對應的文件的呢?
    • 這就涉及到Python的搜索路徑,搜索路徑是由一系列目錄名組成的,Python解釋器就依次從這些目錄中去尋找所引入的模塊。
    • 這看起來很像環境變量,事實上,也能夠經過定義環境變量的方式來肯定搜索路徑。
    • 搜索路徑是在Python編譯或安裝的時候肯定的,安裝新的庫應該也會修改。搜索路徑被存儲在sys模塊中的path變量

使用示例app

import Titan

Titan.sayBad()
Titan.sayGood()
print(Titan.name)

# 輸出結果:
bad
good
titan
複製代碼

from…import方式

從模塊中導入一個指定的部分到當前的命名空間, 一樣也能夠導入一個模塊中的多個部分(或者導入多個方法或變量), 格式以下:dom

from modname import name1[, name2[, ... nameN]]
複製代碼

使用示例函數

from Titan import sayGood, sayBad, age

sayBad()
sayGood()
print(age)

# 輸出結果:
bad
good
20
複製代碼

須要注意的是:ui

這種方式, 可能會致使和本文件中定義的方法或者變量重名, 這裏須要注意

from…import*方式

把一個模塊中全部的內容, 所有倒入當前命名空間, 可是最好不要過多地使用spa

# 格式:
from modname import *

# 使用:
from Titan import *
sayGood()
print(age)
複製代碼

模塊內置屬性和函數

__name__屬性

  • 除了包含函數定義外,模塊也能夠包含可執行語句, 這些語句通常用來初始化模塊, 他們僅在第一次被導入的地方執行一次
  • 模塊就是一個可執行的.py文件, 一個模塊唄另外一個程序引用, 模塊中的一些可執行語句便會執行
  • 若是咱們不想讓模塊中的某些代碼執行, 能夠用__name__屬性來使程序僅調用模塊中的一部分
  • 如今咱們將模塊中的代碼修改以下:
if __name__ == '__main__':
    print('這是Titan模塊')
else:
    def sayGood():
        print('good')


    def sayNice():
        print('nice')


    def sayBad():
        print('bad')


    age = 20
    name = 'titan'
複製代碼
  • namemain先後都是雙下劃線
  • 每個模塊中都有一個__name__屬性, 當其值等於__main__時, 代表該模塊自身在執行, 不然被引入了其餘文件
  • 當前文件若是爲程序的入口文件, 則__name__屬性的值爲__main__

dir()函數

  • 內置的函數dir() 能夠找到模塊內定義的全部名稱, 以一個字符串列表的形式返回
  • 若是沒有給定參數,那麼dir()函數會羅列出當前定義的全部名稱
import Titan

print(dir(Titan))

# 輸出結果:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'age', 'name', 'sayBad', 'sayGood', 'sayNice']


print(dir())
# 輸出結果:
['Titan', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']


# 這裏定義一個新的變量
sum = 30
print(dir())
# 輸出結果:
['Titan', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'sum']


# 把定義的變量刪除後
del sum
print(dir())
# 輸出結果:
['Titan', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
複製代碼

這裏咱們先思考這樣一個問題: 在同一個項目中有兩個或兩個以上的開發者分別定義了相同名字的模塊(固然獅子啊不一樣的目錄中, 同一個目錄下不可能建立出相同名字的文件), 那麼模塊該如何調用命令行

解決code

  • 爲了解決上述模塊命名的衝突, 引入了按照目錄來組織模塊的方法, 成爲包
  • 包是一種管理Python模塊命名空間的形式,採用"點模塊名稱"
  • 引入包之後, 只要頂層的包不與其餘人的發生衝突, 那麼模塊就都不會與別人的發生衝突
  • 所謂頂層的包指的是上一層的文件目錄
  • 同一個包能夠包含多個模塊
  • 例如: 名爲A.B的模塊表示了名爲A的包中名爲B的子模塊

須要注意的是:

在每個包內(模塊的同級目錄下)必需要建立一個名爲__init__.py的文件, 主要是爲了不一些濫竽充數的名字, 目前該文件內能夠什麼都不用寫, 如圖所示:

包.png

調用方法

import a.Titan
import b.Titan
import b.coder

a.Titan.sayGood()
b.Titan.sayGood()
b.coder.sayGood()


# 輸出結果:
good--a
good--b
good--coder
複製代碼

安裝使用第三方模塊

pip簡介

  • Python中第三方庫是經過pip安裝和管理的, pip就像iOS中的pod同樣, 負責安裝和管理第三方庫
  • MacLinux系統中pip是默認安裝過的, 通常無需從新安裝, 若有問題, 請自行百度解決
  • Mac系統中會有一個默認的Python2.7版本的, 我本身安裝了一個3.6的版本, 天然默認也安裝了pip
  • 下面是一些Python3.6pip的命令, 這裏須要以pip3爲命令頭執行
# 查看當前pip版本
pip3 -V

# 安裝第三方庫
pip3 install ...

# 對pip進行升級
pip3 install --upgrade pip3
複製代碼

安裝第三方庫

  • Mac系統安裝第三方庫, 直接打開終端執行安裝命令便可
  • Pillow已是Python平臺事實上的圖像處理標準庫了
  • PIL功能很是強大,但API卻很是簡單易用
pip3 install Pillow
複製代碼

第三方模塊的使用

操做圖像

下面是最多見的圖像縮放操做示例代碼

from PIL import Image

# 打開一個jpg圖像文件,注意是當前路徑:
im = Image.open('titan.jpg')

# 得到圖像尺寸
w, h = im.size
print('image size: %sx%s' % (w, h))

# 縮放到50%:
im.thumbnail((w//2, h//2))
print('image to: %sx%s' % (w//2, h//2))

# 把縮放後的圖像用jpeg格式保存:
im.save('jun.jpg', 'jpeg')
複製代碼

其餘功能如切片、旋轉、濾鏡、輸出文字、調色板等包羅萬象, 代碼以下:

from PIL import Image, ImageFilter

# 打開一個jpg圖像文件,注意是當前路徑:
im = Image.open('jun.jpg')
# 應用模糊濾鏡:
im2 = im.filter(ImageFilter.BLUR)
im2.save('jun1.jpg', 'jpeg')
複製代碼

相關參考

相關文章
相關標籤/搜索