surprisinglywe can even use the equals sign syntax to mix up the order of positional argumentsso long as all of them are supplieddefault_arguments( = , = , = , ="hi" hi false with so many optionsit may seem hard to pick onebut if you think of the positional arguments as an ordered listand keyword arguments as sort of like dictionaryyou'll find that the correct layout tends to fall into place if you need to require the caller to specify an argumentmake it mandatoryif you have sensible defaultthen make it keyword argument choosing how to call the method normally takes care of itselfdepending on which values need to be suppliedand which can be left at their defaults one thing to take note of with keyword arguments is that anything we provide as default argument is evaluated when the function is first interpretednot when it is called this means we can' have dynamically generated default values for examplethe following code won' behave quite as expectednumber def funky_function(number=number)print(numbernumber= funky_function( funky_function(print(numberif we run this codeit outputs the number firstbut then it outputs the number for the call with no arguments we had set the variable to the number as evidenced by the last line of outputbut when the function is calledthe number is printedthe default value was calculated when the function was definednot when it was called this is tricky with empty containers such as listssetsand dictionaries for exampleit is common to ask calling code to supply list that our function is going to manipulatebut the list is optional we' like to make an empty list as default argument we can' do thisit will create only one listwhen the code is first constructeddef hello( =[]) append(' 'print(