【Python】main函數 if __name__=='__main__' 詳解

引言

我們先看下各個編程語言的代碼框架輸出Hello,World

C

#include <stdio.h>
int main()
{
	printf("Hello, World! \n");

	return 0;
}

C++

#include<iostream>
using namespace std;
int main()
{
 	cout<<"HELLO WORLD"<<endl;
 	return 0;
}

JAVA

public class HelloWorld{

        public static void main(String[] arr){
            System.out.print("Hello World");
        }

    }

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write(" World!");
        }
    }
}

Python

print('Hello,World') 

我們可以看到Python僅僅用了一行代碼即可完成其他編程語言多行的輸出Hello,World 其他的編程語言像C/C++/C#/JAVA 等 都會有一個main主函數的框架 所有的代碼都是在該框架下運行的,有且只能有一個main主函數
代碼從 main() 函數開始執行

但是:

Python不需要Main函數也能執行

Python不同於其他編程語言,Python是解釋性語言,不需要先編譯成二進制語言,再執行。Python是動態,是從上至下逐行解釋運行。只要有正確的代碼,python便可以執行該文件

程序入口:

很多的的編程語言像C/C++/C#/JAVA 等 都會有一個main主函數 作爲程序入口,程序從main()主函數的第一句代碼開始執行,直到main函數的最後一句代碼程序運行結束

而Python 因爲它屬於腳本語言,不像編譯型語言那樣先將程序編譯成二進制再運行,而是動態的逐行解釋運行。也就是從腳本第一行開始運行,沒有統一的入口,直到腳本的最後一行。



在瞭解了這些以後,我們再來看下下方的案例

案例:

編寫一個測試模塊test.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

' a test module '

def addFunc(a,b):  
    return a+b  

print('test :1+1的計算結果:',addFunc(1,1))


再寫一個新的mode.py文件來調用上方模塊

import test

print('調用test模塊執行的結果是:',test.addFunc(12,23))

運行test.py文件 正常運行
在這裏插入圖片描述
運行mode.py文件
可以看到 test.py 中的測試代碼也被執行了一遍
在這裏插入圖片描述

顯然,當運行mode.py後第一句結果並不是調用者所需要的,爲了解決這一問題,Python提供了一個系統變量: __ name __
這時我們修改一下test.py的代碼

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

' a test module '

def addFunc(a,b):  
    return a+b

if __name__=='__main__':
    print('test :1+1的計算結果:',addFunc(1,1))

再次運行test.py 程序正常運行
在這裏插入圖片描述

這時再運行mode.py 發現程序運行結果正確
在這裏插入圖片描述

詳解:

一個python的文件有兩種使用的方法:

  • 1,直接作爲腳本執行。
  • 2,import到其他的python腳本(.py文件)中導入被作爲模塊調用執行

if name == ‘main’: 的作用就是控制這兩種情況執行代碼的過程,在if name == ‘main’: 下的代碼只有在第一種情況下(即文件作爲腳本直接執行)纔會被執行,而import到其他腳本中作爲模塊使用是不會被執行的。

簡單來說:

if __ name __ == ’ __ main __'的意思是:當.py文件被直接運行時,if __ name __== ’ __ main __'之下的代碼塊將被運行;
當.py文件以模塊形式被導入時,if __ _name __== ’ __ main __'之下的代碼塊不被運行。



__ name __

那麼if __ name __ == ’ __ main __’ 這句代碼具體是怎麼實現的呢

__name__ 是系統內置變量,用於表示當前模塊的名字,即所在文件名


1 當Pyhon模塊直接運行時,__name__的值爲“main”;

在這裏插入圖片描述
2 當模塊被導入到其他文件作爲import模塊使用時, 該模塊的__ name __爲模塊本身的名字 比如上方的test.py 作爲模塊被 mode.py引用時 test.py的 __ name __值就是 test

也就是說:
__name__有2個取值:

  • 當模塊是被調用執行的,取值爲模塊的名字;
  • 當模塊是直接執行的,則該變量取值爲:__ main __

if name == ‘main’: 這句話的核心無非就是在判斷該程序文件是否作爲主程序入口。如果直接運行該程序文件,該文件作爲主程序入口,name == ‘main’ 主程序 。
如果在運行主程序的時候調用其他程序文件,其他程序入口name != ‘main’ 自然就不等於main主程序 。

對於Python的模塊講解 可以參考這篇文章
【Python】模塊詳解/如何安裝模塊的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章