The idea of functions only doing one thing needs to be interpreted carefully. A complex program cannot be constructed entirely from functions that each only do one very simple thing. At some point you need to combine some of those functions to do something more complex, and at that point you need to be clear what "doing one thing" really means.
A more useful idea is that a function should only operate at one conceptual level. In your example, the fetch_and_display_users function is problematic because it claims to be doing something high level but then dives into a loop to process the list of users. Mixing levels is confusing, so you quite rightly split the function into two parts.
But you might still need the fetch_and_display_users function, if that is something you need to do frequently in your code. If you create that function by combining fetch_users and display_users, then the ffetch_and_display_users function operates at one level so it is perfectly valid, even though it does two things.