我正在学习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开发,并希望学习一些有助于平滑开发时间和消除反复试验的秘密。非常感谢您的见解!
答案 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)