有关代码的机理有很多不同之处, “如何” 但对我而言,除非我理解“为什么” , 否则这些都说不通。 这应该对新的程序员有特别的帮助。
获取文件“ ab. py ” :
def a():
print('A function in ab file');
a()
第二个文件“xy.py”:
import ab
def main():
print('main function: this is where the action is')
def x():
print ('peripheral task: might be useful in other projects')
x()
if __name__ == "__main__":
main()
这个代码到底在干嘛?
执行时执行xy.py
, 您 , 您import ab
。导入语句在导入时立即运行模块,因此ab
业务在剩余时间之前完成xy
完成后ab
,它继续xy
.
口译员跟踪脚本运行的脚本__name__
。当您运行一个脚本时,不管你叫什么,口译员都叫它"__main__"
,使它成为在运行外部脚本后返回的主人或“家”脚本。
任何其它的脚本 从这里调用"__main__"
将其文件名指定为脚本__name__
(例如,__name__ == "ab.py"
因此,线线if __name__ == "__main__":
是口译员的测试, 以确定它是否在解释/ 区分最初执行的“ 家” 脚本, 或者它是否临时偷看另一个( 外部) 脚本。 这让程序员具有灵活性, 如果直接执行的话, 脚本行为会有所不同 。
让我们跨过上面的代码 来理解发生了什么, 首先关注未缩入的行和它们出现在脚本中的顺序。 记住这个函数 - 或者def
翻译会说,如果自己自欺欺人的话:
- 打开 xy.py 作为“ home” 文件; 调用它
"__main__"
和在__name__
变量。
- 导入并打开文件
__name__ == "ab.py"
.
- 哦,一个功能,我会记住的
- Ok, 函数函数
a()
; 我刚学到了这一点。打印ab 文件中的函数'.
- 文件结束; 返回到
"__main__"
!
- 哦,一个功能,我会记住的
- 再来一个
- 函数职能职能职能职能职能职能职能职能
x()
; OK, 打印 '外围任务:在其他项目中可能有用'.
- 这是什么?
if
条件已经满足(变量__name__
设定为"__main__"
),所以我将进入main()
函数和打印main 函数:这是动作所在位置'.
底下两行的意思是: "如果这是"__main__"
或“ home” 脚本, 执行调用的函数main()
这就是为什么你会看到def main():
上方块块, 包含脚本功能的主流 。
为什么要执行这一规定?
还记得我之前说过的进口对帐单吗 ? 当您导入一个模块时, 它不只是“ 承认” 它, 等待进一步的指示 - 它实际上运行脚本中包含的所有可执行操作 。 所以, 将您的脚本中的肉输入到脚本中 。main()
功能有效隔离它, 将其隔离, 这样它不会在被其它脚本导入时立即运行 。
同样,也有例外,但通常的做法是:main()
通常不会在外部被调用。所以你可能想知道一件事: 如果我们不打电话,main()
, 为什么我们要调用剧本? 这是因为许多人用独立的功能构建剧本结构, 这些功能是用来独立运行的, 独立于文件的其余代码。 他们后来在剧本的正文中被调用到别的地方。 这让我想到:
但是没有它 代码是有效的
是的,没错,这些独立的功能能够被调自一个内线脚本, 它不包含在main()
函数。如果您习惯(像我一样,在编程的早期学习阶段) 建立内部脚本, 来做你需要的, 你会试着再弄清楚, 如果你需要操作的话... 好吧, 你对代码的这种内部结构并不习惯, 因为它更复杂, 并且没有直观的阅读能力。
但是,这个剧本可能无法将其功能外部命名, 因为如果它真的存在的话, 它会立即开始计算和分配变量。如果你试图重新使用一个函数, 你的新剧本就会与旧剧本紧密相连, 而旧剧本会互相冲突。
分离独立函数时, 您可以通过将您先前的作品调用为另一个脚本来重新使用您之前的工作 。 例如, “ example. py” 可能会导入“ Xy. py” 并调用x()
,使用“xy.py”中的“x”函数(也许它正在将给定文本字符串的第三个字数化为资本化;从数字列表中创建 NumPy 阵列并进行排列;或解开3D表面。可能性是无限的。)
(以物配主者,问题 本问题@ kindall 的回答, 终于帮助我理解为什么, 而不是如何。 不幸的是, 它被标记为重复这个我认为这是一个错误。 )