2

Learn Python the Hard Way ex.41 の for ループの 1 つがどのように機能するかを理解するのに苦労しています。http://learnpythonthehardway.org/book/ex41.html以下はレッスンのコードです。

私が混乱しているループはfor i in range(0, snippet.count("@@@")): 、0 から snippet (そのうち 6 つの snippet があります) の範囲を反復し、"@@@" のカウントの余分な値を追加することですか? コードの次の行ではparam_count = random.randint(1,3)、"@@@" という追加の値が適用されますか? それとも私は道を外れているのですか!?

乾杯ダレン

import random
from urllib import urlopen
import sys

WORD_URL = "http://learncodethehardway.org/words.txt"
WORDS = []

PHRASES = {
    "class %%%(%%%):":
       "Make a class named %%% that is-a %%%.",
    "class %%%(object):\n\tdef __init__(self, ***)" :
      "class %%% has-a __init__ that takes self and *** parameters.",
    "class %%%(object):\n\tdef ***(self, @@@)":
      "class %%% has-a function named *** that takes self and @@@ parameters.",
    "*** = %%%()":
      "Set *** to an instance of class %%%.",
    "***.***(@@@)":
      "From *** get the *** function, and call it with parameters self, @@@.",
    "***.*** = '***'":
      "From *** get the *** attribute and set it to '***'."
}

# do they want to drill phrases first
PHRASE_FIRST = False
if len(sys.argv) == 2 and sys.argv[1] == "english":
    PHRASE_FIRST = True

# load up the words from the website
for word in urlopen(WORD_URL).readlines():
    WORDS.append(word.strip())


def convert(snippet, phrase):
    class_names = [w.capitalize() for w in
                   random.sample(WORDS, snippet.count("%%%"))]
    other_names = random.sample(WORDS, snippet.count("***"))
    results = []
    param_names = []

    for i in range(0, snippet.count("@@@")):
        param_count = random.randint(1,3)
        param_names.append(', '.join(random.sample(WORDS, param_count)))

    for sentence in snippet, phrase:
        result = sentence[:]

        # fake class names
        for word in class_names:
            result = result.replace("%%%", word, 1)

        # fake other names
        for word in other_names:
            result = result.replace("***", word, 1)

        # fake parameter lists
        for word in param_names:
           result = result.replace("@@@", word, 1)

        results.append(result)

    return results


# keep going until they hit CTRL-D
try:
    while True:
        snippets = PHRASES.keys()
        random.shuffle(snippets)

        for snippet in snippets:
            phrase = PHRASES[snippet]
            question, answer = convert(snippet, phrase)
            if PHRASE_FIRST:
                question, answer = answer, question

            print question

            raw_input("> ")
            print "ANSWER:  %s\n\n" % answer
except EOFError:
    print "\nBye"
4

2 に答える 2

3

snippet.count("@@@")"@@@"に出現する回数を返しますsnippet

が 6 回表示される場合"@@@"、for ループは 0 から 6 まで反復します。

于 2013-08-31T03:01:33.240 に答える
0

"try except" ブロックは、ユーザーが ^ D を押すまでプログラムを実行します。

「try」内の「While True」ループは、PHRASES 辞書からのキーのリストをスニペットに格納します。キーの順序は毎回異なります (シャッフル方式のため)。その「Whileループ」内の「forループ」は、各スニペットを通過し、そのスニペットのキーと値でconvertメソッドを呼び出すことです。

すべての「変換メソッド」は、そのキーと値の %%%、***、および @@@ を単語の URL リストからランダムな単語に置き換え、2 つの文字列で構成されるリスト (結果) を返します。キーから作成されたものと値から作成されたもの。

次に、プログラムは文字列の 1 つを質問として出力し、(raw_input("> ") を使用して) ユーザー入力を取得しますが、ユーザーが何を入力しても、返されたもう 1 つの文字列を回答として出力します。

convert メソッド内には、class_names、other_names、および param_names の 3 つの異なるリストがあります。class_names を作成するために、プログラムはそのキー (または値、ただしいずれにせよそれらの %%% と同じ数です) 内の %%% の数をカウントします。class_names は、%%% の数の単語のランダムなリストになります。

other_names も単語のランダムなリストです。何語?キー(または値、それらのどのペアでも同じであるため、どちらでもかまいません)で見つかった *** の数

param_names は、見つかった @@@ の数の文字列のリストです。各文字列は、, で区切られた 1 つ、2 つ、または 3 つの異なる単語で構成されます。

「結果」は文字列です。プログラムは 3 つのリスト (class_names、param_names、および other_names) を調べ、結果文字列内の何かを、既に準備されているものに置き換えます。次に、これを結果リストに追加します。「スニペット」と「フレーズ」は 2 つの異なる文字列であるため、(スニペット内の文、フレーズ:) ループは 2 回実行されます。したがって、「結果」文字列は 2 回作成されます (1 回は質問用、もう 1 回は回答用)。

URL 内のランダムな単語から特定のサイズのリストを作成する方法を明確にするために、このプログラムの一部を小さなサブプログラムに入れました。

https://github.com/MahshidZ/python-recepies/blob/master/random_word_set.py

最後に、よりよく理解する必要があるコード内の任意の場所に print ステートメントを配置することをお勧めします。例として、このコードでは、何が起こっているのかを正確に把握するために、いくつかの変数を出力しました。これは、デバッガーなしでデバッグする良い方法です: (私のコードでブール変数 DEBUG を探してください)

DEBUG = 1
if DEBUG:
  print "snippet: " , snippet
  print "phrase: ", phrase
  print "class names: ", class_names
  print "other names: " , other_names
  print "param names: ", param_names
于 2014-05-18T23:12:20.550 に答える