Python for C ++或Java Programmer

时间:2009-10-10 17:56:10

标签: python

我有C ++,Java和Objective C编程的背景,但我发现很难学习python,基本上是“主要功能”或程序开始执行的地方。那么是否有任何教程/书籍可以向拥有C ++或Java背景的人教授python。基本上可以显示你是如何在C ++中执行此操作以及如何在Python中完成此操作。

好吧我认为我没有把问题标题或问题写得正确,基本上我对“主要”功能感到困惑,否则除了这个概念之外,其他一些东西在python官方文档中都很明显。

感谢所有

7 个答案:

答案 0 :(得分:11)

当您通过Python解释器运行脚本(或从另一个脚本导入该脚本)时,它实际上从头到尾执行所有代码 - 在感觉, Python脚本没有“入口点”

因此,为了解决这个问题,Python会自动创建一个__name__变量,并在您自己运行脚本时填充值"__main__"(与导入该脚本的其他内容相反)。这就是为什么你会看到许多脚本,如:

def foo():
    print "Hello!"

if __name__ == "__main__":
   foo()

其中所有函数/类定义都在顶部,并且有一个类似的if语句作为脚本中的最后一个。您可以保证Python将从上到下开始执行脚本,因此它将读取您在那里的所有定义。如果您愿意,可以将所有功能定义中的实际功能代码混合在一起。

如果此脚本名为bar.py,您可以在命令行执行python bar.py,然后您会看到脚本打印出"Hello!"

另一方面,如果您从另一个Python脚本执行了import bar,则在bar.foo()完成之前不会打印任何内容,因为__name__不再是"__main__"而且if语句失败,因此foo从未执行过。

答案 1 :(得分:6)

很好的答案,但没有人指出我认为对于使用其他语言(如Java或C ++)的后台程序员来说是一个关键的洞察力:importdefclass不是“编译器的指令”,“声明”或其他类型的神奇咒语:它们是可执行语句,与其他任何语句一样。例如,def语句:

def f(x): return x + 23

几乎完全等同于赋值语句:

f = lambda x: x + 23

(风格上def是优选的,因为它使f.__name__有意义 - 这是“几乎”的一部分; lambda相当有限,只有当你真的有用时才应该使用热衷于制作匿名功能,而非正常命名的功能)。类似地,

class X(object): zap = 23

相当于作业:

X = type('X', (), {'zap': 23})

(同样,在风格上,class更可取,提供更多的一般性,如def它允许装饰等等;我要说的是有语义等于这里)。

因此,当你运行.py文件,或者在程序运行中第一次导入它时,Python会一个接一个地执行它的顶级语句 - 以正常的Python风格,大多数将是分配,defclassimport,但至少有一个是执行该函数的 body 代码的调用(通常是函数)( deflambda一样,只需编译该代码;编译后的代码对象仅在函数或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()

在我的笔记本电脑上,使用Python 2.6,这会发出:

in module toplev: 0.405440
in function body: 0.123296

因此,对于执行大量变量访问的代码而言,在函数中运行它而不是将其作为模块顶级代码运行它可以将速度提高3倍以上。

详细解释:在模块级,所有变量都不可避免地保存在字典中,因此每个变量访问都是dict-access;函数的局部变量被优化为一个特殊的数组,因此访问速度更快(差异甚至比通过访问Python列表中的项目与Python字典中的项目所看到的20%左右的速度更加极端,因为局部变量优化也节省了散列和其他辅助成本。

答案 2 :(得分:5)

Dive into Python是一个好的开始。我不建议没有编程经验的人,但如果你之前用其他语言编写代码,它将帮助你快速学习python习语。

答案 3 :(得分:1)

如果您对C ++和Java等多种语言非常熟悉,您可能会发现很容易遵循官方Python Tutorial。它以经典语言描述自下而上的方式编写,从词汇结构和语法到更高级的概念。

已经提到的Dive Into Python采用自上而下的方法学习语言,从一个对初学者来说模糊不清的完整程序开始,并深入研究其细节。

答案 4 :(得分:0)

我也在一年前开始使用Python,也是C ++背景。

我已经了解到Python中的一切都比较简单,如果你做得对,你不需要太担心,你可能就是这样。大多数事情都很自然。

我不能说我读过一本书或者其他任何东西,我经常在freenode的#python中对这些人进行过很多的讨论,然后看了很多其他优秀的代码。

祝你好运:)

答案 5 :(得分:0)

我以Dive in to Python为第二资源。至于主要功能,没有一个。 “main”函数是您在运行的脚本中编写的函数。

所以helloworld.py看起来像这样:

print "Hello World"

然后用

运行它
python helloworld.py

就是这样!

答案 6 :(得分:0)

我猜最精彩的评论是,入口点是脚本的第一行,不是函数或类。除非您愿意,否则您不一定需要使用if hack,并且您的脚本是要导入的。