0

I am study and excise learn python in the hard way. In excise 41, I have some difficulty to understand the code.

I have a question in the following code:

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

How the for loop within two object. I just could not understand that. snippet is the one of the keys. Phrase the value of that key in the PHRASES dict. In my option, loop have to in one list or tuple. But could not two object.

Is my understanding wrong?

Full code information as

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"

1 Answer 1

2

that might look a little weird at first, but the the for loop is working in a tuple, that is because , is the tuple constructor just as [] is the list constructor.

Tuples are constructed by the comma operator (not within square brackets), with or without enclosing parentheses, but an empty tuple must have the enclosing parentheses, such as a, b, c or (). A single item tuple must have a trailing comma, such as (d,).

So

for x in a,b:
    #something

is the same as

for x in (a,b):
    #something

example

>>> 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'>
>>> 
Sign up to request clarification or add additional context in comments.

1 Comment

Oh. Thank you very much. That helps a lot.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.