Python functions
2012 May 8 at 15:59 » Tagged as :python, ruby, reduce, vargs,
We've already taken quick glance at python functions elsewhere, and know that they are created with the
def
keyword, can have default parameters and which part of the code belongs to the function is identified by it's indentation level
When using default parameters, the PHP approach is that you need to specify the first few parameters and the remainder will be initialized with the defaults. However you cannot 'skip' parameters. For example you can't specify values param1, param2 and then param4 instead of param3. Even if param3 is defined to take a default value the call will fail. This behavior is something that PHP has in common with python except for one thing; you can use name, value pairs to specify only some of the parameters and they do not have to be in order. An example from the python docs will make this clearer.
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'): print "-- This parrot wouldn't", action, print "if you put", voltage, "volts through it." print "-- Lovely plumage, the", type print "-- It's", state, "!"
parrot(1000) # 1 positional argument parrot(voltage=1000) # 1 keyword argument parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments parrot('a million', 'bereft of life', 'jump') # 3 positional arguments parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keywordI said except for one thing , but hang on a second there is one more; default values are initialized only once, so make sure that you don't change the parameters with in the function or there will be hell to pay. Many of us have a nasty habit of using parameters that were passed in for temporary storage inside the function. If you have this habit it's perhaps better to use variable number of arguments (in python speak this is arbitrary argument lists) instead of default values.
def my_method(var1, var2, *var3)
def test_var_args_call(ar, arg2, arg3): print "ar:", ar print "arg2:", arg2 print "arg3:", arg3t kwargs = {"arg3": 3, "arg2": "two"} test_var_args_call(1, **kwargs)One last thing before you go; lets look at lambda functions. This is how you create an anonymous function in python. But they are not very readable and restricted to just one expression. In short they are almost useless but let's look at an example (from the python docs anyway)
lambda x: x + nWhat the hell is that? Python's answer to inline functions.