Now, let's write Python code to generate all the passwords of length n.

In [1]:
def gen_nested_loop(n):
    res = "def gen_passwords():\n"
    for i in range(n):
        res += "%sfor letter%d in alphabet:\n" % ((1+i)*" ", i)
    
    add_line = "password = "
    for i in range(n-1):
        add_line += "letter%d + " % (i)
    add_line += "letter%d" % (n-1)
    
    res += (n+1)*" " + add_line + "\n"
    res += (n+1)*" " + "print(password)\n"
    
    return res

Here's the string that gen_nested_loop(5) returns:

In [2]:
gen_nested_loop(5)
Out[2]:
'def gen_passwords():\n for letter0 in alphabet:\n  for letter1 in alphabet:\n   for letter2 in alphabet:\n    for letter3 in alphabet:\n     for letter4 in alphabet:\n      password = letter0 + letter1 + letter2 + letter3 + letter4\n      print(password)\n'

Let's print it:

In [3]:
print(gen_nested_loop(5))
def gen_passwords():
 for letter0 in alphabet:
  for letter1 in alphabet:
   for letter2 in alphabet:
    for letter3 in alphabet:
     for letter4 in alphabet:
      password = letter0 + letter1 + letter2 + letter3 + letter4
      print(password)

We can now save the string, and then run it with exec. We'll then be able to call the function gen_passwords().

In [4]:
alphabet = "abc"
program_text = gen_nested_loop(2)
print(program_text)
def gen_passwords():
 for letter0 in alphabet:
  for letter1 in alphabet:
   password = letter0 + letter1
   print(password)

In [5]:
exec(program_text)
In [6]:
gen_passwords()
aa
ab
ac
ba
bb
bc
ca
cb
cc