2016-08-05 21 views
0

Ich bin Studium und Verbrauchssteuer lernen Python auf die harte Tour. In Verbrauchssteuer 41 habe ich einige Schwierigkeiten, den Code zu verstehen.Python für Schleife mit zwei Instanzen

Ich habe eine Frage in dem folgenden Code:

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

Wie die für innerhalb von zwei Objekt Schleife. Ich konnte das einfach nicht verstehen. Snippet ist der eine der Schlüssel. Phrasen Sie den Wert dieser Taste im PHRASES dict. In meiner Wahl, Schleife muss in einer Liste oder Tupel. Aber konnten zwei nicht widersprechen.

Ist mein Verständnis falsch?

Vollständige Codeinformationen als

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 fucntion 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 phrase first 
if len(sys.argv) == 2 and sys.argv[1] == "english": 
    PHRASES_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 list 
     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 PHRASES_FIRST: 
       question, answer = answer, question 

      print question 

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

Antwort

1

, die ein wenig seltsam auf den ersten Blick vielleicht, aber die die for-Schleife in einem Tupel arbeiten, das ist, weil , das ist tuple constructor ebenso [] die Liste Konstruktor ist.

Tupel werden durch den Komma-Operator (nicht in eckigen Klammern) aufgebaut ist, mit oder ohne Klammern umschließt, aber eine leere Tupel die umschließenden Klammern, wie A, B, C oder() haben muß. Ein einzelnes Elementtupel muss ein abschließendes Komma haben, z. B. (d,).

So

for x in a,b: 
    #something 

ist die gleiche wie

for x in (a,b): 
    #something 

Beispiel

>>> for x in 1,2: 
     print x 


1 
2 
>>> 1,2,3,4,5 
(1, 2, 3, 4, 5) 
>>> a=1,2,3,4 
>>> a 
(1, 2, 3, 4) 
>>> type(a) 
<type 'tuple'> 
>>> 
+0

Oh. Vielen Dank. Das hilft sehr. –

+0

wert Markierung als akzeptierte Antwort –