Challenge 1: Flexible Greeting — Possible Solution ==================================================================== def greet(name, greeting="Hello"): return f"{greeting}, {name}!" print(greet("Ada")) # just a name print(greet("Ada", "Hi")) # both, positional print(greet(greeting="Hey", name="Ada")) # both, keyword, reversed order Output: Hello, Ada! Hi, Ada! Hey, Ada! WHY THIS WORKS AS AN ANSWER ------------------------------ greet("Ada") supplies only the required positional parameter name; greeting is left unset, so it falls back to the default value "Hello" defined in the function signature, exactly like this chapter's describe_pet(name) example that relied on animal's default. greet("Ada", "Hi") supplies both arguments positionally, in the exact order they appear in the function signature (name, then greeting) — "Ada" fills name, "Hi" fills greeting. greet(greeting="Hey", name="Ada") supplies both arguments as keyword arguments, and — as the chapter states — keyword arguments can be passed in ANY order at the call site, since each value is explicitly tied to a parameter name rather than a position. greeting="Hey" is written first here even though greeting comes second in the function definition, and the call still works correctly.