working with functions ** ** you can also use these notations together with ordinary arguments the order matters--arguments collected by have to come after all positional arguments and arguments collected by *always come last two example function declarations are shown belowdef func(abc= * ** )def func(ab*cd= ** )calling functions examplethe and *notations can be used when calling functiontoo here is an def ( , )print( +bx=( , (*xthis will print in this case we could have more simply called ( , )but there are situations when that is not possible for examplemaybe you have several different sets of arguments that your program might use for function you could have several if statementsbut if there are lot of different sets of argumentsthen the notation is much easier here is simple exampledef ( , )print( +bargs [( , )( , )( , )( , )( , ) eval(input'enter number from to ') (*args[ ]one use for the *notation is simplifying tkinter declarations suppose we have several widgets that all have the same propertiessay the same fontforeground colorand background color rather than repeating those properties in each declarationwe can save them in dictionary and then use the *notation in the declarationslike belowargs 'fg ''blue ''bg ''white ''font ':'verdana ' 'bold ')label label(text'label '**argslabel label(text'label '**argsapply python has function called apply which ismore or lessthe equivalent of and *for calling functions you may see it in older code function variables that retain their values between calls sometimes it is useful to have variables that are local to function that retain their values between function calls since functions are objectswe can accomplish this by adding variable to the function as if it were more typical sort of object in the example below the variable count keeps track of how many times the function is called def () count count+ print( countf count=