Python splitting code into functions : <p>Sorry about the length of this but I figured more info is better than not enough!!</p>

<p>I'm trying to split the (working) piece of Python code into functions to make it clearer / easier to use but am coming unstuck as soon as i move stuff into functions. It's basically a password generator which tries to only output a password to the user once the password qualifies as having a character from all 4 categories in it. (Lowercase, uppercase, numbers and symbols).</p>

<hr>

<pre><code>import random
import string
lowerasciis = string.ascii_letters[0:26]
upperasciis = string.ascii_letters[26:]
numberedstrings = str(1234567809)
symbols = "!@$%^&amp;*()[]"
password_length = int(raw_input("Please enter a password length: "))

while True:
    lowerasscii_score = 0
    upperascii_score = 0
    numberedstring_score = 0
    symbol_score = 0
    password_as_list = []

    while len(password_as_list) &lt; password_length:
        char = random.choice(lowerasciis+upperasciis+numberedstrings+symbols)
        password_as_list.append(char)
    for x in password_as_list:
        if x in lowerasciis:
            lowerasscii_score +=1
        elif x in upperasciis:
            upperascii_score +=1
        elif x in numberedstrings:
            numberedstring_score +=1
        elif x in symbols:
            symbol_score +=1
# a check for the screen. Each cycle of the loop should display a new score:
    print lowerasscii_score, upperascii_score, numberedstring_score, symbol_score 

    if lowerasscii_score &gt;= 1 and upperascii_score &gt;= 1 and numberedstring_score &gt;= 1 and symbol_score &gt;=1:
        password = "".join(password_as_list)
        print password
        break
</code></pre>

<p>And here is my attempt at splitting it. When i try to run the below it complains of "UnboundLocalError: local variable 'upperascii_score' referenced before assignment" in the scorepassword_as_a_list() function</p>

<pre><code>import random
import string
lowerasciis = string.ascii_letters[0:26]
upperasciis = string.ascii_letters[26:]
numberedstrings = str(1234567809)
symbols = "!@$%^&amp;*()[]"
password_length = int(raw_input("Please enter a password length: "))
lowerasscii_score = 0
upperascii_score = 0
numberedstring_score = 0
symbol_score = 0
password_as_list = []

def genpassword_as_a_list():
    while len(password_as_list) &lt; password_length:
        char = random.choice(lowerasciis+upperasciis+numberedstrings+symbols)
        password_as_list.append(char)

def scorepassword_as_a_list():
    for x in password_as_list:
        if x in lowerasciis:
            lowerasscii_score +=1
        elif x in upperasciis:
            upperascii_score +=1
        elif x in numberedstrings:
            numberedstring_score +=1
        elif x in symbols:
            symbol_score +=1
    # give user feedback about password's score in 4 categories
    print lowerasscii_score, upperascii_score, numberedstring_score, symbol_score

def checkscore():
    if lowerasscii_score &gt;= 1 and upperascii_score &gt;= 1 and numberedstring_score &gt;= 1 and symbol_score &gt;=1:
        return 1
    else:
        return 0

def join_and_printpassword():
    password = "".join(password_as_list)
    print password  

while True:
    genpassword_as_a_list()
    scorepassword_as_a_list()
    if checkscore() == 1:
        join_and_printpassword()
        break
</code></pre>
