官术网_书友最值得收藏!

1.3.3 網(wǎng)絡(luò)模塊

Python提供了強(qiáng)大的模塊支持,不僅有大量的標(biāo)準(zhǔn)模塊,還有大量的第三方模塊。開發(fā)者也可以開發(fā)自定義模塊。這些強(qiáng)大的模塊可以極大地提高開發(fā)者的開發(fā)效率。

模塊就是Python程序,任何Python程序都可以作為模塊。隨著程序功能的復(fù)雜化,程序不斷變大。為了便于維護(hù),通常會(huì)將其分為多個(gè)文件(模塊),這樣不僅可以提高代碼的可維護(hù)性,還可以提高代碼的可重用性。當(dāng)編寫好一個(gè)模塊后,若編程過(guò)程中需要用到該模塊的某個(gè)功能(由變量、函數(shù)、類實(shí)現(xiàn)),則無(wú)須做重復(fù)性的編寫工作,直接在程序中導(dǎo)入該模塊即可。

(1)導(dǎo)入模塊

Python中有幾種方法可以導(dǎo)入模塊。

●導(dǎo)入整個(gè)模塊:import模塊名,如導(dǎo)入sys模塊,import sys。

●導(dǎo)入整個(gè)模塊,并指定別名:import模塊名as別名

●導(dǎo)入模塊中的某個(gè)或某些函數(shù):from模塊名import函數(shù)名

●導(dǎo)入指定模塊中的所有成員:from模塊名import*。

(2)自定義模塊

下面是創(chuàng)建自己的模塊并將函數(shù)從一個(gè)模塊導(dǎo)入另一個(gè)模塊的例子。

首先,創(chuàng)建名為check_ip_func.py的文件,其功能是根據(jù)參數(shù)檢查IP地址的正確性,返回IPv4Address或IPv6Address對(duì)象;默認(rèn)情況下,小于232的整數(shù)將被視為IPv4地址。如果地址不是有效的IPv4或IPv6地址,則會(huì)引發(fā)ValueError。代碼如下:

上面的代碼可以獨(dú)立運(yùn)行,執(zhí)行結(jié)果如下:

其次,將check_ip_func.py文件作為模塊,供其他Python程序調(diào)用。在check_ip_func.py文件同一目錄下,創(chuàng)建名為get_correct_ip.py文件,該文件將調(diào)用check_ip_func.py模塊中定義的check_ip()函數(shù),以從地址列表中選擇正確的IP地址。

執(zhí)行結(jié)果如下:

從上面的執(zhí)行結(jié)果中可以看到,Python解釋器將模塊check_ip_func.py中的代碼也一塊兒執(zhí)行了,執(zhí)行結(jié)果中的前3行就是模塊check_ip_func.py的執(zhí)行結(jié)果,但這并不是我們想要的結(jié)果。

想要避免這種情況的關(guān)鍵在于,要讓Python解釋器知道,當(dāng)前要運(yùn)行的程序是模塊本身,還是導(dǎo)入模塊的其他程序。在模塊check_ip_func.py中,僅僅定義函數(shù),不需要其他的代碼,修改后的代碼如下:

而get_correct_ip.py程序保持不變,在執(zhí)行g(shù)et_correct_ip.py后即可得到我們想要的結(jié)果:

下面將介紹常用的3個(gè)網(wǎng)絡(luò)編程模塊:ipaddress模塊、netaddr模塊和tabulate模塊。

(1)ipaddress模塊

該模塊包括IPv4和IPv6地址的類,可以用來(lái)生成、驗(yàn)證、查找IP地址。從Python 3.3開始,ipaddress模塊正式成為Python標(biāo)準(zhǔn)庫(kù)中的模塊之一,不需要安裝,可直接使用。

ipaddress模塊中有IPv4Address類和IPv6Address類,可分別用來(lái)處理IPv4和IPv6地址。由于IPv4Address和IPv6Address對(duì)象共享許多共同屬性,下面的案例將只處理IPv4格式,可以以類似的方式處理IPv6格式。

●ipaddress.ip_address()函數(shù)會(huì)根據(jù)傳入的字符串自動(dòng)創(chuàng)建IPv4/IPv6 Address對(duì)象。

也可以使用正整數(shù)來(lái)創(chuàng)建地址,默認(rèn)小于232的整數(shù)是IPv4地址,大于232的整數(shù)則是IPv6地址。

使用ipaddress.ip_address()創(chuàng)建IPv4Address對(duì)象有很多IPv4地址的屬性。

●使用ipaddress.ip_network()函數(shù)創(chuàng)建IPv4/IPv6Address對(duì)象。

ipaddress.ip_network()函數(shù)允許劃分網(wǎng)絡(luò)(子網(wǎng)劃分)。默認(rèn)情況下,它將網(wǎng)絡(luò)劃分為兩個(gè)子網(wǎng)。

通過(guò)prefixlen_diff參數(shù)設(shè)置允許指定子網(wǎng)的位數(shù)。

●ipaddress.ip_interface()函數(shù)允許創(chuàng)建IPv4或IPv6接口對(duì)象。

(2)netaddr模塊

該模塊是Python處理IP地址和MAC地址的開源第三方庫(kù),是用于對(duì)網(wǎng)絡(luò)地址段進(jìn)行定義和操作的一個(gè)工具類。通過(guò)netaddr模塊可以以非常靈活的方式定義網(wǎng)段,獲取網(wǎng)段的一些常用信息,同時(shí)可以和網(wǎng)絡(luò)地址與網(wǎng)段進(jìn)行一些包含關(guān)系的運(yùn)算。

netaddr模塊不是Python的標(biāo)準(zhǔn)模塊,使用前需要安裝。

●IPAddress對(duì)象表示單個(gè)IP地址,可以接收一個(gè)IPv4或IPv6地址字符串。

●IPNetwork()是處理IP網(wǎng)段的方法,同樣可以接收一個(gè)IPv4或IPv6地址字符串。

●cidr_merge()是網(wǎng)段的匯總方法,它只接收列表,列表中必須含有要匯總的網(wǎng)段。

●EUI()是netaddr格式化MAC地址的方法,可以接收任何表達(dá)形式的MAC地址字符串。

(3)tabulate模塊

通過(guò)tabulate模塊可以精美地顯示數(shù)據(jù)。它不是Python標(biāo)準(zhǔn)庫(kù),因此需要先進(jìn)行安裝。

●tabulate模塊支持列表、字典等表格數(shù)據(jù)類型。模塊中的tabulate()函數(shù)用于制表。

●tabulate()函數(shù)還可以使用headers參數(shù)指定列名。

●tabulate()函數(shù)還可以使用參數(shù)tablefmt輸出網(wǎng)格。

主站蜘蛛池模板: 拉孜县| 楚雄市| 江华| 彰武县| 彭阳县| 新野县| 阳城县| 三亚市| 科尔| 尚义县| 颍上县| 海丰县| SHOW| 苏尼特左旗| 玉田县| 泰州市| 北流市| 大新县| 普宁市| 三穗县| 宜良县| 丁青县| 呼和浩特市| 中方县| 永顺县| 临清市| 南和县| 甘孜| 津南区| 古浪县| 聂荣县| 安宁市| 汝阳县| 涟水县| 疏勒县| 巧家县| 鹤壁市| 七台河市| 阿克苏市| 郎溪县| 鲁甸县|