Python语言的细微差别

时间:2010-07-12 07:46:02

标签: python performance pep8

  

可能重复:
  Common Pitfalls in Python

我正在学习Python,而且我来自不同的编程语言背景。在过去的五年中,我写了很多Java,C ++,VB.Net和PHP。许多人可能会同意,一旦你学习了一门编程语言,学习另一门编程语言只是学习语法和最佳实践差异的一个方面。

从PHP开始,我已经习惯了很多脚本风格的语言功能。例如,像这样的东西让我感到内疚:

# Retrieve the value from the cache; otherwise redownload.
if(!($value = $cache->get($key)))
    # Redownload the value and store in the cache.
    $cache->set($key, $value = redownload($key));
但是,Python并不认为赋值是一个表达式。 OTOH,它确实支持像in构造这样的好东西,我发现它是有史以来最伟大的发明之一。 x in y!empty($y[$x])好得多。

我应该注意哪些其他细微差别,“缺失”功能和性能瓶颈?我希望尽可能无缝地过渡到Python开发,并希望学习一些有助于平滑开发时间和消除反复试验的秘密。非常感谢您的见解!

5 个答案:

答案 0 :(得分:4)

这个花了我几个小时来弄清楚我第一次在真正的程序中遇到它时:

函数的默认参数是可变的静态值。

def foo(bar = []):
  bar.append(1)
  print(bar)

foo()
foo()

这将打印

[1]
[1, 1]

答案 1 :(得分:3)

对于你的例子,通常的方式是这样的

try:
    value = cache[key]
except KeyError:
    value = cache[key] = redownload(key)

答案 2 :(得分:2)

线程不会按照您的想法执行操作,并且可能不应该使用它们如何习惯使用它们。对于许多人来说,这是一个巨大的难题,特别是对于那些习惯于子类Thread 的Java,实现Runnable接口来执行异步工作,以及有并行运行线程的语言支持(在具有多个CPU核心的计算机上。)

通常,您可能根本不需要线程,但需要子进程。请参阅问题my answer"python threading and performace?"

(更一般地说,可能有更好的方式。)

答案 3 :(得分:0)

例外是你的朋友。

与使用返回值表示错误的C和PHP等语言相反,Python使用异常来中断程序,而不是让错误导致进一步的问题。

答案 4 :(得分:0)

Pythonic代码通常比类C代码快得多。

类似的东西:

new_list=[]
for i in xrange(len(old_list)):
   new_list.append(some_function(old_list[i]))

最好写成:

new_list=[some_function(x) for x in old_list]

new_list=map(some_function,old_list)