import os

def filesWithOfEvenByteSizes(fullFilePath):
    """Returns True if fullFilePath has an even size in bytes, otherwise
    returns False."""
    fileSize = os.path.getsize(fullFilePath)
    return fileSize % 2 == 0


def filesWithAllVowelsInFilename(fullFilePath):
    """Returns True if the fullFilePath has a, e, i, o, and u, otherwise
    returns False."""
    name = os.path.basename(fullFilePath).lower()
    return ('a' in name) and ('e' in name) and ('i' in name) and ('o' in name) and ('u' in name)


def walk(folder, matchFunc):
    """Calls the match function with every file in the folder and its
    subfolders. Returns a list of files that the match function
    returned True for."""
    matchedFiles = []  # This list holds all the matches.
    folder = os.path.abspath(folder)  # Use the folder's absolute path.

    # Loop over every file and subfolder in the folder:
    for name in os.listdir(folder):
        filepath = os.path.join(folder, name)
        if os.path.isfile(filepath):
            # Call the match function for each file:
            if matchFunc(filepath):
                matchedFiles.append(filepath)
        elif os.path.isdir(filepath):
            # Recursively call walk for each subfolder, extending
            # the matchedFiles with their matches:
            matchedFiles.extend(walk(filepath, matchFunc))
    return matchedFiles


print('All files with even byte sizes:')
print(walk('.', filesWithOfEvenByteSizes))
print('All files with every vowel in their name:')
print(walk('.', filesWithAllVowelsInFilename))
