python最常用的编程方式是什么_python常用模块和对象编程
1.摘要
常用模塊
對象編程
領(lǐng)域模型
2.常用模塊
2.1shutil模塊
2.1.1?shutil.copyfileobj(fsrc, fdst[, length])
1 f = open("test.txt","r",encoding="utf-8")2 f1 = open("test2.txt","w+",encoding="utf-8")3
4 shutil.copyfileobj(f,f1,length=1000) #對文件對象進行拷貝操作,都需要打開后才能操作,length指定緩沖區(qū)的大小5 f.close()6 f1.close()
2.1.2?shutil.copyfile(src,dst)
1 shutil.copyfile("test.txt", "test2.txt") #對文件進行操作
2.1.3?shutil.copymode(src,dst)
#僅copy權(quán)限,不更改文件內(nèi)容,組和用戶
2.1.4?shutil.copystat(src, dst)
拷貝狀態(tài)的信息,包括:mode bits, atime, mtime, flags
2.1.5shutil.copy(src, dst)
拷貝文件和權(quán)限
2.1.6?shutil.copy2(src,dst)
#復(fù)制文件的內(nèi)容以及文件的所有狀態(tài)信息。先copyfile后copystat
2.1.7?shutil.ignore_patterns(*patterns)
shutil.copytree(src, dst, symlinks=False, ignore=None)
1 shutil.copytree("E:\Python\mytest\\atm","E:\Python\mytest\\test\mytmp",ignore=shutil.ignore_patterns("atm","*.py"))
2.1.8?shutil.rmtree(path[, ignore_errors[, onerror]])
1 shutil.rmtree("E:\Python\mytest\\test\mytmp") #包括mytmp目錄也會備刪除
2.1.9?shutil.move(src, dst)
#遞歸的移動文件
1 shutil.move("E:\Python\mytest\\test\mytmp1","E:\Python\mytest\\test\mytmp") #將包括mytmp1目錄全部移動至mytmp目錄
2.1.10?shutil.make_archive(base_name, format,...)
1 shutil.make_archive("E:\Python\mytest\\test\\test","zip",root_dir="E:\Python\mytest\\atm") #壓縮單個目錄
2.2zipfile和tarfile模塊
1 import zipfile2
3 z = zipfile.ZipFile("mytest.zip","w")4 z.write("E:\Python\mytest\\atm\\atm\\bin\\atm.py")5 z.write("E:\Python\mytest\\atm\\atm\core\main.py")6 z.close()7
8 #壓縮文件包含原有文件路徑目錄
1 import zipfile2
3 z = zipfile.ZipFile("mytest.zip","w")4 z.write("E:\Python\mytest\\atm\\atm\\bin\\atm.py",arcname="atm.py")5 z.write("E:\Python\mytest\\atm\\atm\core\main.py",arcname="main.py")6 z.close()7
8 #壓縮文件不包含原有文件路徑目錄
2.3 shelve模塊
shelve模塊是一個簡單的k,v將內(nèi)存數(shù)據(jù)通過文件持久化的模塊,可以持久化任何pickle可支持的python數(shù)據(jù)格式
1 importshelve2
3 d = shelve.open('shelve_test') #打開一個文件
4
5 classTest(object):6 def __init__(self,n):7 self.n =n8
9
10 t = Test(123)11 t2 = Test(123334)12
13 name = ["alex","rain","test"]14 d["test"] = name #持久化列表
15 d["t1"] = t #持久化類
16 d["t2"] =t217
18 d.close()
2.4 xml模塊
xml是實現(xiàn)不同語言或程序之間進行數(shù)據(jù)交換的協(xié)議,跟json差不多,但json使用起來更簡單,不過,古時候,在json還沒誕生的黑暗年代,大家只能選擇用xml呀,至今很多傳統(tǒng)公司如金融行業(yè)的很多系統(tǒng)的接口還主要是xml。
xml的格式如下,就是通過<>節(jié)點來區(qū)別數(shù)據(jù)結(jié)構(gòu)的:
2
2008
141100
5
2011
59900
69
2011
13600
xml樣例
2.4.1查詢
1 mport xml.etree.ElementTree as ET2
3 tree = ET.parse("xmltest.xml")4 root =tree.getroot()5 print(root.tag)6
7 #遍歷xml文檔
8 for child inroot:9 print(child.tag, child.attrib)10 for i inchild:11 print(i.tag,i.text)12
13 #只遍歷year 節(jié)點
14 for node in root.iter('year'):15 print(node.tag,node.text)
2.4.2修改和刪除
1 importxml.etree.ElementTree as ET2
3 tree = ET.parse("xmltest.xml")4 root =tree.getroot()5
6 #修改
7 for node in root.iter('year'):8 new_year = int(node.text) + 1
9 node.text =str(new_year)10 node.set("updated","yes")11
12 tree.write("xmltest.xml")13
14
15 #刪除node
16 for country in root.findall('country'):17 rank = int(country.find('rank').text)18 if rank > 50:19 root.remove(country)20
21 tree.write('output.xml')
2.4.3 創(chuàng)建xml
1 importxml.etree.ElementTree as ET2
3
4 new_xml = ET.Element("namelist")5 name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})6 age = ET.SubElement(name,"age",attrib={"checked":"no"})7 sex = ET.SubElement(name,"sex")8 sex.text = '33'
9 name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})10 age = ET.SubElement(name2,"age")11 age.text = '19'
12
13 et = ET.ElementTree(new_xml) #生成文檔對象
14 et.write("test.xml", encoding="utf-8",xml_declaration=True)15
16 ET.dump(new_xml) #打印生成的格式
2.5 PyYAML模塊
Python也可以很容易的處理ymal文檔格式,只不過需要安裝一個模塊,參考文檔:http://pyyaml.org/wiki/PyYAMLDocumentation
2.6 ConfigParse模塊
[DEFAULT]
ServerAliveInterval= 45Compression=yes
CompressionLevel= 9ForwardX11=yes
[bitbucket.org]
User=hg
[topsecret.server.com]
Port= 50022ForwardX11= no
配置文件樣例
2.6.1創(chuàng)建配置文件
1 importconfigparser2
3 config =configparser.ConfigParser()4 config["DEFAULT"] = {'ServerAliveInterval': '45',5 'Compression': 'yes',6 'CompressionLevel': '9'}7
8 config['bitbucket.org'] ={}9 config['bitbucket.org']['User'] = 'hg'
10 config['topsecret.server.com'] ={}11 topsecret = config['topsecret.server.com']12 topsecret['Host Port'] = '50022' #mutates the parser
13 topsecret['ForwardX11'] = 'no' #same here
14 config['DEFAULT']['ForwardX11'] = 'yes'
15 with open('example.ini', 'w') as configfile:16 config.write(configfile)
2.6.2 查詢
1 >>> importconfigparser2 >>> config =configparser.ConfigParser()3 >>>config.sections()4 []5 >>> config.read('example.ini')6 ['example.ini']7 >>>config.sections()8 ['bitbucket.org', 'topsecret.server.com']9 >>> 'bitbucket.org' inconfig10 True11 >>> 'bytebong.com' inconfig12 False13 >>> config['bitbucket.org']['User']14 'hg'
15 >>> config['DEFAULT']['Compression']16 'yes'
17 >>> topsecret = config['topsecret.server.com']18 >>> topsecret['ForwardX11']19 'no'
20 >>> topsecret['Port']21 '50022'
22 >>> for key in config['bitbucket.org']: print(key)23 ...24 user25 compressionlevel26 serveraliveinterval27 compression28 forwardx1129 >>> config['bitbucket.org']['ForwardX11']30 'yes'
2.6.3 配置文件增刪改查
1 importconfigparser2
3 config =configparser.ConfigParser()4 config.read("example.ini")5
6 print(config.sections())7 ['bitbucket.org', 'topsecret.server.com']8 DEFAULT默認(rèn)存在9
10 print(config.options("topsecret.server.com"))11 ['host port', 'forwardx11', 'compression', 'compressionlevel', 'serveraliveinterval']12
13 print(config.items("topsecret.server.com"))14 [('compression', 'yes'), ('compressionlevel', '9'), ('serveraliveinterval', '45'), ('forwardx11', 'no'), ('host port', '50022')]15
16 config.remove_section("bitbucket.org") #刪除一個section
17 config.write(open("test.ini","w"))18
19 config.add_section("test") #添加一個section
20 config.set("test","k1","11111") #修改option的值
21 config.write(open('test2.ini', "w"))
2.7 hashlib模塊
用于加密相關(guān)的操作,3.x里代替了md5模塊和sha模塊,主要提供?SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
1 importhashlib2
3 m =hashlib.md5()4 m.update(b"Hello")5 m.update(b"It's me")6 print(m.digest())7 m.update(b"It's been a long time since last time we ...")8
9 print(m.digest()) #2進制格式hash
10 print(len(m.hexdigest())) #16進制格式hash
11 '''
12 def digest(self, *args, **kwargs): # real signature unknown13 """ Return the digest value as a string of binary data. """14 pass15
16 def hexdigest(self, *args, **kwargs): # real signature unknown17 """ Return the digest value as a string of hexadecimal digits. """18 pass19
20 '''
21 importhashlib22
23 ######### md5 ########
24
25 hash =hashlib.md5()26 hash.update('admin')27 print(hash.hexdigest())28
29 ######### sha1 ########
30
31 hash =hashlib.sha1()32 hash.update('admin')33 print(hash.hexdigest())34
35 ######### sha256 ########
36
37 hash =hashlib.sha256()38 hash.update('admin')39 print(hash.hexdigest())40
41
42 ######### sha384 ########
43
44 hash =hashlib.sha384()45 hash.update('admin')46 print(hash.hexdigest())47
48 ######### sha512 ########
49
50 hash =hashlib.sha512()51 hash.update('admin')52 print(hash.hexdigest())
python 還有一個 hmac 模塊,它內(nèi)部對我們創(chuàng)建 key 和 內(nèi)容 再進行處理然后再加密
散列消息鑒別碼,簡稱HMAC,是一種基于消息鑒別碼MAC(Message Authentication Code)的鑒別機制。使用HMAC時,消息通訊的雙方,通過驗證消息中加入的鑒別密鑰K來鑒別消息的真?zhèn)?#xff1b;
一般用于網(wǎng)絡(luò)通信中消息加密,前提是雙方先要約定好key,就像接頭暗號一樣,然后消息發(fā)送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 發(fā)送者的相對比是否相等,這樣就能驗證消息的真實性,及發(fā)送者的合法性了。
1 importhmac2 h = hmac.new(b'天王蓋地虎', b'寶塔鎮(zhèn)河妖')3 print h.hexdigest()
更多關(guān)于md5,sha1,sha256等介紹的文章看這里https://www.tbs-certificates.co.uk/FAQ/en/sha256.html
2.8 subprocess模塊
1 #執(zhí)行命令,返回命令執(zhí)行狀態(tài) , 0 or 非0
2 >>> retcode = subprocess.call(["ls", "-l"])3
4 #執(zhí)行命令,如果命令結(jié)果為0,就正常返回,否則拋異常
5 >>> subprocess.check_call(["ls", "-l"])6 07
8 #接收字符串格式命令,返回元組形式,第1個元素是執(zhí)行狀態(tài),第2個是命令結(jié)果
9 >>> subprocess.getstatusoutput('ls /bin/ls')10 (0, '/bin/ls')11
12 #接收字符串格式命令,并返回結(jié)果
13 >>> subprocess.getoutput('ls /bin/ls')14 '/bin/ls'
15
16 #執(zhí)行命令,并返回結(jié)果,注意是返回結(jié)果,不是打印,下例結(jié)果返回給res
17 >>> res=subprocess.check_output(['ls','-l'])18 >>>res19 b'total 0\ndrwxr-xr-x 12 alex staff 408 Nov 2 11:05 OldBoyCRM\n'
20
21 #上面那些方法,底層都是封裝的subprocess.Popen
22 poll()23 Check ifchild process has terminated. Returns returncode24
25 wait()26 Wait forchild process to terminate. Returns returncode attribute.27
28
29 terminate() 殺掉所啟動進程30 communicate() 等待任務(wù)結(jié)束31
32 stdin 標(biāo)準(zhǔn)輸入33
34 stdout 標(biāo)準(zhǔn)輸出35
36 stderr 標(biāo)準(zhǔn)錯誤37
38 pid39 The process ID of the child process.40
41 #例子
42 >>> p = subprocess.Popen("df -h|grep disk",stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)43 >>>p.stdout.read()44 b'/dev/disk1 465Gi 64Gi 400Gi 14% 16901472 104938142 14% /\n'
調(diào)用subprocess.run(...)是推薦的常用方法,在大多數(shù)情況下能滿足需求,但如果你可能需要進行一些復(fù)雜的與系統(tǒng)的交互的話,你還可以用subprocess.Popen(),語法如下:
1 p = subprocess.Popen("find / -size +1000000 -exec ls -shl {} \;",shell=True,stdout=subprocess.PIPE)2 print(p.stdout.read())
可用參數(shù):
args:shell命令,可以是字符串或者序列類型(如:list,元組)
bufsize:指定緩沖。0 無緩沖,1 行緩沖,其他 緩沖區(qū)大小,負(fù)值 系統(tǒng)緩沖
stdin, stdout, stderr:分別表示程序的標(biāo)準(zhǔn)輸入、輸出、錯誤句柄
preexec_fn:只在Unix平臺下有效,用于指定一個可執(zhí)行對象(callable object),它將在子進程運行之前被調(diào)用
close_sfs:在windows平臺下,如果close_fds被設(shè)置為True,則新創(chuàng)建的子進程將不會繼承父進程的輸入、輸出、錯誤管道。
所以不能將close_fds設(shè)置為True同時重定向子進程的標(biāo)準(zhǔn)輸入、輸出與錯誤(stdin, stdout, stderr)。
shell:同上
cwd:用于設(shè)置子進程的當(dāng)前目錄
env:用于指定子進程的環(huán)境變量。如果env = None,子進程的環(huán)境變量將從父進程中繼承。
universal_newlines:不同系統(tǒng)的換行符不同,True -> 同意使用 \n
startupinfo與createionflags只在windows下有效
將被傳遞給底層的CreateProcess()函數(shù),用于設(shè)置子進程的一些屬性,如:主窗口的外觀,進程的優(yōu)先級等等
終端輸入的命令分為兩種:
輸入即可得到輸出,如:ifconfig
輸入進行某環(huán)境,依賴再輸入,如:python
2.9 re模塊
3.對象編程
3.1面向過程和面向?qū)ο?/p>
編程范式
編程是 程序 員 用特定的語法+數(shù)據(jù)結(jié)構(gòu)+算法組成的代碼來告訴計算機如何執(zhí)行任務(wù)的過程 , 一個程序是程序員為了得到一個任務(wù)結(jié)果而編寫的一組指令的集合,正所謂條條大路通羅馬,實現(xiàn)一個任務(wù)的方式有很多種不同的方式, 對這些不同的編程方式的特點進行歸納總結(jié)得出來的編程方式類別,即為編程范式。 不同的編程范式本質(zhì)上代表對各種類型的任務(wù)采取的不同的解決問題的思路, 大多數(shù)語言只支持一種編程范式,當(dāng)然也有些語言可以同時支持多種編程范式。 兩種最重要的編程范式分別是面向過程編程和面向?qū)ο缶幊獭?/p>
面向過程編程(Procedural Programming)
Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
面向過程編程依賴 - 你猜到了- procedures,一個procedure包含一組要被進行計算的步驟, 面向過程又被稱為top-down languages, 就是程序從上到下一步步執(zhí)行,一步步從上到下,從頭到尾的解決問題 。基本設(shè)計思路就是程序一開始是要著手解決一個大的問題,然后把一個大問題分解成很多個小問題或子過程,這些子過程再執(zhí)行的過程再繼續(xù)分解直到小問題足夠簡單到可以在一個小步驟范圍內(nèi)解決。
面向?qū)ο缶幊?/p>
OOP編程是利用“類”和“對象”來創(chuàng)建各種模型來實現(xiàn)對真實世界的描述,使用面向?qū)ο缶幊痰脑蛞环矫媸且驗樗梢允钩绦虻木S護和擴展變得更簡單,并且可以大大提高程序開發(fā)效率 ,另外,基于面向?qū)ο蟮某绦蚩梢允顾烁尤菀桌斫饽愕拇a邏輯,從而使團隊開發(fā)變得更從容。
面向?qū)ο蟮膸讉€核心特性如下
Class 類
一個類即是對一類擁有相同屬性的對象的抽象、藍(lán)圖、原型。在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法
Object 對象
一個對象即是一個類的實例化后實例,一個類必須經(jīng)過實例化后方可在程序中調(diào)用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同
Encapsulation 封裝
在類中對數(shù)據(jù)的賦值、內(nèi)部調(diào)用對外部用戶是透明的,這使類變成了一個膠囊或容器,里面包含著類的數(shù)據(jù)和方法
Inheritance 繼承
一個類可以派生出子類,在這個父類里定義的屬性、方法自動被子類繼承
Polymorphism 多態(tài)
多態(tài)是面向?qū)ο蟮闹匾匦?簡單點說:“一個接口,多種實現(xiàn)”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現(xiàn),這就是同一種事物表現(xiàn)出的多種形態(tài)。
編程其實就是一個將具體世界進行抽象化的過程,多態(tài)就是抽象化的一種體現(xiàn),把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的對象發(fā)出相同的消息將會有不同的行為。比如,你的老板讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術(shù)人員說:“開始技術(shù)工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至于每個員工,當(dāng)然會各司其職,做各自的工作。
多態(tài)允許將子類的對象當(dāng)作父類的對象使用,某父類型的引用指向其子類型的對象,調(diào)用的方法是該子類型的方法。這里引用和調(diào)用方法的代碼編譯前就已經(jīng)決定了,而引用所指向的對象可以在運行期間動態(tài)綁定
3.2面向?qū)ο缶幊?/p>
對于編程語言的初學(xué)者來講,OOP不是一個很容易理解的編程方式,大家雖然都按老師講的都知道OOP的三大特性是繼承、封裝、多態(tài),并且大家也都知道了如何定義類、方法等面向?qū)ο蟮某S谜Z法,但是一到真正寫程序的時候,還是很多人喜歡用函數(shù)式編程來寫代碼,特別是初學(xué)者,很容易陷入一個窘境就是“我知道面向?qū)ο?#xff0c;我也會寫類,但我依然沒發(fā)現(xiàn)在使用了面向?qū)ο蠛?#xff0c;對我們的程序開發(fā)效率或其它方面帶來什么好處,因為我使用函數(shù)編程就可以減少重復(fù)代碼并做到程序可擴展了,為啥子還用面向?qū)ο?#xff1f;”。 對于此,我個人覺得原因應(yīng)該還是因為你沒有充分了解到面向?qū)ο竽軒淼暮锰?#xff0c;今天我就寫一篇關(guān)于面向?qū)ο蟮娜腴T文章,希望能幫大家更好的理解和使用面向?qū)ο缶幊獭?/p>
無論用什么形式來編程,我們都要明確記住以下原則:
寫重復(fù)代碼是非常不好的低級行為
你寫的代碼需要經(jīng)常變更
開發(fā)正規(guī)的程序跟那種寫個運行一次就扔了的小腳本一個很大不同就是,你的代碼總是需要不斷的更改,不是修改bug就是添加新功能等,所以為了日后方便程序的修改及擴展,你寫的代碼一定要遵循易讀、易改的原則(專業(yè)數(shù)據(jù)叫可讀性好、易擴展)。
3.3 面向?qū)ο蟮奶匦?/p>
封裝
繼承
多態(tài)
4.領(lǐng)域模型
領(lǐng)域模型,顧名思義,就是需求所涉及的領(lǐng)域的一個建模,更通俗的講法是業(yè)務(wù)模型。 參考百度百科(http://baike.baidu.cn/view/757895.htm?),領(lǐng)域模型定義如下:
從這個定義我們可以看出,領(lǐng)域模型有兩個主要的作用:
發(fā)掘重要的業(yè)務(wù)領(lǐng)域概念
建立業(yè)務(wù)領(lǐng)域概念之間的關(guān)系
領(lǐng)域建模三字經(jīng)
領(lǐng)域模型如此重要,很多同學(xué)可能會認(rèn)為領(lǐng)域建模很復(fù)雜,需要很高的技巧。然而事實上領(lǐng)域建模非常簡 單,簡單得有點難以讓人相信,領(lǐng)域建模的方法概括一下就是“找名詞”! 許多同學(xué)看到這個方法后估計都會笑出來:太假了吧,這么簡單,找個初中生都會啊,那我們公司那些分 析師和設(shè)計師還有什么用哦?
分析師和設(shè)計師當(dāng)然有用,后面我們會看到,即使是簡單的找名詞這樣的操作,也涉及到分析和提煉,而 不是簡單的摘取出來就可,這種情況下分析師和設(shè)計師的經(jīng)驗和技能就能夠派上用場了。但領(lǐng)域模型分析 也確實相對簡單,即使沒有豐富的經(jīng)驗和高超的技巧,至少也能完成一個能用的領(lǐng)域模型。
雖然我們說“找名詞”很簡單,但一個關(guān)鍵的問題還沒有說明:從哪里找? 如果你還記得領(lǐng)域模型是“需求到面向?qū)ο蟮臉蛄骸?那么你肯定一下子就能想到:從需求模型中找,具 體來說就是從用例中找。
歸納一下域建模的方法就是“從用例中找名詞”。 當(dāng)然,找到名詞后,為了能夠更加符合面向?qū)ο蟮囊蠛吞攸c,我們還需要對這些名詞進一步完善,這就 是接下來的步驟:加屬性,連關(guān)系!
最后我們總結(jié)出領(lǐng)域建模的三字經(jīng)方法:找名詞、加屬性、連關(guān)系。
總結(jié)
以上是生活随笔為你收集整理的python最常用的编程方式是什么_python常用模块和对象编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机软件名称用什么符号,[计算机软件及
- 下一篇: python 计时_Python tim