Looping through list of functions in a function in Python dynamically
<p>I'd like to see if it's possible to run through a list of functions in a function. The closest thing I could find is looping through an entire module. I only want to use a pre-selected list of functions.</p>

<p>Here's my original problem:</p>

<ol>
<li>Given a string, check each letter to see if any of the 5 tests fulfill.</li>
<li>If a minimum of 1 letter passes a check, return True.</li>
<li>If all letters in the string fails the check, return False.</li>
<li>For each letter in the string, we will check these functions: isalnum(), isalpha(), isdigit(), islower(), isupper()</li>
<li>The result of each test should print to different lines. </li>
</ol>

<p>Sample Input</p>

<pre><code>    qA2
</code></pre>

<p>Sample Output (must print to separate lines, True if at least one letter passes, or false is all letters fail each test):</p>

<pre><code>    True
    True
    True
    True
    True
</code></pre>

<p>I wrote this for one test. Of course I could just write 5 different sets of code but that seems ugly. Then I started wondering if I could just loop through all the tests they're asking for. </p>

<p>Code for just one test:</p>

<pre><code>    raw = 'asdfaa3fa'
    counter = 0
    for i in xrange(len(raw)):
        if raw[i].isdigit() == True: ## This line is where I'd loop in diff func's
            counter = 1
            print True
            break
    if counter == 0:
        print False
</code></pre>

<p>My fail attempt to run a loop with all the tests:</p>

<pre><code>    raw = 'asdfaa3fa'
    lst = [raw[i].isalnum(),raw[i].isalpha(),raw[i].isdigit(),raw[i].islower(),raw[i].isupper()]
    counter = 0
    for f in range(0,5):
        for i in xrange(len(raw)):
            if lst[f] == True: ## loop through f, which then loops through i
                print lst[f] 
                counter = 1
                print True
        break
        if counter == 0:
    print False
</code></pre>

<p>So how do I fix this code to fulfill all the rules up there?</p>

<hr>

<p><strong>Using info from all the comments - this code fulfills the rules stated above, looping through each method dynamically as well.</strong></p>

<pre><code>    raw = 'ABC'
    functions = [str.isalnum, str.isalpha, str.isdigit, str.islower,  str.isupper]

    for func in functions:
        print any(func(letter) for letter in raw)
</code></pre>

<p><strong>getattr approach (I think this is called introspection method?)</strong></p>

<pre><code>    raw = 'ABC'

    meths = ['isalnum', 'isalpha', 'isdigit', 'islower', 'isupper']
    for m in meths: 
        print any(getattr(c,m)() for c in raw)
</code></pre>

<p><strong>List comprehension approach:</strong></p>

<pre><code>    from __future__ import print_function ## Changing to Python 3 to use print in list comp

    raw = 'ABC'
    functions = [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]
    solution = [print(func(raw)) for func in functions]
</code></pre>

<p>All the other answers are correct, but since you're a beginner, I want to point out the problem in your code:</p>

<pre><code>lst = [raw[i].isalnum(),raw[i].isalpha(),raw[i].isdigit(),raw[i].islower(),raw[i].isupper()]
</code></pre>

<p>First: Not sure which value <em>i</em> currently has in your code snipped, but it seems to point somewhere in the string - which results in single characters being evaluated, not the whole string <em>raw</em>.</p>

<p>Second: When you build your list, you are already calling the methods you want to insert, which has the effect that not the functions themself get inserted, but their return values (that's why you're seeing all those <em>True</em> values in your print statement).</p>

<p>Try changing your code as follows:</p>

<pre><code>lst = [raw.isalnum, raw.isalpha, raw.isdigit, raw.islower, raw.isupper]
</code></pre>

python list loops