# 8.4. π©βπ» Decoding a FunctionΒΆ

In general, when you see a function definition you will try figure out what the function does, but,
unless you are writing the function, you wonβt care *how it does it*.

For example, here is a summary of some functions we have seen already.

`input`

takes one parameter, a string. It is displayed to the user. Whatever the user types is returned, as a string.`int`

takes one parameter. It can be of any type that can be converted into an integer, such as a floating point number or a string whose characters are all digits.

Sometimes, you will be presented with a function definition whose operation is not so neatly summarized as above. Sometimes you will need to look at the code, either the function definition or code that invokes the function, in order to figure out what it does.

To build your understanding of any function, you should aim to answer the following questions:

How many parameters does it have?

What is the type of values that will be passed when the function is invoked?

What is the type of the return value that the function produces when it executes?

If you try to make use of functions, ones you write or that others write, without being able to answer these questions, you will find that your debugging sessions are long and painful.

The first question is always easy to answer. Look at the line with the function definition, look inside the parentheses, and count how many variable names there are.

The second and third questions are not always so easy to answer. In Python, unlike some other programming languages, variables are not declared to have fixed types, and the same holds true for the variable names that appear as formal parameters of functions. You have to figure it out from context.

To figure out the types of values that a function expects to receive as parameters, you can look at the function invocations or you can look at the operations that are performed on the parameters inside the function.

Here are some clues that can help you determine the type of object associated with any variable, including a function parameter. If you seeβ¦

`len(x)`

, then x must be a string or a list (or other type of sequence). x canβt be a number or a Boolean.`x - y`

, x and y must be numbers (integer or float)`x + y`

, x and y must both be numbers, both be strings, or both be lists`x[3]`

, x must be a string or a list containing at least four items.`x[y:z]`

, x must be a sequence (string or list), and y and z must be integers`x and y`

, x and y must be Boolean`for x in y`

, y must be a sequence (string or list); if y is a string, x must be a character; if y is a list, x could be of any type.

**Check your understanding: decode this function definition**

- 0
- Count the number of variable names inside the parenetheses on line 1.
- 1
- Count the number of variable names inside the parenetheses on line 1.
- 2
- Count the number of variable names inside the parenetheses on line 1.
- 3
- x, y, and z.
- Can't tell
- You can tell by looking inside the parentheses on line 1. Each variable name is separated by a comma.

How many parameters does function cyu3 take?

```
def cyu3(x, y, z):
if x - y > 0:
return y -2
else:
return len(z) + 3
```

- integer
- x - y, y-2, and x+3 can all be performed on integers.
- float
- x - y, y-2, and x+3 can all be performed on floats.
- list
- x - y, y-2, and x+3 can't be performed on lists.
- string
- x - y and y-2 can't be performed on strings.
- Can't tell
- You can tell from some of the operations that are performed on them.

What are the possible types of variables x and y?

```
def cyu3(x, y, z):
if x - y > 0:
return y -2
else:
return len(z) + 3
```

- integer
- len() can't be performed on integers.
- float
- len() can't be performed on floats.
- list
- len() can be performed on lists, but also on other things.
- string
- len() can be performed on strings, but also on other things.
- list, string or other sequence
- len() can be performed on all strings or sequence types

What are the possible types of variable z?

```
def cyu3(x, y, z):
if x - y > 0:
return len(z) -2
else:
return len(z) + 3
```

- integer
- len() returns an integer, so both len()+3 and len()-2 produces an integer.
- float
- Neither len()+3 or len()-2 could produce a float.
- list
- Neither return statement produce a list.
- string
- Neither return statement produce a string.
- Can't tell
- You can tell from the expressions that follow the word return.

What are the possible types of the return value from cyu3?

```
def cyu3(x, y, z):
if x - y > 0:
return len(z) - 2
else:
return len(z) + 3
```