Python中关于_umain _u的概念查询

Python中关于_umain _u的概念查询,python,function,main,conceptual,Python,Function,Main,Conceptual,我目前正在使用Python,对函数列在\uuuuu main\uuuu中这一事实感到困惑。我一直在查看多个python脚本,试图找到一个共同的主题,即哪些函数值得在\uuuuu main\uuuuuu中占有一席之地,但没有任何效果。这里有我自己的代码示例第一个功能和 另一个函数是我的代码中仅有的两个函数 def main(argv): firstinput="" secondinput="" if len(argv) < 3 or len(argv) >

我目前正在使用Python,对函数列在
\uuuuu main\uuuu
中这一事实感到困惑。我一直在查看多个python脚本,试图找到一个共同的主题,即哪些函数值得在
\uuuuu main\uuuuuu
中占有一席之地,但没有任何效果。这里有我自己的代码示例<代码>第一个功能和
另一个函数
是我的代码中仅有的两个函数

def main(argv):

    firstinput=""
    secondinput=""

    if len(argv) < 3 or len(argv) > 3:
        print """"Please set to:
                metisfinal.main(metisfinal.py, firstinput, secondinput)""""
        return
    else:
        firstinput = argv[1]
        secondinput = argv[2]

    firstfunction(firstinput, dictionary)
    anotherfunction(list, secondinput)

if __name__ == "__main__":
    main(sys.argv)
从概念上讲,我不明白为什么没有列出所有函数。。。它们不是都需要运行吗,或者只是初始化一些东西


我在看非典型代码吗?我遗漏了
\uuuuu main\uuuuuu
的哪些关键概念?一旦我找到了要放入
\uuuuu main\uuuuu
的函数,是否有一种特定的方式来格式化它们?

不清楚“列出在
\uuuuu main\uuuu
中”是什么意思<代码>\uuuu main\uuuu不是源文件中的实体。相反,如果直接执行,它是模块的名称。当您执行
时,如果&uuuuuu name\uuuuu==“\uuuuuu main\uuuuuu”
,则告诉Python在该块中执行代码,如果且仅当代码作为主模块执行时,也就是说,如果它是正在运行的程序。如果模块是从另一个模块导入的,
如果_uname__==“_umain__;”
块中的代码将不会运行

请注意,您没有在该if块中“列出”函数。相反,您将常规程序代码放入要运行的块中。这段代码通常只调用一个函数。人们通常调用该函数
main()
。但是
\uuuu main\uuu
main
之间没有特殊的关系。您可以随意调用该函数:

def snicklefritz():
    # This function will be run when you run the program
    print "You ran the program!"

if __name__ == "__main__":
    snicklefritz()
尝试运行此程序(例如,将其保存为“snicklefritz.py”,然后从命令行执行
python snicklefritz.py
)。您将看到打印的“您运行了程序!”。相反,如果您创建一个单独的文件来导入snicklefritz,则不会打印消息

请注意,这里没有关于“列出函数”的内容。例如,看看这个程序:

print "This will always be printed!"

if __name__ == "__main__":
    print "This will only be printed if you run the file as a program!"
这里,
if uuuuu name uuu==“\uuuuuu main\uuuuu”
块没有“列出”任何函数。它只包含文件作为脚本运行时运行的实际代码。不过,人们通常不会这样做,因为将代码放在单独的函数中比坐在函数外“暴露”更整洁

至于其他函数,您可以在模块中定义您喜欢的任何其他函数,以便在该模块中使用,或者由导入您的模块的其他模块使用。通常,模块中的大多数函数不会在
if\uuuuuu name\uuuu==“\uuuu main\uuuu”
块中使用,因为它们不会是“main”函数的一部分。相反,它们将是供其他代码使用的其他函数。例如:

def otherFunc(x):
    # Return x squared
    return x**2

def snicklefritz():
    # This function will be run when you run the program
    print "You ran the program!"

if __name__ == "__main__":
    snicklefritz()

模块中根本不使用
otherFunc
。那很好。可能有人想导入您的模块并自己使用
otherFunc
。并非每个函数都必须在同一个模块中使用,更不用说从
调用,如果
块中的名为的话

考虑下面的程序,它保存在一个名为
sum.py
的文件中:

def read_numbers():
    n1 = int(raw_input())
    n2 = int(raw_input())
    return n1, n2

def sum_numbers(i1, i2):
    return i1+i2

def print_sum(i1, i2, i3):
    print "%d + %d = %d" % (i1, i2, i3)

v1, v2 = read_numbers()
sum = sum_numbers(v1, v2)
print_sum(v1, v2, sum)
它有三个功能——一个从标准输入读取两个数字,另一个求和,第三个打印操作。在定义函数之后,我调用它们的方式是读取两个数字并打印其总和。相当容易。如果我执行它,我会得到如下结果:

$ python sum.py 
12
34
12 + 34 = 46
现在,假设我需要编写另一个只读取一个数字的程序——另一个数字实际上是给定的。由于我已经有了一个
sum\u numbers()
函数和一个
print\u sum()
函数,我很想重用
sum
模块,这是一件好事:

import sum
MY_FIXED_NUMBER=3
n = int(raw_input())
value = sum.sum_numbers(n, MY_FIXED_NUMBER)
print_sum(n, MY_FIXED_NUMBER, value)
太好了!然而,如果我执行它,我得到了什么?这:

$ python three_sum.py 
12
34
12 + 34 = 46
12
12 + 3 = 15
哇?!程序要求我输入两个数字,打印出它们的总和,然后要求输入第三个数字,这第三个数字正确地相加为3。我只想被问到第三个数字,然后用3来打印总数!发生了什么事

当我导入一个模块时(比如
importsum
),模块中的所有代码都会被执行。因此,我的模块有两个部分,一个是定义可在其他地方使用的有用函数(我称之为定义部分),另一个是它以某种方式执行此函数以获得特定结果的部分,因此我可以将模块用作程序(我称之为执行部分)。始终执行执行部分

幸运的是,Python有一个技巧,允许我仅在未导入模块时执行执行部分。如果使用
import
导入Python文件,模块将有一个名为
\uuuu name\uuuu
的变量,其名称将是模块的原始名称:

>>> import sum
12
34
12 + 34 = 46
>>> sum.__name__
'sum'
但是,如果我将Python文件作为脚本运行(
$Python sum.py
),则
\uuu name\uuu
变量将在那里,但名称不同。假设我添加一行,如

print __name__
在my
sum.py的末尾
。当我再次运行它时,我得到了:

$ python sum.py
12
34
12 + 34 = 46
__main__
另一方面,如果我运行
three\u sum.py
,则
print\uuuuu name\uuuuuu
的结果会大不相同:

$ python three_sum.py 
12
34
12 + 34 = 46
sum
12
12 + 3 = 15
$ python three_sum.py 
12
12 + 3 = 15
是的,当以脚本形式运行文件时,
\uuuuuu name\uuuuuuu
变量的值为
\uuuuuuu\uuu

那么,这对我有什么帮助呢?这样:我将把模块的执行部分放入
if
条件中。如果模块的名称为
\uuuu main\uuuu
,这是因为该文件是以脚本形式运行的,带有
$python sum.py
——在这种情况下,我应该执行模块的执行部分。因此,我的
sum.py
模块现在是这样的:

def read_numbers():
    n1 = int(raw_input())
    n2 = int(raw_input())
    return n1, n2

def sum_numbers(i1, i2):
    return i1+i2

def print_sum(i1, i2, i3):
    print "%d + %d = %d" % (i1, i2, i3)

if __name__ == "__main__":
    v1, v2 = read_numbers()
    sum = sum_numbers(v1, v2)
    print_sum(v1, v2, sum)
如果我运行
$python sum.py
,我会得到与以前相同的结果:

$ python sum.py
12
34
12 + 34 = 46
但是,如果我运行
three_sum.py$ python three_sum.py 
12
12 + 3 = 15