需要说明的是,本文仅是一只 Python
菜鸟的学习笔记,并不一定正确或完整,欢迎大家斧正。
每每接触新工具或新语言,都有一种莫名的欣喜,乐于用旧知识来推敲,故而载之。
顺序执行
在 Python
世界中,每一个 .py
文件就是一个模块,在控制台中输入文件名即可调用该模块。
模块有些类似于 批处理文件(.bat)
,其中的语句是按顺序执行的。
这点和我最初的想象不一致,总想着它和 C#
等语言一样,文件中应该由 class
来组织,实则不然。
首先,在 D盘
根目录创建一个名 Test1.py
的文件,内容如下:
然后,转到控制台,将目录切换到 D盘
,启动 Test1.py
模块,结果如下:
嗯,不错,完全符合预期,再试一下模块间调用。
在 D盘
中创建 Test2.py
文件,在其中调用 Test1.py
模块:
可以理解的是,在 Test2.py
文件中, import Test1
语句在前面,所以在导入 Test1
模块时便执行了其中的语句,因此 Test1
中的输出在前面。
如果将 import Test1
放在后面, Test1
的输出也会出现在后面:
函数定义
模块中的代码能否更加灵活?除了按顺序执行,还可以根据需要调用,就像 C#
语言中的函那样。
上文中的 Print
应该就是一个内建函数,查资料,找到 Pyhton
中函数的定义:
赶紧试一下,在 Test1.py
中定义一个 SayHello
函数:
嗯,符合预期,没毛病,按顺序执行。
如果只是定义 SayHello()
函数,而没有调用的话,是不会有 Hello World
一行输出的。
接下来,尝试一下模块间函数的调用,修改 Test2.py
文件:
哈哈,对的,对的,最后一行的 Hello World
即是 Test2.py
中的 Test1.SayHello()
语句输出的。
至于前面第三行的 Hello World
嘛,那是 import Test1
时由 Test1
模块输出的。
__main__
了解了函数的定义及模块间的调用,随之而来的疑惑是,程序\模块
的入口在哪里。
搜索了一下资料,找到了 __name__
属性。先来测试一段代码,修改 Test1.py
文件:
嗯,还好理解,按顺序执行的,且满足了 if(__name__=="__main__")
条件,所以输出了 Main
。
且慢,换一种方式,通过 Test2.py
间接调用 Test1.py
试试,先修改 Test2.py
文件:
纳尼,怎么没有输出 Mani
呢?嗯,有点意思,找到 菜鸟教程 的解释:
每个模块都有一个 `__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
模块的一些基本特性,涉及到的知识非常粗浅,仅为记录个人的学习过程。
每每接触新工具或新语言,都有一种莫名的欣喜,乐于用旧知识来推敲,故而载之。