Baconian Cipher Python Implementation
Bug
Letters J &amp; K, U &amp; W, and V &amp; X have the same pattern. This is not what the specification says: either I &amp; J and U &amp; V shares the same pattern, or none of the letters do.
Style
String literals ain't comments. If you want two lines of comments, you start your two lines with a # each. Also take the habit to put a space after the # sign, it eases readability.
You also don't need to put parentheses around simple conditions.
Lastly, PEP 8 recommends to use ALL_CAPS to name constants, like LOOKUP.
Generators
Concatenating strings using += is slow as strings are immutables and Python need to copy the whole string each time you add a bit at the end. For better performances, it is advised to use ''.join. To do this, it is easier to separate each function into two: one that iterates over the input and joins the converted output, the other that generates the converted output. Something like:
def encrypt_letter(letter):
    &quot;&quot;&quot;Convert a plain-text ascii letter into its Bacon's form.

    Let symbols and non ascii letter fail through gracefully.
    &quot;&quot;&quot;
    return LOOKUP.get(letter.upper(), letter.lower())


def encrypt(message):
    &quot;&quot;&quot;Encrypt a message using Bacon's cipher&quot;&quot;&quot;
    return ''.join(map(encrypt_letter, message))

One more thing to note with this implementation: you shouldn't require that the input is properly formatted, you should enforce it in your functions (usage of upper and lower within your function, not before its call)
Do-while
In Python, a do-while loop is emulated using something along the lines of:
while True:
    do_something()
    if ...:
        break

In your case, having the if directly as the first action of the while and an else: break, you just need a simple while loop:
while i &lt; len(message) - 4:
    substr = message[i:i + 5]
    ...