Please see the code below:-
#!/usr/bin/python
# Filename: total.py
def total(initial=5, *numbers, **keywords):
count = initial
for number in numbers:
count += number
for key in keywords:
count += keywords[key]
return count
print(total(10, 1, 2, 3, vegetables=50, fruits=100))
Can someone please explain how is *numbers and **keywords picking up the arguments? A simple explaination is very much appreciayed Thanks in advance
Keyword-only arguments are another attribute of Python functions that have been available since Python 3.0. These arguments are specified using the '*' marker. They prompt the user to state the keyword used in the already defined function when making a call to the same function.
Variable-length arguments, varargs for short, are arguments that can take an unspecified amount of input. When these are used, the programmer does not need to wrap the data in a list or an alternative sequence. In Python, varargs are defined using the *args syntax.
5 Types of Arguments in Python Function Definition:positional arguments. arbitrary positional arguments. arbitrary keyword arguments.
Python functions can contain two types of arguments: positional arguments and keyword arguments. Positional arguments must be included in the correct order. Keyword arguments are included with a keyword and equals sign.
In your code numbers
is assigned the (1,2,3) tuple. keywords
is assigned a dictionary, containing vegetables
and fruits
.
One star (*
) defines positional arguments. This means that you can receive any number of arguments. You can treat the passed arguments as a tuple.
Two stars (**
) define keywords arguments.
The reference material is available here.
Python 2.x (before keyword-only arguments)
def foo(x, y, foo=None, *args): print [x, y, foo, args]
foo(1, 2, 3, 4) --> [1, 2, 3, (4, )] # foo == 4
foo(1, 2, 3, 4, foo=True) --> TypeError
Python 3.x (with keyword-only arguments)
def foo(x, y, *args, foo=None): print([x, y, foo, args])
foo(1, 2, 3, 4) --> [1, 2, None, (3, 4)] # foo is None
foo(1, 2, 3, 4, foo=True) --> [1, 2, True, (3, 4)]
def combo(x=None, *args, y=None): ... # 2.x and 3.x styles in one function
Although a seasoned programmer understands what happened in 2.x, it's counter-intuitive (a positional argument gets bound to foo=
regardless of keyword arguments as long as there are enough positional arguments)
Python 3.x introduces more intuitive keyword-only arguments with PEP-3102 (keyword arguments after varargs can only be bound by name)
Let's breakdown the function first.
This total function takes three parameters.
==========================================
count = initial
*we know that initial is a keyword argument that contains a value of 5. So the value of 5 is now assigned to a variable called count.
for number in numbers:
*the number is a placeholder variable for numbers.
*we know that numbers is an arbitrary parameter so it can take any number of arguments or values.
*so now the number is going to contain the arguments which is passed in the numbers parameter while executing the function.
count += number
*each time it loops through the numbers arguments and adds the count to the number and returns a count
*when count is 5, it loops through the argument and adds the first instance of the argument. This will be repeated until the loop gets exhausted.
for key in keywords:
*this is tricky because this time the parameter is dictionary type which contains keys and corresponding values to that keys.
count += keywords[key]
return count
100 + 50 + (10, 1, 2, 3) => 166.
I know this answer is too big but understanding the underlying concept of each function is a core strength of a well rounded programmer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With