我有C++,Java和Objective C编程的背景,但我发现很难学习python,基本上它的"主要功能"或程序开始执行的地方.那么是否有任何教程/书籍可以向拥有C++或Java背景的人教授python.基本上可以显示你是如何在C++中执行此操作以及如何在Python中完成此操作的东西.
好吧我认为我没有把问题标题或问题写得正确,基本上我对"主要"功能感到困惑,否则除了这个概念之外,其他事情在python官方文档中都很明显.
谢谢大家
Mar*_*off 11
当您通过Python解释器运行脚本(或从另一个脚本导入该脚本)时,它实际上从头到尾执行所有代码 - 从这个意义上讲,Python脚本没有"入口点".
因此,为了解决这个问题,Python会自动创建一个__name__变量,并"__main__"在您自己运行脚本时将其填入值(与导入该脚本的其他内容相反).这就是为什么你会看到许多脚本,如:
def foo():
print "Hello!"
if __name__ == "__main__":
foo()
Run Code Online (Sandbox Code Playgroud)
其中所有函数/类定义都在顶部,并且有一个类似的if语句作为脚本中的最后一个.您可以保证Python将从上到下开始执行脚本,因此它将读取您在那里的所有定义.如果您愿意,可以将所有功能定义中的实际功能代码混合在一起.
如果此脚本已命名bar.py,您可以python bar.py在命令行执行,您将看到脚本打印出来"Hello!".
另一方面,如果您import bar从另一个Python脚本执行操作,则在您执行之前不会打印任何内容bar.foo(),因为__name__不再存在"__main__"并且if语句失败,因此foo从未执行过.
很好的答案,但没有人指出我认为对于使用其他语言(如Java或C++)的背景来到Python的程序员的一个关键洞察力import,def并且class不是"编译器的指令","声明"或其他类型的魔法咒语:它们是可执行语句,与其他语句一样.例如,def声明:
def f(x): return x + 23
Run Code Online (Sandbox Code Playgroud)
几乎完全等同于赋值语句:
f = lambda x: x + 23
Run Code Online (Sandbox Code Playgroud)
(风格上def是优选的,因为它f.__name__有意义 - 这是"几乎"的一部分; lambda相当有限,只有在你真正热衷于制作匿名函数而不是普通命名函数时才应该使用它.同样的,
class X(object): zap = 23
Run Code Online (Sandbox Code Playgroud)
相当于作业:
X = type('X', (), {'zap': 23})
Run Code Online (Sandbox Code Playgroud)
(再次,在风格上,class更可取,提供更多的一般性,就像def它允许装饰等;我要说的是这里有语义等价).
所以,当你运行一个.py文件,或者导入一个节目中的第一次运行时,Python的执行它的最顶层报表一前一后-在正常良好的Python风格,最会的任务,def,class,或import,但在至少一个将是一个呼叫(通常到功能)来执行功能的身体的代码(def一样lambda,只是编译的代码;编译代码对象只执行当函数或拉姆达称为).其他答案已经提出了实际考虑因素,例如测试__name__以制作可以直接运行或导入的模块等.
最后,最好在函数(或类中的方法)中使用所有"重要"代码,而不仅仅是风格上,而是因为函数中的代码执行得更快(因为Python编译器可以自动优化对局部变量的所有访问).例如,考虑......:
import time
lotsotimes = range(1000*1000)
start = time.time()
for x in lotsotimes:
x = x + x
stend = time.time()
print 'in module toplev: %.6f' % (stend - start)
def fun():
start = time.time()
for x in lotsotimes:
x = x + x
stend = time.time()
print 'in function body: %.6f' % (stend - start)
fun()
Run Code Online (Sandbox Code Playgroud)
在我的笔记本电脑上,使用Python 2.6,这会发出:
in module toplev: 0.405440
in function body: 0.123296
Run Code Online (Sandbox Code Playgroud)
因此,对于执行大量变量访问的代码而言,在函数中运行它而不是将其作为模块顶级代码运行它可以将其加速3次以上.
详细解释:在模块级别,所有变量都不可避免地保存在字典中,因此每个变量访问都是一个dict-access; 函数的局部变量被优化为一个特殊的数组,因此访问速度更快(差异甚至比通过访问Python列表中的项目与Python字典中的项目所看到的20%左右的速度更加极端,因为本地变量优化还节省了散列和其他辅助成本).
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |