What is the purpose of f before a string in Python?

What does f mean before a string in Python? I wonder what the f in print(f'Column names are {"-".join(row)}') does. When I tried deleting it, the string Column names are {"-".join(row)} became a normal string. Can you explain the purpose of f here?

import csv

with open('CSV_test.txt') as csv_file: 
    csv_reader = csv.reader(csv_file, delimiter=',')
    line_count = 0
    for row in csv_reader:
        if line_count == 0:
            print(f'Column names are {"-".join(row)}')
            line_count += 1
        else:
            print(f'\t{row[0]} works in the {row[1]} '
                  f'department, and was born in {row[2]}.')
            line_count += 1
    print(f'Processed {line_count} lines.')

I’ve worked with Python for years, and this comes up often! The f in your string refers to an f-string, introduced in Python 3.6. F-strings let you embed expressions directly into a string using {}. In your example, "-".join(row) takes all the elements in the list row, joins them with a - as a separator, and places the result inside the string.

For instance, if row = ["1", "2", "3"], this line:

print(f'Column names are {"-".join(row)}')  

will output:

Column names are 1-2-3  

So, in short, the f makes it possible to include evaluated expressions directly within a string in a clean and readable way. If you remove the f, the string will lose this dynamic behavior and display the code as plain text. Cool, right? :smile:

Exactly, Richaa! I’ve been exploring Python alternatives to f-strings, so here’s another way to achieve the same result if you’re curious: using the str.format() method. While f-strings are newer and more concise, the .format() method works for embedding dynamic content too. Here’s how you’d do it:

print('Column names are {}'.format('-'.join(row)))  

This produces the same result as an f-string:

Column names are 1-2-3  

It’s a bit more verbose, but it was the go-to method before Python 3.6. Plus, it still works perfectly if you’re using an older Python version. So, if someone ever asks what does f mean in Python, you can also tell them about these alternatives!

Nice point, Priyanka! While both f-strings and str.format() are great options, here’s another approach I often use when I want more control or flexibility: list comprehension. This ensures all elements are properly converted to strings (especially helpful with mixed data types):

print('Column names are ' + '-'.join([str(item) for item in row]))  

This works the same way by combining each element in row with a -, but explicitly converts each element to a string using str(item). So if row = [1, 2, 3] (numbers, not strings), you’d still get:

Column names are 1-2-3  

It’s always good to know these alternatives, even though f-strings are my personal favorite for readability. By the way, it’s always fun explaining what does f mean in Python—such a simple feature, yet so powerful!