Python print() and beyond
Tags: python, codenewbie, codequality
Published: 2020-12-20 12:51:05

## Beyond the `print()` function in _Python_

Hey guys, today I am going to talk about some features of the `print()` function in python. You will probably have come across some of these functions while others could seem new.

Let's start by understanding the basics of the print function. 
In python, the built-in print function is used to print all kinds of stuff - text, numbers, objects, dictionaries etc.
But how does this function handle that ?! You might think; it just can do it, it was made for that. But in reality, the print function in python can only handle strings.

Under the hood, anything you pass to the `print()` function gets converted to a string before being printed to your screen. That mean it will make use of the `str()` type casting and convert all other data types to strings before displaying them to your console/terminal.
Now that you know how the `print()` work, let's dive into its features.

Furthermore, print doesn't know how to print text to the screen. I won't go detail into that for now. Later in this post, you will know what happens under it.

Basically, you can print whatever you want . The simplest example you have come across is `print("Hello World!")`
It take a string enclosed in double quotes or single quotes and prints it.
You can also print multiple stuff by simply separating them with comas as such :
```python
name = "Mike"
age = 24
print("Hello", name, "Your age is", age)
# output : Hello Mike Your age is 24
```

You can as well print text that takes more than a line. In this case, you will be using the newline escape character `\n`
Example :
```python
print("Hello \nWorld")
# Output : 
#Hello
#World
```
You can also format text with it. Making use of `f-strings`
```python
name = "Samson"
print(f"Hello {name}")
# Output : Hello Samson
```

The example above showcase the basics of the print function. It can take a variable number of values to print. Other than that, there are also some keyword arguments.
Let's dive into them

## 1. Separator
`print()` allows you to decide what separates text we print with it. By default, all the values you pass to it are separated by empty strings. But we change that. It suffices to include `sep=` followed by whatever you want to separate your text.
Let's make use of the previous example.
```python
name = "Mike"
age = 24
print("Hello", name, "Your age is", age, sep="-")
# output : Hello-Mike-Your age is-24
```
You notice that all what we passed into it separately are separated by a `-`. You can modify that however you want. You just need to make sure the separator is a valid string.

## 2. Ending
You can specify by whatever you want your output to end with. By default, what you print end with a newline escape character `\n`. Let's change that and see what happens
```python
# without modified end character
print("Hello James")
print("How are you doing")
# Output
# Hello James
# How are you doing

# with modified end character
print("Hello James", end="")
print("How are you doing", end="")
# Output
# Hello JamesHow are you doing
```
If we execute that, we notice the text is no more separated by a new line. Let's try that again! But this time, we want it to end by `y` and move to a new line.
```python
print("Hello James", end="y\n")
print("How are you doing", end="y\n")
```
We get the following output
```
Hello Jamesy
How are you doingy
```
Yay it worked !

## 3. Writing to a file
At the beginning of this post, I said python doesn't know how to print stuff to the screen by itself. It rather uses `sys.stdout` and writes your text to that file. 
Wait what ! Print will write text to a file object which I sent to your screen via `sys.stdout`. Therefore, you can modify this behaviour too in order to have this printed elsewhere.
Let's give it a try.
Write the following code:
```python
with open("hello.txt", "w") as file_object:
        print("This message is for you", file=file_object)
```
Executing the above will end in a file name `hello.text` in the same directory with the text *This message is for you* in it. 
Therefore, we can direct where we want our text to be printed. In this case, we created a file name `hello.txt` and use the `file` keyword argument to direct the result to be written to that file rather than our terminal. You can use this to direct any result to wherever you want, even through a socket connection.

## 4. Flushing

This one requires an example. Let's have one!
```python
import time

names = ["John", "Sylvia", "Smith"]

for name in names:
	print(name, end=" ")
	time.sleep(1)
```
What this code should do is; print a name after a second. Try and run it and see what happens. 
You notice it unexpectedly waits and print all at once.  This is because since it's on a single line, it is all buffered (packed) before we get it. 
[Read more about buffers here](https://en.m.wikipedia.org/wiki/Data_buffer#:~:text=In%20computer%20science%2C%20a%20data,from%20one%20place%20to%20another.&text=However%2C%20a%20buffer%20may%20be,comparable%20to%20buffers%20in%20telecommunication.)
But we could go around that by simply adding the `flush=` keyword argument to the print function. By default it it set to `False`. Setting it to true will ensure every print statement is executed and freed from buffer before the next one.
The following code will make it :
```python
import time

names = ["John", "Sylvia", "Smith"]

for name in names:
	print(name, end=", ", flush=True)
	time.sleep(1)
```
If you run it. It will print a name, sleep for a second and print another, all on the same line. 
Yay we did it !

You have reached the end of this post. 
[![ko-fi](https://www.ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/S6S01ULOV)