'How do I assign output of a function to a string variable?

I'm trying to create a 3 x 3 board with number from 1-9 with this function:

board =(1,2,3,4,5,6,7,8,9)
def board_display():
    print("_" *6)
    for row in range(3):
        print("".join((f"|{board[row*3+ position]}" for position in range(3))) + "|")
        print("_" *6)
board_display()

Output:

|1|2|3|
______
|4|5|6|
______
|7|8|9|
______

Now I want to assign this board to a variable, say "New_board", so that I can use this variable in other functions. How can I do that?



Solution 1:[1]

Try this:

board='\n'.join(['|'+'|'.join(map(str,range(1+3*j,4+3*j)))+'|\n'+'-'*6
                 for j in range(3)])

This is the result:

>>> print(board)
|1|2|3|
------
|4|5|6|
------
|7|8|9|
------

Solution 2:[2]

If possible you should simply append all lines to a list and then join it with newlines (as to mimic the behaviour of print()). Like this:

def board_display():
    res = []
    res.append("_" *6)
    for row in range(3):
        res.append("".join((f"|{board[row*3+ position]}" for position in range(3))) + "|")
        res.append("_" *6)

    return "\n".join(res)

Although I highly advice against it, you could use redirect_stdout() from contextlib. Then your code would look like this:

import io
from contextlib import redirect_stdout

res = io.StringIO()
with redirect_stdout(res):
   board_display()

output = res.getvalue()  # Turn the StringIO() into 'str'

Like I said though, you should definitely use the previously mentioned method (since you are able to modify the function) - but take this as a fun fact and hidden gem in the standard library ?.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Riccardo Bucco
Solution 2 Bluenix