-1

この質問は主に、メイン インスタンスなどを保持する方法に関する適切な Python の例が見つからず、PHP を始めたときのように、悪い習慣にならないようにしようとしているためです。私は約 3 時間前に Python を開始し、主にコンソールに取り組んでいました。コードが恐ろしくひどく、おそらく間違っているように見えることは、ほとんどの場合致命的です。Python が見て実行することを意図して書かれた単純なアプリケーションを見つけることができる場所はありますか?

背景: 私は、配列を循環させて遊ぶことができるかどうかを確認できる小さな小さなアプリケーションを考えたかったのです。というわけで、食料品リスト オーガナイザーを作りました。

i = 0
v = []
vara = None
def view():
    indx = 1
    for i in v:
        print "Grocery #" + str(indx) + ": " + str(i)
        indx += 1
while vara != "end" and vara != "exit":
    vara = raw_input("Please enter a grocery: ")
    vara = str(vara)
    if vara == "view":
        view()
    elif vara[len(vara)-4: len(vara)] == " del":
        key = vara[0:len(vara) - 4]
        if key in v:
            v.remove(key)
            print "Deleted: " + key
        else:
            print "Error, " + key + " was not found in your list"
    elif (vara != "end" and vara != "exit") and len(vara) > 0:
        v.append(vara)
view()

私にとっては、良い例を見つける場所を持つことがより重要であり、それが最も重要です. また、可能であれば、開始および終了するインスタンスをどのように作成しますか。できればよろしくお願いします。

4

1 に答える 1

3

より良い Python コードを書くための最善の方法は、1) たくさんの Python コードを書くことです。(pythonic を理解するには、http://blog.startifact.com/posts/older/what-is-pythonic.html と http://www.python.org/dev/peps/pep-0020/ を読んください) 3) 読む標準ライブラリ、リスト内包表記、itertools、巧妙なトリックについて、頭の片隅に置いておきましょう。Python は、すべての一般的な操作を 1 つのライナー/単一の関数にすることに重点を置いています。

あなたのコードに関する私の考えは次のとおりです。

i = 0

不適切な名前によるグローバル変数の初期化。変数にはわかりやすい名前を付けるか、一時的な反復変数にする必要があります (この場合、i、j、k などはすべて問題ありません)。

v = []

不適切な名前によるグローバル変数の初期化。「ヴ」とは?今から 3 か月後にコードを読んだ場合、これが何のためにあるのかまだわからないでしょう。また、変数は可能な限りクラスまたは関数内で初期化する必要があります (OOP カプセル化の場合)。

vara = None

不適切な名前によるグローバル変数の初期化。「ヴァラ」とは?グローバルな状態を持つ必要がない場合は、グローバル レベルで定義しないでください。変数をいつどこで使用するか、適切な名前で定義する必要があります。

def view():
    indx = 1
    for i in v:
        print "Grocery #" + str(indx) + ": " + str(i)
        indx += 1

2 つの個別の反復変数を使用する代わりにenumerate()、インデックスと項目のタプルを返すために使用します。http://docs.python.org/2/library/functions.html#enumerate

のように

def view():
    for i, item in v.iteritems():
        print "Grocery #" + str(i) + ": " + str(item)

ずっといい!これは 2 つのライナーであるため、この時点では (オプションで) 独自のメソッドは必要ありません。

while vara != "end" and vara != "exit":

name == " main "の場合、関数にラップして呼び出す必要があります。のようにif __name__ == "__main__": do?

ああ、それが vara の目的です。コマンド、アクション、ユーザーコマンドなど、もっとわかりやすい名前にする必要があります。vara は私には無意味です。

    vara = raw_input("Please enter a grocery: ")
    vara = str(vara)

この行は不要だと確信しています.raw_inputは文字列を返すことしかできないのでしょうか?

    if vara == "view":
        view()
    elif vara[len(vara)-4: len(vara)] == " del":
        key = vara[0:len(vara) - 4]

これを書き直す具体的な方法は思いつきませんが、ハッキーな「におい」がします。(おそらく、適切な構造化された方法を使用するのではなく、部分文字列やindexofなどを実行してすべてのコマンド解析を行っているという事実です。しかし、誰もがこのように始めます:))

        if key in v:
            v.remove(key)
            print "Deleted: " + key
        else:
            print "Error, " + key + " was not found in your list"
    elif (vara != "end" and vara != "exit") and len(vara) > 0:
        v.append(vara)
view()
于 2013-05-01T01:03:45.067 に答える