1

重複の可能性:
Pythonの一般的な落とし穴

私はPythonを学んでおり、プログラミング言語の多様なバックグラウンドを持っています。過去5年間で、私はかなりの量の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私が史上最高の発明の1つであると私が思う構造のような素晴らしいものをサポートします。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に慣れている人にとっては、スレッドをサブクラス化して非同期作業を行うために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 に答える