4
#! /usr/bin/python

def main():
    print("boo")

当我尝试在 Python 3.3 中运行这段代码时,它什么也没做。没有错误或任何东西。怎么了

[tim@tim-arch ~]$ gvim script
[tim@tim-arch ~]$ sudo chmod 775 script
[tim@tim-arch ~]$ ./script
[tim@tim-arch ~]$ 
4

5 回答 5

31

您仍然必须调用该函数。

def main():  # declaring a function just declares it - the code doesn't run
    print("boo")

main()  # here we call the function
于 2013-03-16T07:08:55.363 回答
14

我假设您想要做的是在从命令行执行脚本时调用 print 函数。

__name__在 python 中,您可以通过检查变量来确定包含一段代码的脚本是否与最初启动的脚本相同__main__

#! /usr/bin/python

if __name__ == '__main__':
    print("boo")

只需这些代码行:

def main():
    print("boo")

您正在定义一个函数而不是实际调用它。要调用该函数main(),您需要像这样调用它:

main()
于 2013-03-16T07:12:42.297 回答
4

您需要调用该函数,将脚本更新为

#! /usr/bin/python

def main():
    print("boo")

#call it
main()
于 2013-03-16T07:09:35.360 回答
3

在 python 中,如果你想编写一个脚本来顺序执行一系列小任务,那么绝对不需要编写一个函数来包含它们。只需将每个单独放在一条线上即可;或使用类似的表达式分隔符;(不是很推荐,但你可以做的是你想要的),同样:

task1
task2
task3
task4

或者

task1; task2; task3; (again **not** really recommended, and certainly not pythonic)

在您的情况下,您的代码可以转换为:

print('boo')
print('boo2')
print('boo3')

如果没有该方法,它仍然会按照您的预期运行main(),因为它们会按顺序进行评估。

请注意,您可能希望为这些系列任务创建函数的原因是:

  • 呈现一个漂亮的界面(给代码的客户),
  • 或者封装重复的逻辑
  • 可能还有更多用途,但这是我能想到的第一个用途,并用来证明我的观点。

现在,如果您觉得有必要编写类似于main()其他编程语言中的方法的代码,那么请使用以下 python 习惯用法(到目前为止其他用户已声明):

if __name__ == '__main__':
    doSomething()

以上工作如下:

  • 当您import使用 python 模块时,它会获得一个string(通常是导入它的名称)分配为其__name__属性。
  • 当您直接执行脚本时(通过调用 python vm 并将脚本的名称作为参数传递给它),__name__属性设置为__main__
  • 所以当你使用上面的成语时,你既可以将脚本作为一个可插拔的模块随意importing使用,可以直接执行它,让下面的一系列表达式if __name__ == '__main__':直接被求值。

如果您觉得有必要挖掘更多信息,我的来源如下:

于 2013-03-16T15:14:24.450 回答
1

如果您发现其他答案令人困惑或令人生畏,这里有一个寓言,希望对您有所帮助。看下面的 Python 程序:

a = 34

当它运行时,它会做一些事情:在退出脚本之前,Python 知道有一个变量a,它的值是整数 34。它不会对这些信息任何事情,但它是一个完整的程序,它会做一些事情。不过,为了让它产生一些实际价值,它需要与环境交互。它对这个值有什么作用?它可以创建 34 个目录,或者 ping 数据中心的第 34 台服务器,或者检查数据库中最新的 34 个用户的密码强度,等等;或者只是打印一些东西。

a = 34
print(a)

下面的程序在某种意义上与第一个程序非常相似。

def b():
    a = 34
    print(a)

当你运行这个程序时,它会做一些事情: Python 现在知道有一个名为 的函数b,并且它不接受任何参数,并且它包含一些语法上有效的 Python 代码,这些代码将在其他代码调用它时运行,但它实际上并没有对这段代码做任何事情。为了观察函数中代码产生的任何值,您必须实际调用它:

b()

(顺便说一句,也许还要注意,a函数声明中的局部变量b与同名的全局变量不同。)

于 2018-06-03T06:39:14.550 回答