# Functions in Python

Python hosting: Host, run, and code Python in the cloud!

A function is reusable code that can be called anywhere in your program. Functions improve readability of your code: it’s easier for someone to understand code using functions instead of long lists of instructions.

On top of that, functions can be reused or modified which also improve testability and extensibility.

Related Course:
Python Programming Bootcamp: Go from zero to hero

## Function definition

We use this syntax to define as function:

The def keyword tells Python we have a piece of reusable code (A function). A program can have many functions.

## Practical Example

We can call the function using function(parameters).

Output:

The function has one parameter, x. The return value is the value the function returns. Not all functions have to return something.

## Parameters

We can pass multiple variables:

Output:

If you are new to Python programming, I highly recommend this book.

Tony Sun, 03 May 2015

THe concept of scope isn't really all that clear in your example. The first code snippet will actually work, because the function isn't actually doing anything with z.

Perhaps:

`#!/usr/bin/python  def f(x,y):    print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(\$    print 'x * y = ' + str(x*y)    print str(z)   # cannot reach z, so THIS WON'T WORK z = 3f(3,2)`

Perhaps other examples of code that does work as well:

`#!/usr/bin/python  def f(x,y,a):    print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(\$    print 'x * y = ' + str(x*y)    print str(a) # can reach z, because it was passed to function f as parameter "a" z = 3f(3,2,z)`

`#!/usr/bin/python def f(x,y):    z = 3    print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(\$    print 'x * y = ' + str(x*y)    print str(z)   # z is local to function f, so it is reachable! f(3,2)`

... and an example of the confusion that can arise from reusing variable names:

`#!/usr/bin/pythonz = 5print str(z)  def f(x,y,z):    print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(\$    print 'x * y = ' + str(x*y)    print str(z) # can reach z, because it was passed to function f as parameter "z" z = 3f(3,2,z)`
Frank Sun, 03 May 2015

Hi Tony,

I extended this part to contain more code examples. It's rather late here so hope everything went fine. Thanks for the heads up!

Stuartjk Mon, 11 May 2015

Not sure how this one got missed as Tony obviously time looking at this one, but in all examples, the end of the first print line is incomplete.

print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(\$

will never work as you fail to correctly wrap the last str parameter (\$), which itself is invalid.

print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(y)

Stuartjk Mon, 11 May 2015

Also, in this example

`#!/usr/bin/pythondef doA():    a = 5def doB(a):    print a   # we pass variable as parameter, this will workdoB(3)`

It is important to note that doB will print 3 which is the value passed to it, a=5 is contained within Doa and is still never used and therefore never visible to doB or the rest of the code.

Frank Mon, 11 May 2015

Thanks stuartjk, I extended the article :-)

Frank Mon, 11 May 2015

Thanks stuartjk! It seemed to disturb nobody thus far, but you are right.
The error came from copying source code from a terminal which capped the line. I fixed it and I'll copy from an IDE in the future. I hope you enjoy my articles, more will come soon.

Nub Sun, 12 Jul 2015

Hey Frank, thank you very much for providing this tutorial set. it is the best one i have come across. i have no programming experience besides playing around in HS, and the KISS method you use made this very easy

Anuj Wed, 15 Jul 2015

Hey frank .. What does +str (x) ...+Str(y) means ???

Frank Thu, 16 Jul 2015

Hi, this converts integers/floats to strings. Integers or floats are simply bytes in the memory and you cannot output them directly to the screen. str() converts them to human readable text.

Sh Tue, 21 Jul 2015

I agree with Tony.
Right now the article states:

`#!/usr/bin/pythondef f(x,y):print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(\$print 'x * y = ' + str(x*y)print str(z) # cannot reach z, so THIS WON'T WORKz = 3f(3,2)`

but I do see 3 get printed when I run the code.

Frank Tue, 21 Jul 2015

Hi, thanks for your comment! You can print it but not modify it. Try z = 4 inside the function and it will give you an error. I will update the article.

Roger's Mod Mon, 10 Aug 2015

Oh, didn't noticed that it's also explained here, really sorry.

Roger's Mod Mon, 10 Aug 2015

Does pointers exist in Python?
I'm not sure if 'pointers' is the right word ... I mean the direction of a variable in memory.
Can you use that as a parameter in order to modify the content of a variable as you can do in C programming?

Staff Mon, 10 Aug 2015

If you mean accessing the memory address directly, this is not a standard practice in Python. The language abstracts that for the programmer, in a similar way that C abstracts assembly or assembly abstracts machine language.

In Python 2.7 you can get the memory address, but this does not work with Jython, PyPy and Iron Python. It's a little tricky but here goes:

`#!/usr/bin/env pythonx = 3print hex(id(x))`

Python functions can return multiple return values, unlike C or C++, which you can then use to set your output variables. Variables (or objects) can be passed as parameters to a function.

Staff Mon, 10 Aug 2015

Hi Roger, no problem

Petr Sun, 16 Aug 2015

Please correct me if i wrong, but in this example:

`#!/usr/bin/python  def f(x,y):    print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(y)    print 'x * y = ' + str(x*y)    z = 4 # cannot reach z, so THIS WON'T WORK z = 3f(3,2)`

we declared global variable z and then trying to use it inside function. This variable is global and should be reached everywhere in the code, isn't it? So, why cannot we change a value? and what i have to do if i want to use the same name inside the function, but for local variable? is it impossible?

Frank Sun, 16 Aug 2015

Hi Petr, It is global if we define 'global z' inside the function. If not, Python creates a local variable z and sets that to 4. printing z after f(3,2) will show z is still 3.

`#!/usr/bin/pythondef f(x,y):    print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(y)    print 'x * y = ' + str(x*y)    z = 4 # cannot reach z, so THIS WON'T WORK    print('local variable in function, z = ' + str(z))z = 3f(3,2)print('z outside function = ' + str(z))`

Thus we have two variables 'z' in this case, one outside the function and one inside. To use the global z, we must define 'global z' on top of the function. To use a global variable z (no locals):

`#!/usr/bin/pythondef f(x,y):    global z    print 'You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(y)    print 'x * y = ' + str(x*y)    z = 4 # cannot reach z, so THIS WON'T WORK    print('local variable in function, z = ' + str(z))z = 3f(3,2)print('z outside function = ' + str(z))`

To summarize, if we do not define 'global z', the global variable is out of the scope of the function. I hope you enjoy the site!

Rong Wed, 09 Sep 2015

Hi Frank,

When I run below program in https://repl.it/BG8w/2

`def f(x,y):    print ('You called f(x,y) with the value x = ' + str(x) + ' and y = ' + str(y))    print ('x * y = ' + str(x*y))    print('local variable in function, z = ' + str(z)) z = 3f(3,2)print('z outside function = ' + str(z))`

I do get this result: local variable in function, z = 3. z is accessible in f(x,y). Why?

Frank Wed, 09 Sep 2015

You can print the variable inside f(x,y), but if you try z=2 inside the function it throws an exception. The Python interpreter executes all code at the 0th level of indention, which is why you can print z. The value of z cannot be changed inside the function because it is not a global variable nor parameter.

Dear Frank,
i am trying this code and it is giving me error: method() missing 1 required positional argument: 'a'
please guide me what i am doing wrong in this code.

`def method(self,a):    return (self.a)     b=method(7)print("the value of a is", a)`
Frank Sat, 26 Dec 2015

Hi Sadia, you are mixing OOP with functional programming
Try this:

`def method(a):    return ab = method(7)print("the value of b is " + str(b))`
`def method(a):    print(a+a)method(a=[1,2,4])`