python 入口函數(菜鳥入門)

python 入口函數(菜鳥入門)

本人 c# 出生,寫過少許 c/c++,所以一直想著有個類似 main() 函數的東西是整個程式的入口。然而,查遍了整個目錄,沒有找到任何線索,接下來就開始各種搗鼓。

最后更新 2024/3/12 上午5:24
Ironyho
预计阅读 6 分钟
分类
Python
标签
.NET C# Python 菜鳥 入口函數

前言

最近在組內研究專項項目,其中的一個現有工具是用 python 開發的,我的目標是對這款工具的流程進行優化。雖然可以找到對應的開發者了解現有流程,然後結合我的研究提出優化方案,最後讓 ta 去編碼實現。但是程式設計師心理使然,什麼東西都想自己琢磨明白,於是開啟了摸索歷程。

上網搜索資料,下載了 pycharm 開發工具,進行了一些環境配置,於是乎就開工了。由於之前沒有接觸過 python 語言,打開代碼文件夾就蒙圈了,只見一大堆 .py 文件,不知道從哪裡入手。本人 c# 出生,寫過少許 c/c++,所以一直想著有個類似 main() 函數的東西是整個程式的入口。然而,查遍了整個目錄,沒有找到任何線索,接下來就開始各種搗鼓。

需要說明的是,本文僅是一隻 python 菜鳥的學習筆記,並不一定正確或完整,歡迎大家斧正。 每每接觸新工具或新語言,都有一種莫名的欣喜,樂於用舊知識來推敲,故而載之。

順序執行

在 python 世界中,每一個 .py 文件就是一個模塊,在控制台中輸入文件名即可調用該模塊。 模塊有些類似於 批處理文件(.bat) ,其中的語句是按順序執行的。 這點和我最初的想像不一致,總想著它和 c# 等語言一樣,文件中應該由 class 來組織,實則不然。

首先,在 d 盤 根目錄創建一個名Test1.py的文件,內容如下:

print("Test1 First")
print("Test1 Second")

然後,轉到控制台,將目錄切換到 d 盤 ,啟動Test1.py模塊,結果如下:

D:\>python Test1.py
Test1 First
Test1 Second

嗯,不錯,完全符合預期,再試一下模塊間調用。 在 d 盤 中創建Test2.py文件,在其中調用Test1.py模塊:

import Test1

print("Test2 First")
print("Test2 Second")

在控制台中啟動Test2.py,輸出結果:

D:\>python Test2.py
Test1 First
Test1 Second
Test2 First
Test2 Second

可以理解的是,在 Test2.py 文件中, import Test1 语句在前面,所以在导入 Test1 模块时便执行了其中的语句,因此 Test1 中的输出在前面。 如果將 import test1 放在後面, test1 的輸出也會出現在後面:

print("Test2 First")
print("Test2 Second")

import Test1
D:\>python Test2.py
Test2 First
Test2 Second
Test1 First
Test1 Second

函數定義

模塊中的代碼能否更加靈活?除了按順序執行,還可以根據需要調用,就像 c# 語言中的函數那樣。 上文中的 print 應該就是一個內建函數,查資料,找到 pyhton 中函數的定義:

def 函数名(参数列表):
    函数体

趕緊試一下,在Test1.py中定義一個 sayhello 函數:

print("Test1 First")
print("Test1 Second")

def SayHello():
	print("Hello World")

SayHello()
print("Test1 Third")

輸出結果:

D:\>python Test1.py
Test1 First
Test1 Second
Hello World
Test1 Third

嗯,符合預期,沒毛病,按順序執行。

如果只是定義 sayhello() 函數,而沒有調用的話,是不會有 hello world 一行輸出的。

接下來,嘗試一下模塊間函數的調用,修改Test2.py文件:

import Test1

print("Test2 First")
print("Test2 Second")

Test1.SayHello()

輸出如下:

D:\>python Test2.py
Test1 First
Test1 Second
Hello World
Test1 Third
Test2 First
Test2 Second
Hello World

哈哈,對的,對的,最後一行的 hello world 即是Test2.py中的 test1.sayhello() 語句輸出的。 至於前面第三行的 hello world 嘛,那是 import test1 時由 test1 模塊輸出的。

__main__

了解了函数的定义及模块间的调用,随之而来的疑惑是,程序\模块 的入口在哪里。

搜索了一下资料,找到了 __name__ 属性。先来测试一段代码,修改 Test1.py 文件:

def SayHello():
	print("Hello World")

def SayBye():
	print("Bye World")


SayHello()

if(__name__=="__main__"):
	print("Main")

SayBye()

在控制台中直接啟動Test1.py:

D:\>python Test1.py
Hello World
Main
Bye World

嗯,还好理解,按顺序执行的,且满足了 if(__name__=="__main__") 条件,所以输出了 Main

且慢,換一種方式,通過Test2.py間接調用Test1.py試試,先修改Test2.py文件:

import Test1

print("Test2 First")
print("Test2 Second")

然後啟動Test2.py文件來看看結果:

D:\>python Test2.py
Hello World
Bye World
Test2 First
Test2 Second

纳尼,怎么没有输出 Main 呢?嗯,有点意思,找到 菜鸟教程 的解释:

每个模块都有一个 __name__ 属性,当其值是 __main__ 时,表明该模块自身在运行,否则是被引入

这个 __name__ 属性还好理解,模块的保留字段(属性),但是怎么理解这个 __main__ 呢?

这里的 __main__ 可能可以理解为程序的入口函数,模块直接被入口函数调用,则其 __name__ 属性值为 main,否则为 模块文件名

def SayHello():
	print("Hello World")

def SayBye():
	print("Bye World")


SayHello()

if(__name__=="__main__"):
	print("Main")
else:
	print(__name__)

SayBye()
D:\>python Test2.py
Hello World
Test1
Bye World
Test2 First
Test2 Second

總結

本文講了 python 模塊的一些基本特性,涉及到的知識非常粗淺,僅為記錄個人的學習過程。

每每接觸新工具或新語言,都有一種莫名的欣喜,樂於用舊知識來推敲,故而載之。

最后,引用 菜鸟教程 关于 模块 的一些重要解释:

  • 模塊除了方法定義,還可以包括可執行的代碼。這些代碼一般用來初始化這個模塊。
  • 一個模塊只會被導入一次,不管你執行了多少次 import。這樣可以防止導入模塊被一遍又一遍地執行。
  • 模塊是可以導入其他模塊的。在一個模塊的最前面使用 import 來導入一個模塊,當然這只是一個慣例,而不是強制的。
Keep Exploring

延伸阅读

更多文章
同标签 2026/2/7

aot使用經驗總結

從項目創建伊始,就應養成良好的習慣,即只要添加了新功能或使用了較新的語法,就及時進行 aot 發布測試。

继续阅读