剛接觸python,看到好多案例都有這句代碼if __name__ == "__main__":,試着去掉後,結果依然能出來,好像沒啥用似的。經查閱調試,總算搞清了緣由,順帶着還搞懂了兩種模塊導入的用法區别。
if __name__ == "__main__":代碼作用:當.py文件被當做模塊被其他文件引用時,文件裡的if __name__ == "__main__":代碼能使其内部的代碼避免被執行。舉例來說:上篇介紹乘法口訣對齊的代碼,文件名為:kj.py,具體代碼為:
def cfkj(num1, num2): for i in range(num1, num2 1): print() print('%*d: ' % (len(str(num2)), i), end="") for j in range(num1, i 1): print('%-d*%-d=%-*d' % (j, i, len(str(num2*num2)), i*j), end=' '*(len(str(num2)) 2-len(str(i)))) if __name__ == "__main__": strer = input('輸入起止數字,中間用"-"隔開:') beginer = int(strer[:strer.find("-")]) ender = int(strer[strer.find("-") 1:]) cfkj(beginer, ender) print()
上面的代碼中,最後5條代碼即為if __name__ == "__main__":内部的代碼,如果隻是使用這個文件生成乘法口訣,其中的if __name__ == "__main__":代碼确實沒什麼用,删掉也不受影響。
但是,當我在另外的文件裡,也想得到乘法口訣時(比如得到1到6之間的乘法口訣)。我們不必重新寫一遍上面的代碼,而是直接用import将上面kj.py文件導入,就可以了。代碼為:
import kj kj.cfkj(1,6)
第一句import kj,是導入kj.py文件的意思,其中後綴.py省略不寫。
第二句kj.cfkj.(1,6),是使用kj.py文件裡的cfkj(1,6)模塊,執行得到乘法口訣。程序運行全部完成。
但是,如果我們kj.py文件裡删掉了if __name__ == "__main__":代碼,同樣的代碼運行效果為:
說明,由于缺少了if __name__ == "__main__":代碼,則程序首先執行kj文件裡cfkj模塊下面的代碼,然後再執行kj.cfkj(1,6),于是得到了上面的兩遍結果。所以,在代碼被其他文件引用時,if __name__ == "__main__":語句能避免不必要的代碼運行,是很有用的。
import導入和from** import **導入python提供了強大的導入功能,通過import可輕松将标準庫、他人寫的文件或自己寫的文件導入到當前文件,省去重複寫碼的麻煩。比如上面的例子,通過import,2句代碼就實現了乘法口訣。
但是,我們也經常看到,導入其他模塊庫時,除了用import,還有from openpyxl import Workbook這種樣式。他們之間有有什麼區别呢?我們還是用上面的例子來看。
我們把上面的生成1-6乘法表的代碼改為下面的代碼,效果是一樣的。
from kj import cfkj cfkj(1, 6)
意思就是,從kj.py文件裡導入cfkj模塊,文件内其他的模塊不進行導入。可以理解為:用from ** import **進行導入是當我們明确知道需用到模塊名時,采用的針對性導入,避免将文件全部導入,提高效率。
當用from ** import **導入時,使用模塊時模塊前面不用再加上文件名。比如上面如果還寫成:
from kj import cfkj kj.cfkj(1, 6)
則會報錯,删掉kj.就可以了。這樣一看,導入模塊時,最好采用from ** import **方式,至少還可以避免後面用到模塊時總要加上文件名。
學習打卡第2篇,歡迎大俠指點!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!