Python 入口函式(菜鳥入門)

2021-10-02 04:06:53 字數 3712 閱讀 4432

python 入口函式(菜鳥入門)

原創iron_ye 最後發布於2018-04-22 22:41:55 閱讀數 10598  收藏

展開python 入口函式(菜鳥入門)

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

順序執行

在 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 函式名(引數列表):

函式體1

2趕緊試一下,在 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

納尼,怎麼沒有輸出 mani 呢?嗯,有點意思,找到 菜鳥教程 的解釋:

每個模組都有乙個 `__name__` 屬性,當其值是 `__main__` 時,表明該模組自身在執行,否則是被引入

1這個 __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 模組的一些基本特性,涉及到的知識非常粗淺,僅為記錄個人的學習過程。

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

最後,引用 菜鳥教程 關於 模組 的一些重要解釋:

python入口函式

在乙個.py檔案中,如果不是在定義函式,也就是說不是在def關鍵字的內嵌結構內,python會預設其餘部分函式是main函式,並自動執行,但正規工程中,一般都會將main函式寫為 if name main 每個人都在寫,但很少有人問,其實這個用法很巧妙!1 2 3 4 5 6 7 8 hello.p...

python小菜鳥入門

import os os.getcwd os.chdir os.getcwd name input micheal 接下來要執行的 部分需要首行縮排4位 官方標準,3位也能執行 當字串中包含 或者 的時候需要使用轉義字元,for instance i m ok 輸出就是 i m ok 其中 n表示換...

Jquery入門基礎之入口函式

jquery相當於js的乙個庫,裡面封裝好了大量操作dom元素的方法,我們只需要學習怎麼使用和了解這些方法,用起來比js方便快捷。1 方法一 document ready function 2 方法二 function window.onload function 1 不能新增多個入口函式,只能有乙...