See More

# Using functions Now we know how to make Python show text. ```python >>> 'Hello!' 'Hello!' >>> ``` But that includes `''`. One way to show text to the user without `''` is with the print function. In Python, printing doesn't have anything to do with physical printers, it just means showing text on the screen. ```python >>> print('Hello!') Hello! >>> ``` Now we are ready for a classic example, which is also the first program in many tutorials :) ```python >>> print("Hello World!") Hello World! >>> ``` But what exactly is print? ## What are functions? Let's see what happens if we type `print` without the `('Hello')` part. ```python >>> print >>> ``` We could also type `print(print)`, it would do the same thing. Python replied to us with some information about print wrapped in `<>`. As we can see, print is a function. Functions do something when they are **called** by typing their name and parentheses. Inside the parentheses, we can pass some arguments too. In `print("hello")` the function is `print` and we give it one argument, which is `"hello"`. Functions are easy to understand, They simply **do something when they are called**. Functions run immediately when we call them, so the text appears on the screen right away when we run `print(something)`. Sometimes people think that doing `thingy = print('hello')` means that Python is going to print hello every time we type `thingy`. But **this is not correct**! `print('hello')` runs print right away, and if we type `thingy` later it's not going to run `print('hello')` again. ## Return values Now we know that `thingy = print('hello')` doesn't store the `print('hello')` call in a variable. But what does it do then? ```python >>> thingy = print('hello') hello >>> print(thingy) # thingy is now None None >>> ``` So doing `thingy = print('hello')` set `thingy` to None. Here's what happened, explained in more detail: - When we do `thingy = print('hello')`, the right side is processed first. - `print('hello')` calls the print function with the argument `'hello'`. - The function runs. It shows the word hello. - The print function **returns** None. All functions need to return something, and print returns None because there's no need to return anything else. - Now the right side has been processed. `print('hello')` returned None, so we can imagine we have None instead of `print('hello')` there, and the assignment now looks like `thingy = None`. - `thingy` is now None. Now we understand what **a return value** is. When we call the function, Python "replaces" `function(arguments)` with whatever the function returns. Calling a function without assigning the return value to anything (e.g. `print('hello')` instead of `thingy = print('hello')`) simply throws away the return value. The interactive `>>>` prompt doesn't echo the return value back because it's None. Of course, `thingy = print('hello')` is useless compared to `print('hello')` because the print function always returns None and we can do `thingy = None` without any printing. Not all functions return None. The input function can be used for getting a string from the user. ```python >>> stuff = input("Enter something:") Enter something:hello >>> stuff 'hello' >>> ``` `input("Enter something:")` showed the text `Enter something:` on the screen and waited for me to type something. I typed hello and pressed Enter. Then input returned the hello I typed as a string and it was assigned to `stuff`. Usually we want to add a space after the `:`, like this: ```python >>> stuff = input("Enter something: ") # now there's space between : and where i type Enter something: hello >>> ``` ## Handy things about print We can also print an empty line by calling print without any arguments. ```python >>> print() >>> ``` In Python, `\n` is a newline character. Printing a string that contains a newline character also prints a newline: ```python >>> print('hello\nworld') hello world >>> ``` If we want to print a real backslash, we need to **escape** it by typing two backslashes. [comment]: # (For some reason, GitHub's syntax highlighting doesn't) [comment]: # (work here.) >>> print('hello\\nworld') hello\nworld >>> We can also pass multiple arguments to the print function. We need to separate them with commas and print will add spaces between them. ```python >>> print("Hello", "World!") Hello World! >>> ``` Unlike with `+`, the arguments don't need to be strings. ```python >>> print(42, "is an integer, and the value of pi is", 3.14) 42 is an integer, and the value of pi is 3.14 >>> ``` ## Variables names and built-in things In [the previous chapter](variables.md) we learned that `if` is not a valid variable name because it's a keyword. ```python >>> if = 123 File "", line 1 if = 123 ^ SyntaxError: invalid syntax >>> ``` But `print` and `input` are not keywords, so can we use them as variable names? ```python >>> print = "hello" >>> print 'hello' >>> ``` We can, but there's a problem. Now we can't even do our hello world! ```python >>> print("Hello World!") Traceback (most recent call last): File "", line 1, in TypeError: 'str' object is not callable >>> ``` The error message complains that strings aren't callable because we just set `print` to the string `'hello'` and now we're trying to call it like a function. As you can see, **this is not a good idea** at all. Most [editors](editor-setup.md) display built-in functions with a special color, so you don't need to worry about doing this accidentally. Exit out of Python and start it again, and `print("Hello World!")` should work normally. ## Summary - `function()` calls a function without any arguments, and `function(1, 2, 3)` calls a function with 1, 2 and 3 as arguments. - When a function is called, it does something and returns something. - `function(arguments)` is "replaced" with the return value in the code that called it. For example, `stuff = function()` calls a function, and then does `stuff = the_return_value` and the return value ends up in stuff. - Python comes with `print` and `input`. They are built-in functions. - Avoid variable names that conflict with built-in functions. *** If you have trouble with this tutorial please [tell me about it](../contact-me.md) and I'll make this tutorial better. If you like this tutorial, please [give it a star](../README.md#how-can-i-thank-you-for-writing-and-sharing-this-tutorial). You may use this tutorial freely at your own risk. See [LICENSE](../LICENSE). [Previous](variables.md) | [Next](editor-setup.md) | [List of contents](../README.md#basics)