Why is my python function not being executed?
我写了一个非常喜怒无常的带有缩进的脚本,所以我决定做函数。我对python还很陌生,现在我已经创建了这些函数,没有任何效果!
1 2 3 4 5 6
| def main ():
wiki_scrape()
all_csv()
wiki_set = scraped_set('locations.csv')
country_set = all_set('all.csv')
print wiki_set |
我只是想知道这是否是从main()函数调用函数的正确方法?我一直在争论,如果一个缩进问题发生在被调用的函数中,Python似乎非常依赖于适当的缩进,即使它没有出现错误!
完整代码-http://pastebin.com/gjgdhlgr
- 如果你所有的功能都像main(),那么你就没有问题了。
- 你叫main吗?Python不是Java,运行时调用主对象。
- 一定要打电话给main。你这样叫它:main()。
- 所以我必须在main()的开头调用main()?
- 不。我会写一个答案。
- 不,您必须在脚本的正文中调用main()。
- "什么都不起作用"不是一个问题的精确定义。
- 对你的题目的简单回答是"是",否则这门语言将一文不值。
- 你的问题很模糊-请出示你的实际代码。
- @ DougR。编辑以包含完整代码!
听起来你需要这样做:
1 2 3 4 5 6 7 8
| def main():
wiki_scrape()
all_csv()
wiki_set = scraped_set('locations.csv')
country_set = all_set('all.csv')
print wiki_set
main() # this calls your main function |
更好的是:
1 2 3 4 5 6 7 8 9
| def main():
wiki_scrape()
all_csv()
wiki_set = scraped_set('locations.csv')
country_set = all_set('all.csv')
print wiki_set
if __name__ == '__main__':
main() # this calls your main function |
然后从命令行运行它,如下所示:
内置变量__name__是当前上下文命名空间。如果您从命令行运行一个脚本,它将相当于'__main__'。如果从其他地方(包括从解释器内部)以模块的形式运行/导入.py文件,则命名空间(在模块上下文内部)将是.py文件名,如果是包的一部分,则是包名。例如:
1 2 3 4
| ## my_file.py ##
print('__name__ is {0}'.format(__name__))
if __name__ = '__main__':
print("Hello World!") |
如果从命令行执行此操作:
你会得到:
1 2
| __name__ is __main__
Hello World! |
但是,如果从解释器导入,您可以看到__name__不是__main__:
1 2
| >>> from my_file import *
>>> __name__ is my_file |
- 这很奇怪,为什么python允许使用函数之外的代码?我注意到这件事我们在尝试,但我从来没有理解过。
- 这允许您以脚本的形式运行python文件(比如从命令行运行python myscript.py)。它还允许在文件作为模块导入时运行设置代码。
- main在python中的含义与在其他语言中的含义不同。你可以随意调用你的主程序。你只要打电话就行了。
- @加迪,你是说没有功能吗?这仅仅是因为python为您提供了选项。可以将Python用作函数语言、OO语言或简单的过程语言。或者什么都有。你得决定什么对你正在进行的项目最有利。
- @scironic所以当使用函数时,它会变得更面向对象,而在没有函数的情况下会变得更少脚本化?
- @根据定义,gaddi在函数编程中变得更为基础,尽管考虑到python函数是对象,但它也可以被视为oo。但是的,这将不那么程序化。
- @Scironic感谢您的理解!总体来说,这是我的第一个大项目,对编程仍然很陌生。那么,您如何能够判断一个项目是需要OO还是程序性的呢?
- @这是一个很难回答的问题。一般来说,项目越复杂,使用OO方法实现就越容易。如果你发现你的项目是"做这个,然后这个,然后这个",你可能会很好地坚持程序风格。如果你开始处理"事情",是时候考虑OOP了。
- @加迪,这是个大问题。Rickthey肯定是从它开始的,过程性非常基于线性算法(这样做)。如果你想更深入地了解它,你需要四处看看。这里有一个功能和OOP的比较:stackoverflow.com/questions/2078978/…
- "为什么python允许使用函数之外的代码?":因为即使是def和class语句都是可执行语句,并且确实在导入或执行模块时执行。实际上,除了字节代码编译之外,python中的一切都在运行时发生。
python在启动时不调用任何函数,除非明确要求调用(包括main)。
相反,python命名正在运行的文件,运行的主文件名为__main__。
如果您只想调用主函数,可以使用Rick的答案。
但是,在Python最佳实践中,最好执行以下操作:
1 2 3 4 5 6
| if __name__ == '__main__':
wiki_scrape()
all_csv()
wiki_set = scraped_set('locations.csv')
country_set = all_set('all.csv')
print wiki_set |
这样可以确保,如果您将这个python文件作为主文件(您单击的文件或从cmd运行的文件)运行,那么这些函数将运行。
如果将其用作导入的模块,则仍可以使用导入模块的脚本中的函数,但不会自动调用这些函数,因此不会干扰调用脚本。
- 使用这个,您将wiki_set和country_set放在全局命名空间中,因此我更喜欢使用额外的主函数。
- 我会质疑这是最佳实践还是风格偏好。我已经看到了编写良好的代码,它可以双向执行,这取决于作者的意图是用户是否希望从另一个脚本调用main()函数。
- @道格,我当然已经用main作为要调用的函数来完成了。但通常只有当我有一个专门用于某个功能的模块时,这个模块才会在其他地方使用。我很少看到有人在一个独立的脚本中使用主函数,但这可能只是我的同事。
- @马蒂亚斯,这是一个很好的观点。虽然,假设稍后将使用这些变量,我会将它们的定义放在一个函数中,并使用上面的方法调用它。
- @你可能是对的。我知道,当我学会编程python时(甚至在那之前……喘气……perl),我一直被教导,最好把代码放在一个独立的main()函数中,这样它就可以作为一个模块导入,并以我所希望的方式使用,即使我不能想到它的用例。这对我来说是如此根深蒂固,以至于我甚至在敲定vbs或javascript的时候也会这么做。
- @道格,不管怎样,我认为你可能是对的,它比最佳实践更时尚。