__name__ == '__main__'?是什么意思沛励?
很多人學(xué)習(xí)python,不知道從何學(xué)起氓英。
很多人學(xué)習(xí)python侯勉,掌握了基本語(yǔ)法過(guò)后,不知道在哪里尋找案例上手铝阐。
很多已經(jīng)做案例的人,卻不知道如何去學(xué)習(xí)更加高深的知識(shí)铐拐。
那么針對(duì)這三類人徘键,我給大家提供一個(gè)好的學(xué)習(xí)平臺(tái),免費(fèi)領(lǐng)取視頻教程遍蟋,電子書籍吹害,以及課程的源代碼!??¤
QQ群:1057034340
通常虚青,在每個(gè)Python項(xiàng)目中它呀,我們都會(huì)看到上面的語(yǔ)句。所以它到底是干什么的棒厘,我們?cè)谶@里就要明白了纵穿。
簡(jiǎn)單地說(shuō),在Python中奢人,?__name__?是一個(gè)特殊的變量谓媒,它告訴我們模塊的名稱。無(wú)論何時(shí)直接運(yùn)行python文件何乎,它都會(huì)在執(zhí)行實(shí)際代碼之前設(shè)置一些特殊變量句惯。?__name__?是一個(gè)特殊變量。根據(jù)以下幾點(diǎn)確定?__name__?變量的值-
如果直接運(yùn)行python文件支救,?__name__?會(huì)將名稱設(shè)置為?main?抢野。
如果你將一個(gè)模塊導(dǎo)入另一個(gè)文件中,?__name__?會(huì)將該名稱設(shè)置為模塊名各墨。
__name__'__main__'
first_module.py.直接運(yùn)行
first_module.py從其他模塊導(dǎo)入
輸出
Infirst_module.py, RunningfromImportInsecond_module.py. Secondmodule’s name: main
上面的示例中指孤,你可以看到,當(dāng)你在另一個(gè)python文件中導(dǎo)入第一個(gè)模塊時(shí)欲主,它將進(jìn)入else條件邓厕,因?yàn)槟K的名稱不是main逝嚎。但是,在second_module.py详恼,名字仍然是main补君。
所以我們?cè)谙旅娴臈l件下使用了
當(dāng)我們想執(zhí)行某些特定任務(wù)時(shí),我們可以直接調(diào)用這個(gè)文件昧互。
如果模塊被導(dǎo)入到另一個(gè)模塊中挽铁,而我們不想執(zhí)行某些任務(wù)時(shí)。
最好是創(chuàng)建一個(gè)main方法敞掘,并在?if __name__ == __main__?內(nèi)部調(diào)用叽掘。因此,如果需要玖雁,你仍然可以從另一個(gè)模塊調(diào)用main方法更扁。
我們?nèi)匀豢梢酝ㄟ^(guò)顯式調(diào)用main方法來(lái)調(diào)用另一個(gè)模塊的main方法,因?yàn)閙ain方法應(yīng)該存在于第一個(gè)模塊中赫冬。
出了問(wèn)題怎么辦
Python中的異常處理
當(dāng)我們用任何編程語(yǔ)言編寫任何程序時(shí)浓镜,有時(shí)即使語(yǔ)句或表達(dá)式在語(yǔ)法上是正確的,也會(huì)在執(zhí)行過(guò)程中出錯(cuò)劲厌。在任何程序執(zhí)行過(guò)程中檢測(cè)到的錯(cuò)誤稱為異常膛薛。
Python中用于處理錯(cuò)誤的基本術(shù)語(yǔ)和語(yǔ)法是try和except語(yǔ)句〔贡牵可以導(dǎo)致異常發(fā)生的代碼放在try塊中哄啄,異常的處理在except塊中實(shí)現(xiàn)。python中處理異常的語(yǔ)法如下-
try 和except
try:? 做你的操作…? ...exceptExceptionI:? 如果有異常ExceptionI风范,執(zhí)行這個(gè)塊咨跌。exceptExceptionII:? 如果有異常ExceptionII,執(zhí)行這個(gè)塊乌企。? ...else:? 如果沒有異常虑润,則執(zhí)行此塊。finally:? 無(wú)論是否有異常加酵,此塊都將始終執(zhí)行
讓我們用一個(gè)例子來(lái)理解這一點(diǎn)拳喻。在下面的示例中,我將創(chuàng)建一個(gè)計(jì)算數(shù)字平方的函數(shù)猪腕,以便計(jì)算平方冗澈,該函數(shù)應(yīng)始終接受一個(gè)數(shù)字(本例中為整數(shù))。但是用戶不知道他/她需要提供什么樣的輸入陋葡。當(dāng)用戶輸入一個(gè)數(shù)字時(shí)亚亲,它工作得很好,但是如果用戶提供的是字符串而不是數(shù)字,會(huì)發(fā)生什么情況呢捌归。
defacceptInput():num = int(input("Please enter an integer: "))? ? print("Sqaure of the the number {} is {}".format(num, num*num))? ? acceptInput()
Please enter aninteger:5Sqaureofthe the number5is25
它拋出一個(gè)異常肛响,程序突然結(jié)束。因此惜索,為了優(yōu)雅地執(zhí)行程序特笋,我們需要處理異常。讓我們看看下面的例子-
defacceptInput():try:? ? ? ? num = int(input("Please enter an integer: "))exceptValueError:? ? ? ? print("Looks like you did not enter an integer!")? ? ? ? num = int(input("Try again-Please enter an integer: "))finally:? ? ? ? print("Finally, I executed!")? ? ? ? print("Sqaure of the the number {} is {}".format(num, num*num))? ? ? ? acceptInput()
Please enter aninteger: fiveLookslikeyou didnotenter aninteger!Tryagain-Please enter aninteger:4Finally, I executed!Sqaureofthe the number4is16
這樣巾兆,我們就可以提供邏輯并處理異常猎物。但在同一個(gè)例子中,如果用戶再次輸入字符串值角塑。那會(huì)發(fā)生什么蔫磨?
所以在這種情況下,最好在循環(huán)中輸入圃伶,直到用戶輸入一個(gè)數(shù)字堤如。
defacceptInput():whileTrue:try:? ? ? ? ? ? num = int(input("Please enter an integer: "))exceptValueError:? ? ? ? ? ? print("Looks like you did not enter an integer!")continueelse:? ? ? ? ? ? print("Yepie...you enterted integer finally so breaking out of the loop")breakprint("Sqaure of the the number {} is {}".format(num, num*num))? ? ? ? acceptInput()
Please enter aninteger: sixLookslikeyou didnotenter aninteger!Please enter aninteger: fiveLookslikeyou didnotenter aninteger!Please enter aninteger: fourLookslikeyou didnotenter aninteger!Please enter aninteger:7Yepie...you entertedintegerfinallyso breaking outoftheloopSqaureofthe the number7is49
如何處理多個(gè)異常
可以在同一個(gè)try except塊中處理多個(gè)異常。你可以有兩種方法-
在同一行中提供不同的異常窒朋。示例:ZeroDivisionError煤惩,NameError :
提供多個(gè)異常塊。當(dāng)你希望為每個(gè)異常提供單獨(dú)的異常消息時(shí)炼邀,這很有用。示例:
exceptZeroDivisionErrorase:? ? print(“Divide by zero exception occurred!, e)exceptNameErrorase:? ? print(“NameError occurred!, e)
在末尾包含?except Exception:block?總是很好的剪侮,可以捕捉到你不知道的任何不需要的異常拭宁。這是一個(gè)通用的異常捕捉命令,它將在代碼中出現(xiàn)任何類型的異常瓣俯。
# 處理多個(gè)異常defcalcdiv():x = input("Enter first number: ")? ? y = input("Enter second number: ")try:? ? ? ? result = int(x) / int(y)? ? ? ? print("Result: ", result)exceptZeroDivisionErrorase:? ? ? ? print("Divide by zero exception occured! Try Again!", e)exceptValueErrorase:? ? ? ? print("Invalid values provided! Try Again!", e)exceptExceptionase:? ? ? ? print("Something went wrong! Try Again!", e)finally:? ? ? ? print("Program ended.")calcdiv()
Enterfirstnumber:5Enter secondnumber:0Divide by zero exception occured! Try Again! division by zeroProgram ended.
如何創(chuàng)建自定義異常
有可能創(chuàng)建自己的異常杰标。你可以用raise關(guān)鍵字來(lái)做。
創(chuàng)建自定義異常的最佳方法是創(chuàng)建一個(gè)繼承默認(rèn)異常類的類彩匕。
這就是Python中的異常處理腔剂。你可以在這里查看內(nèi)置異常的完整列表:?https://docs.python.org/3.7/l...
如何處理文件
Python中的文件處理
Python使用文件對(duì)象與計(jì)算機(jī)上的外部文件進(jìn)行交互。這些文件對(duì)象可以是你計(jì)算機(jī)上的任何文件格式驼仪,即可以是音頻文件掸犬、圖像、文本文件绪爸、電子郵件湾碎、Excel文檔。你可能需要不同的庫(kù)來(lái)處理不同的文件格式奠货。
讓我們使用ipython命令創(chuàng)建一個(gè)簡(jiǎn)單的文本文件介褥,我們將了解如何在Python中讀取該文件。
%%writefiledemo_text_file.txthello worldi love ipythonjupyter notebookfourthlinefifthlinesixlineThisisthelastlinein thefileWriting demo_text_file.txt
打開文件
你可以用兩種方式打開文件
定義一個(gè)包含file對(duì)象的變量。在處理完一個(gè)文件之后柔滔,我們必須使用file對(duì)象方法close再次關(guān)閉它:
f = open("demo_text_file.txt","r")---f.close()
使用with關(guān)鍵字溢陪。不需要顯式關(guān)閉文件。
withopen(“demo_text_file.txt”, “r”):##讀取文件
在open方法中睛廊,我們必須傳遞定義文件訪問(wèn)模式的第二個(gè)參數(shù)形真。“r”是用來(lái)讀文件的喉前。類似地没酣,“w”表示寫入,“a”表示附加到文件卵迂。在下表中裕便,你可以看到更常用的文件訪問(wèn)模式。
讀取文件
在python中见咒,有多種方法可以讀取一個(gè)文件-
fileObj.read()=>將把整個(gè)文件讀入字符串偿衰。
fileObj.readline() =>將逐行讀取文件。
fileObj.readlines()=>將讀取整個(gè)文件并返回一個(gè)列表改览。小心使用此方法下翎,因?yàn)檫@將讀取整個(gè)文件,因此文件大小不應(yīng)太大宝当。
# 讀取整個(gè)文件print("------- reading entire file --------")withopen("demo_text_file.txt","r")asf:? ? print(f.read())# 逐行讀取文件print("------- reading file line by line --------")print("printing only first 2 lines")withopen("demo_text_file.txt","r")asf:? ? print(f.readline())? ? print(f.readline())# 讀取文件并以列表形式返回print("------- reading entire file as a list --------")withopen("demo_text_file.txt","r")asf:? ? print(f.readlines())# 使用for循環(huán)讀取文件print("\n------- reading file with a for loop --------")withopen("demo_text_file.txt","r")asf:forlinesinf:? ? ? ? print(lines)
------- reading entirefile--------hello worldi love ipythonjupyter notebookfourthlinefifthlinesixlineThisisthelastlinein thefile------- readingfilelinebyline--------printingonlyfirst2lineshello worldi love ipython------- reading entirefileasalist--------['hello world\n','i love ipython\n','jupyter notebook\n','fourth line\n','fifth line\n','six line\n','This is the last line in the file\n']------- readingfilewithaforloop --------hello worldi love ipythonjupyter notebookfourthlinefifthlinesixlineThisisthelastlinein thefile
寫文件
與read類似视事,python提供了以下2種寫入文件的方法。
fileObj.write()
fileObj.writelines()
withopen("demo_text_file.txt","r")asf_in:? ? withopen("demo_text_file_copy.txt","w")asf_out:f_out.write(f_in.read())
讀寫二進(jìn)制文件
你可以使用二進(jìn)制模式來(lái)讀寫任何圖像文件庆揩。二進(jìn)制包含字節(jié)格式的數(shù)據(jù)俐东,這是處理圖像的推薦方法。記住使用二進(jìn)制模式订晌,以“rb”或“wb”模式打開文件虏辫。
withopen("cat.jpg","rb")asf_in:? ? withopen("cat_copy.jpg","wb")asf_out:f_out.write(f_in.read())print("File copied...")
Filecopied...
有時(shí)當(dāng)文件太大時(shí),建議使用塊進(jìn)行讀刃獠Α(每次讀取固定字節(jié))砌庄,這樣就不會(huì)出現(xiàn)內(nèi)存不足異常∞仁啵可以為塊大小提供任何值娄昆。在下面的示例中,你將看到如何讀取塊中的文件并寫入另一個(gè)文件验辞。
### 用塊復(fù)制圖像withopen("cat.jpg","rb")asimg_in:? ? withopen("cat_copy_2.jpg","wb")asimg_out:chunk_size =4096img_chunk = img_in.read(chunk_size)whilelen(img_chunk) >0:? ? ? ? ? ? img_out.write(img_chunk)? ? ? ? ? ? img_chunk = img_in.read(chunk_size)print("File copied with chunks")
Filecopiedwithchunks
結(jié)論