99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋(píng)果6袋
6
麥子學(xué)院

Python的模塊與包如何使用?

發(fā)布時(shí)間:2017-07-15 21:58  回復(fù):0  查看:2448   最后回復(fù):2017-07-15 21:58  

本文和大家分享的主要是python模塊與包相關(guān)內(nèi)容,一起來(lái)看看吧,希望對(duì)大家學(xué)習(xí)python有所幫助。

  一、Python 模塊簡(jiǎn)介

  在開(kāi)發(fā)過(guò)程中,隨著程序代碼越寫(xiě)越多,在一個(gè)文件里代碼就會(huì)越來(lái)越長(zhǎng),越來(lái)越不容易維護(hù)。

  為了編寫(xiě)可維護(hù)的代碼,我們把很多函數(shù)分組,分別放到不同的文件里,這樣,每個(gè)文件包含的代碼就相對(duì)較少,很多編程語(yǔ)言都采用這種組織代碼的方式。在 Python 中,一個(gè) .py 文件就稱之為一個(gè)模塊(Module)。

  之前我們學(xué)習(xí)過(guò)函數(shù),知道函數(shù)是實(shí)現(xiàn)一項(xiàng)或多項(xiàng)功能的一段程序 。其實(shí)模塊就是函數(shù)功能的擴(kuò)展。為什么這么說(shuō)呢?那是因?yàn)槟K其實(shí)就是實(shí)現(xiàn)一項(xiàng)或多項(xiàng)功能的程序塊。

  通過(guò)上面的定義,不難發(fā)現(xiàn),函數(shù)和模塊都是用來(lái)實(shí)現(xiàn)功能的,只是模塊的范圍比函數(shù)廣,在模塊中,可以有多個(gè)函數(shù)。

  竟然了解了什么是模塊了,那么為什么需要模塊呢?竟然有了函數(shù),那為啥那需要模塊?

  最大的好處是大大提高了代碼的可維護(hù)性。其次,編寫(xiě)代碼不必從零開(kāi)始。當(dāng)一個(gè)模塊編寫(xiě)完畢,就可以被其他地方引用。我們?cè)诰帉?xiě)程序的時(shí)候,也經(jīng)常引用其他模塊,包括 Python內(nèi)置的模塊和來(lái)自第三方的模塊。

  使用模塊還可以避免函數(shù)名和變量名沖突。相同名字的函數(shù)和變量完全可以分別存在不同的模塊中,因此,我們自己在編寫(xiě)模塊時(shí),不必考慮名字會(huì)與其他模塊沖突。但是也要注意,盡量不要與內(nèi)置函數(shù)名字沖突。

  Python 本身就內(nèi)置了很多非常有用的模塊,只要安裝完畢,這些模塊就可以立刻使用。我們可以嘗試找下這些模塊,比如我的 Python 安裝目錄是默認(rèn)的安裝目錄,在 C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36 ,然后找到 Lib 目錄,就可以發(fā)現(xiàn)里面全部都是模塊,沒(méi)錯(cuò),這些 .py 文件就是模塊了。

Python的模塊與包如何使用?

python36bin目錄

  其實(shí)模塊可以分為標(biāo)準(zhǔn)庫(kù)模塊和自定義模塊,而剛剛我們看到的 Lib 目錄下的都是標(biāo)準(zhǔn)庫(kù)模塊。

  二、模塊的使用

  1、import

  Python 模塊的使用跟其他編程語(yǔ)言也是類(lèi)似的。你要使用某個(gè)模塊,在使用之前,必須要導(dǎo)入這個(gè)模塊。導(dǎo)入模塊我們使用關(guān)鍵字 import 。

  import 的語(yǔ)法基本如下:

  import module1[, module2[,... moduleN]

  比如我們使用標(biāo)準(zhǔn)庫(kù)模塊中的 math 模塊。當(dāng)解釋器遇到 import 語(yǔ)句,如果模塊在當(dāng)前的搜索路徑就會(huì)被導(dǎo)入。

  #!/usr/bin/env python3# -*- coding: UTF-8 -*-

  import math

  _author_ = '兩點(diǎn)水'

  print(math.pi)

  輸出的結(jié)果:

  3.141592653589793

  一個(gè)模塊只會(huì)被導(dǎo)入一次,不管你執(zhí)行了多少次 import。這樣可以防止導(dǎo)入模塊被一遍又一遍地執(zhí)行。

  當(dāng)我們使用 import 語(yǔ)句的時(shí)候,Python 解釋器是怎樣找到對(duì)應(yīng)的文件的呢?

  這就涉及到 Python 的搜索路徑,搜索路徑是由一系列目錄名組成的,Python 解釋器就依次從這些目錄中去尋找所引入的模塊。這看起來(lái)很像環(huán)境變量,事實(shí)上,也可以通過(guò)定義環(huán)境變量的方式來(lái)確定搜索路徑。搜索路徑是在 Python 編譯或安裝的時(shí)候確定的,安裝新的庫(kù)應(yīng)該也會(huì)修改。搜索路徑被存儲(chǔ)在sys 模塊中的 path 變量 。

  因此,我們可以查一下路徑:

  #!/usr/bin/env python# -*- coding: UTF-8 -*-

  import sys

  print(sys.path)

  輸出結(jié)果:

  ['C:\\\\Users\\\\Administrator\\\\Desktop\\\\Python\\\\Python8Code', 'G:\\\\PyCharm 2017.1.4\\\\helpers\\\\pycharm', 'C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python36\\\\python36.zip', 'C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python36\\\\DLLs', 'C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python36\\\\lib', 'C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python36', 'C:\\\\Users\\\\Administrator\\\\AppData\\\\Local\\\\Programs\\\\Python\\\\Python36\\\\lib\\\\site-packages', 'C:\\\\Users\\\\Administrator\\\\Desktop\\\\Python\\\\Python8Code\\\\com\\\\Learn\\\\module\\\\sys']

  2、from...import

  有沒(méi)有想過(guò),怎么直接導(dǎo)入某個(gè)模塊中的屬性和方法呢?

  Python 中,導(dǎo)入一個(gè)模塊的方法我們使用的是 import 關(guān)鍵字,這樣做是導(dǎo)入了這個(gè)模塊,這里需要注意了,這樣做只是導(dǎo)入了模塊,并沒(méi)有導(dǎo)入模塊中具體的某個(gè)屬性或方法的。而我們想直接導(dǎo)入某個(gè)模塊中的某一個(gè)功能,也就是屬性和方法的話,我們可以使用 from...import 語(yǔ)句。

  語(yǔ)法如下:

  from modname import name1[, name2[, ... nameN]]

  看完簡(jiǎn)介后可能會(huì)想, from...import  import 方法有啥區(qū)別呢?

  想知道區(qū)別是什么,觀察下面兩個(gè)例子:

  import 導(dǎo)入 sys 模塊,然后使用 version 屬性


Python的模塊與包如何使用?

from...import和 import的區(qū)別1

  from...import 直接導(dǎo)入 version 屬性

Python的模塊與包如何使用?

from...import和 import的區(qū)別2

  3from ... import *

  通過(guò)上面的學(xué)習(xí),我們知道了 from sys import version 可以直接導(dǎo)入 version 屬性。但是如果我們想使用其他的屬性呢?比如使用 sys 模塊中的 executable ,難道又要寫(xiě)多一句 from sys import executable ,兩個(gè)還好,如果三個(gè),四個(gè)呢?難道要一直這樣寫(xiě)下去?

  這時(shí)候就需要 from ... import * 語(yǔ)句了,這個(gè)語(yǔ)句可以把某個(gè)模塊中的所有方法屬性都導(dǎo)入。比如:

  #!/usr/bin/env python3# -*- coding: UTF-8 -*-

  from sys import *

  print(version)

  print(executable)

  輸出的結(jié)果為:

  3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python.exe

  注意:這提供了一個(gè)簡(jiǎn)單的方法來(lái)導(dǎo)入一個(gè)模塊中的所有方法屬性。然而這種聲明不該被過(guò)多地使用。

  三、主模塊和非主模塊

  1、主模塊和非主模塊的定義

  在 Python 函數(shù)中,如果一個(gè)函數(shù)調(diào)用了其他函數(shù)完成一項(xiàng)功能,我們稱這個(gè)函數(shù)為主函數(shù),如果一個(gè)函數(shù)沒(méi)有調(diào)用其他函數(shù),我們稱這種函數(shù)為非主函數(shù)。主模塊和非主模塊的定義也類(lèi)似,如果一個(gè)模塊被直接使用,而沒(méi)有被別人調(diào)用,我們稱這個(gè)模塊為主模塊,如果一個(gè)模塊被別人調(diào)用,我們稱這個(gè)模塊為非主模塊。

  2、name屬性

  在 Python 中,有主模塊和非主模塊之分,當(dāng)然,我們也得區(qū)分他們啊。那么怎么區(qū)分主模塊和非主模塊呢?

  這就需要用到 __name__ 屬性了,這個(gè) ——name—— 屬性值是一個(gè)變量,且這個(gè)變量是系統(tǒng)給出的。利用這個(gè)變量可以判斷一個(gè)模塊是否是主模塊。如果一個(gè)屬性的值是 __main__ ,那么就說(shuō)明這個(gè)模塊是主模塊,反之亦然。但是要注意了: 這個(gè) __main__ 屬性只是幫助我們判斷是否是主模塊,并不是說(shuō)這個(gè)屬性決定他們是否是主模塊,決定是否是主模塊的條件只是這個(gè)模塊有沒(méi)有被人調(diào)用

  具體看示例:

  首先創(chuàng)建了模塊 lname ,然后判斷一下是否是主模塊,如果是主模塊就輸出 main 不是,就輸出 not main ,首先直接運(yùn)行該模塊,由于該模塊是直接使用,而沒(méi)有被人調(diào)用,所以是主模塊,因此輸出了 main ,具體看下圖:

Python的模塊與包如何使用?

 name屬性區(qū)分模塊1

  然后又創(chuàng)建一個(gè) user_lname 模塊,里面只是簡(jiǎn)單的導(dǎo)入了 lname 模塊,然后執(zhí)行,輸出的結(jié)果是 not main ,因?yàn)?/span> lname 模塊被該模塊調(diào)用了,所以不是主模塊,輸出結(jié)果如圖:

Python的模塊與包如何使用?

name屬性區(qū)分模塊2

  四、包

  包,其實(shí)在上面的一些例子中,都創(chuàng)建了不同的包名了,具體可以仔細(xì)觀察。在一開(kāi)始模塊的簡(jiǎn)介中提到,使用模塊可以避免函數(shù)名和變量名沖突。相同名字的函數(shù)和變量完全可以分別存在不同的模塊中,因此,我們自己在編寫(xiě)模塊時(shí),不必考慮名字會(huì)與其他模塊沖突。但是也要注意,盡量不要與內(nèi)置函數(shù)名字沖突。但是這里也有個(gè)問(wèn)題,如果不同的人編寫(xiě)的模塊名相同怎么辦?為了避免模塊名沖突,Python 又引入了按目錄來(lái)組織模塊的方法,稱為包(Package)。

  比如最開(kāi)始的例子,就引入了包,這樣子做就算有相同的模塊名,也不會(huì)造成重復(fù),因?yàn)榘煌鋵?shí)也就是路徑不同。如下圖,引入了包名后, lname.py 其實(shí)變成了 com.Learn.module.nameattributes.lname

Python的模塊與包如何使用?

Python 

  仔細(xì)觀察的人,基本會(huì)發(fā)現(xiàn),每一個(gè)包目錄下面都會(huì)有一個(gè) __init__.py 的文件,為什么呢?

  因?yàn)檫@個(gè)文件是必須的,否則,Python 就把這個(gè)目錄當(dāng)成普通目錄,而不是一個(gè)包 。 __init__.py 可以是空文件,也可以有Python代碼,因?yàn)?nbsp;__init__.py 本身就是一個(gè)模塊,而它對(duì)應(yīng)的模塊名就是它的包名。

  五、作用域

  學(xué)習(xí)過(guò) Java 的同學(xué)都知道,Java 的類(lèi)里面可以給方法和屬性定義公共的( public )或者是私有的 ( private ,這樣做主要是為了我們希望有些函數(shù)和屬性能給別人使用或者只能內(nèi)部使用。 通過(guò)學(xué)習(xí) Python 中的模塊,其實(shí)和 Java 中的類(lèi)相似,那么我們?cè)趺磳?shí)現(xiàn)在一個(gè)模塊中,有的函數(shù)和變量給別人使用,有的函數(shù)和變量?jī)H僅在模塊內(nèi)部使用呢?

  在 Python 中,是通過(guò) _ 前綴來(lái)實(shí)現(xiàn)的。正常的函數(shù)和變量名是公開(kāi)的(public),可以被直接引用,比如:abcni12,PI等;類(lèi)似 __xxx__ 這樣的變量是特殊變量,可以被直接引用,但是有特殊用途,比如上面的 __name__ 就是特殊變量,還有 __author__ 也是特殊變量,用來(lái)標(biāo)明作者。注意,我們自己的變量一般不要用這種變量名;類(lèi)似 _xxx  __xxx 這樣的函數(shù)或變量就是非公開(kāi)的(private),不應(yīng)該被直接引用,比如 _abc , __abc 等;

  注意,這里是說(shuō)不應(yīng)該,而不是不能。因?yàn)?/span> Python 種并沒(méi)有一種方法可以完全限制訪問(wèn) private 函數(shù)或變量,但是,從編程習(xí)慣上不應(yīng)該引用 private 函數(shù)或變量。

  比如:

  #!/usr/bin/env python3# -*- coding: UTF-8 -*-

  def _diamond_vip(lv):

  print('尊敬的鉆石會(huì)員用戶,您好')

  vip_name = 'DiamondVIP' + str(lv)

  return vip_name

  def _gold_vip(lv):

  print('尊敬的黃金會(huì)員用戶,您好')

  vip_name = 'GoldVIP' + str(lv)

  return vip_name

  def vip_lv_name(lv):

  if lv == 1:

  print(_gold_vip(lv))

  elif lv == 2:

  print(_diamond_vip(lv))

  vip_lv_name(2)

  輸出的結(jié)果:

  尊敬的鉆石會(huì)員用戶,您好

  DiamondVIP2

  在這個(gè)模塊中,我們公開(kāi) vip_lv_name 方法函數(shù),而其他內(nèi)部的邏輯分別在 vip_lv_name vip_lv_name private 函數(shù)中實(shí)現(xiàn),因?yàn)槭莾?nèi)部實(shí)現(xiàn)邏輯,調(diào)用者根本不需要關(guān)心這個(gè)函數(shù)方法,它只需關(guān)心調(diào)用 vip_lv_name 的方法函數(shù),所以用 private 是非常有用的代碼封裝和抽象的方法

  一般情況下,外部不需要引用的函數(shù)全部定義成 private,只有外部需要引用的函數(shù)才定義為 public。

 

 

來(lái)源:簡(jiǎn)書(shū)

您還未登錄,請(qǐng)先登錄

熱門(mén)帖子

最新帖子

?