2014-10-29 2 views
-1

Я прочитал все ответы, связанные с этим разделом, но до сих пор не понял 1 часть. Что именно делает следующий код?Python - Узнать Python Упражнение Hard Way 41 запуталось?

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 содержит ключи от dict PHRASES (snippets = PHRASES.keys()).

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

Для каждого "snippet" функции convert будет вызываться с snippet (например "***.*** = '***'" или 'class %%%(%%%):') и phrase, соответствующего значению snippet в PHRASES Dict (соотв. "From *** get the *** attribute and set it to '***'." и 'Make a class named %%% that is-a %%%.').

random.sample(WORDS, snippet.count("%%%")) часть returns список, как много слов из WORDS как есть occurrences из %%% в сниппет.

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

спасибо! наконец, получил это – mrvciv

0

код получает random elements от WORDS. Так как у вас может быть более одного %%% заполнителя в строке, он получает столько элементов из этого списка, сколько вхождений %%% в snippet.

Смежные вопросы