A (hopefully elegant) recursive approach:
def funky_cap(s, use_lower=False):
if s == '':
return s
elif not s[0].isalpha():
return s[0] + funky_cap(s[1:], use_lower)
elif use_lower:
return s[0].lower() + funky_cap(s[1:], not use_lower)
else: # when we need an uppercase letter
return s[0].upper() + funky_cap(s[1:], not use_lower)