Ex 41, stuck at decoding for loop

I couln’t interpret the fallowing line with for:

'for x in y, z: ’ in the fallowing snippet is hard to decode for me. unable to visualise yet what test is passed as phrase though. please help


def convert(snippet,phrase):

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

So there’s two parts to for-loops that can trip people up, but try dropping some real snippet of code that you don’t get. It’s easier to explain a real thing. Also, try this:

```
#your code here
```

That’ll help format your code.

import random
from urllib.request 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(str(word.strip(), encoding="utf-8"))


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 = list(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)

            input("> ")
            print(f"ANSWER:  {answer}\n\n")
except EOFError:
    print("\nBye")

Hi Zedd, I correlated the code and it’s all working fine. But I still not sure that I understood fully how to interpret the pat I highlighted in ‘red’’ in the above snippet
for sentence in snippet, phrase:

I have also tried


    for sentence in snippet, phrase:
        print(snippet)
        print(phrase)
        result=sentence[:]

here snippet and phrase are same values as fallowing:

class %%%(object):
        def __init__(self, ***)
class %%% has-a __init__ that takes self and *** parameters.
class %%%(object):
        def __init__(self, ***)
class %%% has-a __init__ that takes self and *** parameters.
class Bucket has-a __init__ that takes self and chin parameters.

code doesn’t work if I remove one parameter from for: though they both are same.

I found it similar to :slight_smile:

thistuple = ("apple", "banana", "cherry")
for x in thistuple:
  print(x)

I imagine x as ‘sentence’ and snippet, phrase in place of ‘thistuple’ in the above code. .still unclear the purpose.

sorry if it has been explained allready.

Yes, that’s right. In Python you can create tuples without enclosing parentheses, and that’s just what happens here: snippet, phrase is the same as (snippet, phrase). So you create a tuple on the fly with this confusing notation and then you iterate over it.

Thanks Florian I understood here, its adding snippet and phrase each as sentence to the result to be available as question and answer!

Yes, but change your prints you’re doing to:

for sentence in snipper, phrase:
    print(sentence)

Then you’ll see it.

Oh it was the snippet while I tried to learn what exactly was happening. Thanks @zedshaw

A free service run by Zed A. Shaw for learncodethehardway.org.