Finding the longest palindromic substring
In terms of efficiency, I like the code.

I'd just fix a few stylistic issues:


Naming: l, a, s don't say anything about what the variable means. Also, you named your function palindrome, but that's returning a boolean, so I'd name it is_palindrome. The i in the substring function is a bit puzzling to me: you have a variable named end, why not call the other one start?
As @kyrill mentioned, you should probably change comments above the functions to docstrings.
The comment Declare local variable for the length of s. is useless.
I'd instead add another comment explaining why it works. If you have a function simply called substrings I expect it to return the substrings. This code only works because it returns the substrings starting from the longest to the shortest. I'd at least change the comment descending order (which may mean for example lexicographical order or alphabetical order) to from longest to shortest. Better be explicit.
I know, it's a bit long, but since you're using a generator, I'd rename the function substrings to get_next_substring.
As @zondo mentioned Question2 is not a PEP8 compliant name, but I'm not sure if the automatic grader will need it to be called like that.