模塊(Module)的概念:在計(jì)算機(jī)程序的開(kāi)發(fā)過(guò)程中,隨著程序代碼越寫(xiě)越多,在一個(gè)文件里的代碼會(huì)越來(lái)越長(zhǎng),維護(hù)也越來(lái)越不易。為了編寫(xiě)可維護(hù)的代碼,我們把很多函數(shù)分組,分別放在不同的文件里,很多語(yǔ)言都采用這個(gè)組織代碼的方式,在python中一個(gè).py文件就稱(chēng)之為模塊。
使用模塊的好處:大大提高代碼的可維護(hù)性。其次,編寫(xiě)代碼不必從零開(kāi)始。當(dāng)一個(gè)模塊編寫(xiě)完畢,就可以被其他地方引用。我們?cè)诰帉?xiě)程序的時(shí)候,也經(jīng)常引用其他模塊,包括Python內(nèi)置的模塊和來(lái)自第三方的模塊。
站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到揭東網(wǎng)站設(shè)計(jì)與揭東網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋揭東地區(qū)。
所以,模塊一共三種:
另外,使用模塊還可以避免函數(shù)名和變量名沖突。相同名字的函數(shù)和變量完全可以分別存在不同的模塊中,因此,我們自己在編寫(xiě)模塊時(shí),不必考慮名字會(huì)與其他模塊沖突。但是也要注意,盡量不要與內(nèi)置函數(shù)名字沖突。
import module1[, module2[,... moduleN]
當(dāng)我們使用import語(yǔ)句的時(shí)候,Python解釋器是怎樣找到對(duì)應(yīng)的文件的呢?答案就是解釋器有自己的搜索路徑,存在sys.path里。
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu',
'/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
```
因此若像我一樣在當(dāng)前目錄下存在與要引入模塊同名的文件,就會(huì)把要引入的模塊屏蔽掉。
### 2 from…import 語(yǔ)句
from modname import name1[, name2[, ... nameN]]
這個(gè)聲明不會(huì)把整個(gè)modulename模塊導(dǎo)入到當(dāng)前的命名空間中,只會(huì)將它里面的name1或name2單個(gè)引入到執(zhí)行這個(gè)聲明的模塊的全局符號(hào)表。
### 3 From…import* 語(yǔ)句
from modname import *
這提供了一個(gè)簡(jiǎn)單的方法來(lái)導(dǎo)入一個(gè)模塊中的所有項(xiàng)目。然而這種聲明不該被過(guò)多地使用。大多數(shù)情況, Python程序員不使用這種方法,因?yàn)橐氲钠渌鼇?lái)源的命名,很可能覆蓋了已有的定義。
### 4 運(yùn)行本質(zhì)
#1 import test
#2 from test import add
```
無(wú)論1還是2,首先通過(guò)sys.path找到test.py,然后執(zhí)行test腳本(全部執(zhí)行),區(qū)別是1會(huì)將test這個(gè)變量名加載到名字空間,而2只會(huì)將add這個(gè)變量名加載進(jìn)來(lái)。
os模塊是與操作系統(tǒng)交互的一個(gè)接口
os.getcwd() 獲取當(dāng)前工作目錄,即當(dāng)前python腳本工作的目錄路徑
os.chdir("dirname") 改變當(dāng)前腳本工作目錄;相當(dāng)于shell下cd
os.curdir 返回當(dāng)前目錄: ('.')
os.pardir 獲取當(dāng)前目錄的父目錄字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除,并遞歸到上一級(jí)目錄,如若也為空,則刪除,依此類(lèi)推
os.mkdir('dirname') 生成單級(jí)目錄;相當(dāng)于shell中mkdir dirname
os.rmdir('dirname') 刪除單級(jí)空目錄,若目錄不為空則無(wú)法刪除,報(bào)錯(cuò);相當(dāng)于shell中rmdir dirname
os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,并以列表方式打印
os.remove() 刪除一個(gè)文件
os.rename("oldname","newname") 重命名文件/目錄
os.stat('path/filename') 獲取文件/目錄信息
os.sep 輸出操作系統(tǒng)特定的路徑分隔符,win下為"\\",Linux下為"/"
os.linesep 輸出當(dāng)前平臺(tái)使用的行終止符,win下為"\t\n",Linux下為"\n"
os.pathsep 輸出用于分割文件路徑的字符串 win下為;,Linux下為:
os.name 輸出字符串指示當(dāng)前使用平臺(tái)。win->'nt'; Linux->'posix'
os.system("bash command") 運(yùn)行shell命令,直接顯示
os.environ 獲取系統(tǒng)環(huán)境變量
os.path.abspath(path) 返回path規(guī)范化的絕對(duì)路徑
os.path.split(path) 將path分割成目錄和文件名二元組返回
os.path.dirname(path) 返回path的目錄。其實(shí)就是os.path.split(path)的第一個(gè)元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\結(jié)尾,那么就會(huì)返回空值。即os.path.split(path)的第二個(gè)元素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 如果path是絕對(duì)路徑,返回True
os.path.isfile(path) 如果path是一個(gè)存在的文件,返回True。否則返回False
os.path.isdir(path) 如果path是一個(gè)存在的目錄,則返回True。否則返回False
os.path.join(path2[, path3[, ...]]) 將多個(gè)路徑組合后返回,第一個(gè)絕對(duì)路徑之前的參數(shù)將被忽略
os.path.getatime(path) 返回path所指向的文件或者目錄的最后存取時(shí)間
os.path.getmtime(path) 返回path所指向的文件或者目錄的最后修改時(shí)間
sys.argv 命令行參數(shù)List,第一個(gè)元素是程序本身路徑
sys.exit(n) 退出程序,正常退出時(shí)exit(0)
sys.version 獲取Python解釋程序的版本信息
sys.maxint 最大的Int值
sys.path 返回模塊的搜索路徑,初始化時(shí)使用PYTHONPATH環(huán)境變量的值
sys.platform 返回操作系統(tǒng)平臺(tái)名稱(chēng)
import sys,time
for i in range(10):
sys.stdout.write('#')
time.sleep(1)
sys.stdout.flush()
之前我們學(xué)習(xí)過(guò)用eval內(nèi)置方法可以將一個(gè)字符串轉(zhuǎn)成python對(duì)象,不過(guò),eval方法是有局限性的,對(duì)于普通的數(shù)據(jù)類(lèi)型,json.loads和eval都能用,但遇到特殊類(lèi)型的時(shí)候,eval就不管用了,所以eval的重點(diǎn)還是通常用來(lái)執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。
import json
x="[null,true,false,1]"
print(eval(x))
print(json.loads(x))
我們把對(duì)象(變量)從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^(guò)程稱(chēng)之為序列化,在Python中叫pickling,在其他語(yǔ)言中也被稱(chēng)之為serialization,marshalling,flattening等等,都是一個(gè)意思。
序列化之后,就可以把序列化后的內(nèi)容寫(xiě)入磁盤(pán),或者通過(guò)網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上。
反過(guò)來(lái),把變量?jī)?nèi)容從序列化的對(duì)象重新讀到內(nèi)存里稱(chēng)之為反序列化,即unpickling。
如果我們要在不同的編程語(yǔ)言之間傳遞對(duì)象,就必須把對(duì)象序列化為標(biāo)準(zhǔn)格式,比如XML,但更好的方法是序列化為JSON,因?yàn)镴SON表示出來(lái)就是一個(gè)字符串,可以被所有語(yǔ)言讀取,也可以方便地存儲(chǔ)到磁盤(pán)或者通過(guò)網(wǎng)絡(luò)傳輸。JSON不僅是標(biāo)準(zhǔn)格式,并且比XML更快,而且可以直接在Web頁(yè)面中讀取,非常方便。
JSON表示的對(duì)象就是標(biāo)準(zhǔn)的JavaScript語(yǔ)言的對(duì)象,JSON和Python內(nèi)置的數(shù)據(jù)類(lèi)型對(duì)應(yīng)如下:
#----------------------------序列化
import json
dic={'name':'alvin','age':23,'sex':'male'}
print(type(dic))#<class 'dict'>
j=json.dumps(dic)
print(type(j))#<class 'str'>
f=open('序列化對(duì)象','w')
f.write(j) #-------------------等價(jià)于json.dump(dic,f)
f.close()
#-----------------------------反序列化
import json
f=open('序列化對(duì)象')
data=json.loads(f.read())# 等價(jià)于data=json.load(f)
需要注意的是:
import json
#dct="{'1':111}"#json 不認(rèn)單引號(hào)
#dct=str({"1":111})#報(bào)錯(cuò),因?yàn)樯傻臄?shù)據(jù)還是單引號(hào):{'one': 1}
dct='{"1":"111"}'
print(json.loads(dct))
#conclusion:
# 無(wú)論數(shù)據(jù)是怎樣創(chuàng)建的,只要滿足json格式,就可以json.loads出來(lái),不一定非要dumps的數(shù)據(jù)才能loads
##----------------------------序列化
import pickle
dic={'name':'alvin','age':23,'sex':'male'}
print(type(dic))#<class 'dict'>
j=pickle.dumps(dic)
print(type(j))#<class 'bytes'>
f=open('序列化對(duì)象_pickle','wb')#注意是w是寫(xiě)入str,wb是寫(xiě)入bytes,j是'bytes'
f.write(j) #-------------------等價(jià)于pickle.dump(dic,f)
f.close()
#-------------------------反序列化
import pickle
f=open('序列化對(duì)象_pickle','rb')
data=pickle.loads(f.read())# 等價(jià)于data=pickle.load(f)
print(data['age'])
Pickle的問(wèn)題和所有其他編程語(yǔ)言特有的序列化問(wèn)題一樣,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的數(shù)據(jù),不能成功地反序列化也沒(méi)關(guān)系。
shelve模塊比pickle模塊簡(jiǎn)單,只有一個(gè)open函數(shù),返回類(lèi)似字典的對(duì)象,可讀可寫(xiě);key必須為字符串,而值可以是python所支持的數(shù)據(jù)類(lèi)型。(了解)
import shelve
f = shelve.open(r'shelve.txt')
# f['stu1_info']={'name':'alex','age':'18'}
# f['stu2_info']={'name':'alvin','age':'20'}
# f['school_info']={'website':'oldboyedu.com','city':'beijing'}
#
#
# f.close()
print(f.get('stu_info')['age'])
xml是實(shí)現(xiàn)不同語(yǔ)言或程序之間進(jìn)行數(shù)據(jù)交換的協(xié)議,跟json差不多,但json使用起來(lái)更簡(jiǎn)單,不過(guò),古時(shí)候,在json還沒(méi)誕生的黑暗年代,大家只能選擇用xml呀,至今很多傳統(tǒng)公司如金融行業(yè)的很多系統(tǒng)的接口還主要是xml。
xml的格式如下,就是通過(guò)<>節(jié)點(diǎn)來(lái)區(qū)別數(shù)據(jù)結(jié)構(gòu)的:
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
xml協(xié)議在各個(gè)語(yǔ)言里的都 是支持的,在python中可以用以下模塊操作xml:
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
#遍歷xml文檔
for child in root:
print(child.tag, child.attrib)
for i in child:
print(i.tag,i.text)
#只遍歷year 節(jié)點(diǎn)
for node in root.iter('year'):
print(node.tag,node.text)
#---------------------------------------
import xml.etree.ElementTree as ET
tree = ET.parse("xmltest.xml")
root = tree.getroot()
#修改
for node in root.iter('year'):
new_year = int(node.text) + 1
node.text = str(new_year)
node.set("updated","yes")
tree.write("xmltest.xml")
#刪除node
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('output.xml')
自己創(chuàng)建xml文檔:
import xml.etree.ElementTree as ET
new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = '33'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'
et = ET.ElementTree(new_xml) #生成文檔對(duì)象
et.write("test.xml", encoding="utf-8",xml_declaration=True)
ET.dump(new_xml) #打印生成的格式
import re
ret=re.findall('a..in','helloalvin')
print(ret)#['alvin']
ret=re.findall('^a...n','alvinhelloawwwn')
print(ret)#['alvin']
ret=re.findall('a...n$','alvinhelloawwwn')
print(ret)#['awwwn']
ret=re.findall('a...n$','alvinhelloawwwn')
print(ret)#['awwwn']
ret=re.findall('abc*','abcccc')#貪婪匹配[0,+oo]
print(ret)#['abcccc']
ret=re.findall('abc+','abccc')#[1,+oo]
print(ret)#['abccc']
ret=re.findall('abc?','abccc')#[0,1]
print(ret)#['abc']
ret=re.findall('abc{1,4}','abccc')
print(ret)#['abccc'] 貪婪匹配
注意:前面的*,+,?等都是貪婪匹配,也就是盡可能匹配,后面加?號(hào)使其變成惰性匹配
ret=re.findall('abc*?','abcccccc')
print(ret)#['ab']
>>> re.findall('a|b','aliyunbooka') #返回所有滿足匹配條件的結(jié)果,放在列表里
['a', 'b', 'a']
下面這種情況需要注意:
>>> re.findall('www.(baidu).com','awww.baidu.comb')
['baidu']
當(dāng)規(guī)則中有分組時(shí),findall會(huì)優(yōu)先將分組中的元素放入列表,輸出時(shí)也只輸出分組中的元素。
如果需要輸出匹配到的元素:
>>> re.findall('www.(?:baidu).com','awww.baidu.comb')
['www.baidu.com']
函數(shù)會(huì)在字符串內(nèi)查找模式匹配,只到找到第一個(gè)匹配然后返回一個(gè)包含匹配信息的對(duì)象,該對(duì)象可以通過(guò)調(diào)用group()方法得到匹配的字符串,如果字符串沒(méi)有匹配,則返回None。
>>> re.search('a','aliyun').group()
'a'
分組:
>>> ret=re.search('(?P<id>\d{2})-(?P<name>\w{3})','23-poe')
>>> ret.group('id')
'23'
>>> ret.group('name')
'poe'
re.match('a','abc').group() #同search,不過(guò)只在字符串開(kāi)始處進(jìn)行匹配
ret=re.split('[ab]','abcd') #先按'a'分割得到''和'bcd',在對(duì)''和'bcd'分別按'b'分割
print(ret)#['', '', 'cd']
ret=re.sub('\d','abc','alvin5yuan6',1) #參數(shù)1代表只匹配替換一次
print(ret) #alvinabcyuan6
ret=re.subn('\d','abc','alvin5yuan6')
print(ret) #('alvinabcyuanabc', 2) #參數(shù)2,代表該函數(shù)匹配替換了兩次
obj=re.compile('\d{3}')
ret=obj.search('abc123eeee')
print(ret.group()) #123
findall()返回一個(gè)列表,finditer()返回一個(gè)可迭代對(duì)象
ret=re.finditer('\d','ds3sy4784a')
print(ret) #<callable_iterator object at 0x10195f940>
print(next(ret).group())
print(next(ret).group())
文章題目:python基礎(chǔ)五:模塊
轉(zhuǎn)載來(lái)源:http://chinadenli.net/article20/gpjdco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站導(dǎo)航、移動(dòng)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)