2014-10-29 59 views
-1

我閱讀了與該部分相關的所有答案,但仍不理解1部分。下面的代碼究竟做了什麼?Python - Learn Python The Hard Way Exercise 41 confused?

random.sample(WORDS, snippet.count("%%%")) 

我知道這意味着代碼片段中「###」的出現次數,但沒有得到正確的含義。

這裏是整個代碼,如果有幫助:

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 
if len(sys.argv) == 2 and sys.argv[1] == "english": 
    PHRASE_FIRST = True 
else: 
    PHRASE_FIRST = False 

# 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" 

回答

0

snippets包含字典PHRASESsnippets = PHRASES.keys())的鍵。

["***.*** = '***'", '*** = %%%()', 'class %%%(object):\n\tdef ***(self, @@@)', '***.***(@@@)', 'class %%%(object):\n\tdef __init__(self, ***)', 'class %%%(%%%):'] 

對於每個「snippet」的convert功能將與snippet(例如"***.*** = '***'"'class %%%(%%%):')和phrase,所述snippetPHRASES字典(分別"From *** get the *** attribute and set it to '***'."'Make a class named %%% that is-a %%%.')相應的值被調用。

random.sample(WORDS, snippet.count("%%%"))部分returnsWORDS儘可能多的單詞的列表,因爲有在片段%%%occurrences

>>> snippet.count("%%%") 
2 
>>> random.sample(WORDS, snippet.count("%%%")) 
['cook', 'crush'] 
... 
>>> snippet.count("%%%") 
0 
>>> random.sample(WORDS, snippet.count("%%%")) 
[] 
+0

謝謝!終於明白了 – mrvciv 2014-10-29 20:18:19

0

的代碼從WORDSrandom elements。由於字符串中可能有多個%%%佔位符,因此在snippet中出現的%%%次數與該列表中的項數相同。

相關問題