1

可能的重复:
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 开发,并希望了解一些有助于缩短开发时间并消除试错的秘诀。感谢您的洞察力!

4

5 回答 5

4

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

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

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

foo()
foo()

这将打印

[1]
[1, 1]
于 2010-07-12T11:25:35.853 回答
3

对于您的示例,通常的方式是这样的

try:
    value = cache[key]
except KeyError:
    value = cache[key] = redownload(key)
于 2010-07-12T09:06:53.983 回答
2

线程不会像您认为的那样做,并且可能不应该按照您习惯使用它们的方式使用。这对许多人来说是一个巨大的陷阱,特别是对于那些习惯于使用 Java 的人来说,其中自定义是子类 Thread实现 Runnable 接口以执行异步工作,并且语言支持并行运行线程(在具有多个 CPU 内核的机器上) .

一般来说,您可能根本不需要线程,而是子进程。请参阅我对“python 线程和性能?”问题的回答。.

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

于 2010-07-12T08:02:18.350 回答
1

例外是你的朋友。

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

于 2010-07-12T08:06:09.143 回答
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)
于 2010-07-12T15:28:38.013 回答