Python中if?__name__?==?“__main__“的作用總結(jié)
這行代碼在Python中非常常見,它的作用是:判斷當(dāng)前模塊是否被直接運(yùn)行,而不是被導(dǎo)入到其他模塊中。
語法解析
if __name__ == "__main__":
# 這里的代碼只在直接運(yùn)行該文件時(shí)執(zhí)行
main()
__name__是Python的一個(gè)內(nèi)置變量- 當(dāng)文件被直接運(yùn)行時(shí),
__name__的值為"__main__" - 當(dāng)文件被導(dǎo)入時(shí),
__name__的值為模塊名(文件名)
不加它會(huì)有什么問題?
1. 模塊被導(dǎo)入時(shí)執(zhí)行不必要的代碼
沒有使用 if __name__ == "__main__": 的情況:
# module.py
def useful_function():
print("這是一個(gè)有用的函數(shù)")
print("模塊被加載了!") # 這行在導(dǎo)入時(shí)就會(huì)執(zhí)行
useful_function() # 這也會(huì)在導(dǎo)入時(shí)執(zhí)行
# 另一個(gè)文件:main.py
import module # 導(dǎo)入時(shí)就會(huì)立即打印"模塊被加載了!"并執(zhí)行函數(shù)
使用 if __name__ == "__main__": 的情況:
# module.py
def useful_function():
print("這是一個(gè)有用的函數(shù)")
if __name__ == "__main__":
print("模塊被直接運(yùn)行!")
useful_function()
# main.py
import module # 不會(huì)執(zhí)行任何打印,除非顯式調(diào)用 module.useful_function()
2. 測(cè)試代碼會(huì)被意外執(zhí)行
# 沒有保護(hù)的情況
def add(a, b):
return a + b
# 測(cè)試代碼
result = add(2, 3) # 導(dǎo)入時(shí)就會(huì)執(zhí)行測(cè)試!
print(f"測(cè)試結(jié)果: {result}")
# 有保護(hù)的情況
def add(a, b):
return a + b
if __name__ == "__main__":
# 測(cè)試代碼只在直接運(yùn)行時(shí)執(zhí)行
result = add(2, 3)
print(f"測(cè)試結(jié)果: {result}")
3. 初始化操作無法控制
# 不好的寫法
print("程序啟動(dòng)中...")
initialize_database() # 導(dǎo)入時(shí)就會(huì)初始化數(shù)據(jù)庫!
start_web_server()
# 好的寫法
def main():
print("程序啟動(dòng)中...")
initialize_database()
start_web_server()
if __name__ == "__main__":
main() # 只有直接運(yùn)行時(shí)才啟動(dòng)程序
最佳實(shí)踐
def function1():
pass
def function2():
pass
def main():
"""主函數(shù),包含程序的主要邏輯"""
function1()
function2()
if __name__ == "__main__":
# 這里可以添加命令行參數(shù)解析、異常處理等
main()
總結(jié)
不加 if __name__ == "__main__": 的主要問題是:
- 模塊被導(dǎo)入時(shí)會(huì)執(zhí)行測(cè)試代碼和初始化代碼
- 代碼的可重用性降低
- 可能出現(xiàn)意外的副作用
加上它可以確保:
- 模塊既可以作為腳本直接運(yùn)行
- 也可以被其他模塊安全導(dǎo)入
- 提高了代碼的模塊化和可重用性
在Python中,if __name__ == "__main__": 這行代碼用于檢查當(dāng)前模塊是否被直接運(yùn)行,而不是被導(dǎo)入到其他模塊中。
解釋:
每個(gè)Python模塊(一個(gè).py文件)都有一個(gè)內(nèi)置的變量__name__。
當(dāng)模塊被直接執(zhí)行時(shí),__name__的值被設(shè)置為"__main__"。
當(dāng)模塊被導(dǎo)入到其他模塊時(shí),__name__的值則是模塊的名字(即文件名,不帶.py后綴)。
因此,這行代碼下面的代碼塊只會(huì)在該模塊被直接運(yùn)行時(shí)執(zhí)行,而當(dāng)該模塊被導(dǎo)入時(shí)不會(huì)執(zhí)行。
不加它的問題:
如果這個(gè)模塊既可以被其他模塊導(dǎo)入使用,也可以直接運(yùn)行,那么沒有這個(gè)條件判斷,當(dāng)被導(dǎo)入時(shí),那些不希望被執(zhí)行的代碼(例如測(cè)試代碼、主程序等)也會(huì)被執(zhí)行,這可能導(dǎo)致意想不到的行為。
通常,我們將模塊的主要功能封裝成函數(shù)或類,然后在if name == “main”:下面調(diào)用這些函數(shù)或類來運(yùn)行程序。這樣,當(dāng)模塊被導(dǎo)入時(shí),這些調(diào)用不會(huì)執(zhí)行,而模塊中的函數(shù)和類可以被其他模塊使用。
示例:
假設(shè)我們有一個(gè)模塊mymodule.py,內(nèi)容如下:
def my_function():
print("Hello from my_function!")
print("This is a top-level print statement")
if __name__ == "__main__":
print("This code runs only when the module is executed directly")
my_function()
情況1:直接運(yùn)行mymodule.py
輸出:
This is a top-level print statement This code runs only when the module is executed directly Hello from my_function!
情況2:在另一個(gè)模塊中導(dǎo)入mymodule:
import mymodule
輸出:
This is a top-level print statement
可以看到,不加條件判斷的print語句在導(dǎo)入時(shí)也會(huì)執(zhí)行,而條件判斷內(nèi)的代碼只在直接運(yùn)行時(shí)執(zhí)行。
因此,使用if __name__ == "__main__":可以讓我們寫出既可以被導(dǎo)入又可以直接運(yùn)行的模塊,并且不會(huì)在導(dǎo)入時(shí)執(zhí)行不必要的代碼。
到此這篇關(guān)于Python中if __name__ == “__main__“作用總結(jié)的文章就介紹到這了,更多相關(guān)Python中if __name__ == “__main__“內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python中if __name__ == "__main__"詳細(xì)解釋
- 正確理解Python中if __name__ == ''__main__''
- Python中if?__name__==‘__main__‘用法詳情
- Python中if __name__ == ''__main__''作用解析
- 聊聊Python代碼中if?__name__?==?‘__main__‘的作用是什么
- 關(guān)于Python中的if __name__ == __main__詳情
- 一篇文章徹底弄懂Python中的if?__name__?==?__main__
- 深入理解python中if?__name__?==?‘__main__‘
相關(guān)文章
Python之標(biāo)點(diǎn)符號(hào)string.punctuation的使用
Python的string模塊提供了一個(gè)方便的屬性string.punctuation,其中包含所有ASCII標(biāo)點(diǎn)符號(hào)字符,這使得在處理和識(shí)別字符串中的標(biāo)點(diǎn)符號(hào)時(shí)非常有用,可以通過簡(jiǎn)單的in關(guān)鍵字來檢測(cè)字符是否為標(biāo)點(diǎn)2024-09-09
pytorch實(shí)現(xiàn)用CNN和LSTM對(duì)文本進(jìn)行分類方式
今天小編就為大家分享一篇pytorch實(shí)現(xiàn)用CNN和LSTM對(duì)文本進(jìn)行分類方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python的Django框架中的select_related函數(shù)對(duì)QuerySet 查詢的優(yōu)化
這篇文章主要介紹了Python的Django框架中的select_related函數(shù)對(duì)QuerySet查詢的優(yōu)化,以減少數(shù)據(jù)庫的查詢次數(shù)為目的,需要的朋友可以參考下2015-04-04
pandas中DataFrame字典互轉(zhuǎn)的實(shí)現(xiàn)
在數(shù)據(jù)處理和分析中,Pandas是一個(gè)非常強(qiáng)大的Python庫,本文主要介紹了pandas中DataFrame字典互轉(zhuǎn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04
Python中常用國(guó)內(nèi)鏡像源的下載與使用指南
在國(guó)內(nèi)使用 Python 的包管理工具(如 pip 和 conda)時(shí),由于網(wǎng)絡(luò)連接問題,直接從官方源下載包可能會(huì)非常緩慢甚至失敗,使用國(guó)內(nèi)鏡像源可以顯著提高下載速度和穩(wěn)定性,下面小編就和大家詳細(xì)講講常用國(guó)內(nèi)鏡像源的下載與使用吧2025-11-11
使用pyqt5搭建yolo3目標(biāo)識(shí)別界面的方法
這篇文章主要介紹了使用pyqt5搭建yolo3目標(biāo)識(shí)別界面的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
剛學(xué)完怎么用Python實(shí)現(xiàn)定時(shí)任務(wù),轉(zhuǎn)頭就跑去撩妹!
朋友問我有沒有定時(shí)任務(wù)的模塊,并且越簡(jiǎn)單越好.剛好前今天就研究了一下定時(shí)任務(wù)模塊,于是就告訴他使用方式,令我沒有想到的是,這貨他學(xué)會(huì)了之后,居然買了一個(gè)服務(wù)器給女朋友發(fā)消息,發(fā)消息,發(fā)消息……重要的事情說三遍,需要的朋友可以參考下2021-06-06

