Braithwaite I/O

Python 3.6 f-Strings

02 November 2018

 

f-strings are TOTALLY AWESOME!

In [1]:
website = 'Braithwaite I/O'

f'Welcome to {website}!'
Out[1]:
'Welcome to Braithwaite I/O!'
 

I found out about them at PyCon Canada 2017 at Mariatta Wijaya keynote.

In [2]:
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/kGd1TVfP_Ds" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>')
 
/usr/local/lib/python3.7/site-packages/IPython/core/display.py:689: UserWarning: Consider using IPython.display.IFrame instead
  warnings.warn("Consider using IPython.display.IFrame instead")
Out[2]:
 

They also support expressions inside the { }

In [3]:
f'Welcome to {website.upper()}!'
Out[3]:
'Welcome to BRAITHWAITE I/O!'
 

Even dict

In [4]:
portfolio = {'AAPL': 222.77, 'RHT': 122.31, 'GOOGL': 1111.77}
In [5]:
f'${portfolio['GOOGL']}USD'
 
  File "<ipython-input-5-552a7f3505aa>", line 1
    f'${portfolio['GOOGL']}USD'
                       ^
SyntaxError: invalid syntax
 

While that's a little embarrassing...

In [ ]:
f"${portfolio['GOOGL']}USD"
 

But look what else you can do...

In [ ]:
f"${portfolio['GOOGL']:,}USD"
 

Hey I heard you like dates and times...

In [ ]:
import datetime

NOW = datetime.datetime.now()

f'This notebook was run on {NOW:%d %B %Y} at {NOW:%H:%M}!'
 

You can use them in class...

In [ ]:
class Drink:
    def __init__(self, name, caffine):
        self.name = name
        self.caffine = caffine

    def __str__(self):
        return f'{self.name}'

    def caffine_for_quantity(self, size=100000):
        return (
            f'{self.name} has {self.caffine*size:.0f} '
            f'mg for {size/1000:.0f} grams.'
        )
In [ ]:
coffee = Drink('Coffee', .0004)

coffee.caffine_for_quantity()
In [ ]:
f'{coffee.caffine_for_quantity(459732)}'
In [ ]:
import timeit

format_funcs = {
    'f-strings': """
def format(superhero, rank):
    return f'{superhero} has a rank of {rank}!'
""",
    '%-formatting': """
def format(superhero, rank):
    return '%s has a rank of %s!' % (superhero, str(rank))
""",
    '.format()': """
def format(superhero, rank):
    return '{} has a rank of {}!'.format(superhero, str(rank))
""",
    'concatenation +': """
def format(superhero, rank):
    return superhero + ' has a rank of ' + str(rank) + '!'
""",
    'concatenation ()': """
def format(superhero, rank):
    return superhero, ' has a rank of ', str(rank), '!'
"""
}

test_func = """def test_format():
    for superhero in ('Wonder Woman', 'Supergirl', 'Batman', 'Robin'):
        for rank in range (1, 101):
            format(superhero, rank)
"""

data = []

for key, func in format_funcs.items():
    data.append({
        'method': key,
        'time': float(timeit.timeit('test_format()', func + test_func, number=10000))
    })
In [ ]:
%matplotlib inline
import pandas as pd

df = pd.DataFrame([
    {'method': 'f-strings', 'time': 1.2825216680000153},
    {'method': '%-formatting', 'time': 2.282235770999989},
    {'method': '.format()', 'time': 2.983771015000002},
    {'method': 'concatenation +', 'time': 1.9718771689999812},
    {'method': 'concatenation ()', 'time': 1.402194948999977}
])
 

and it's fast...

In [ ]:
df.sort_values('time').plot(
    kind='barh', 
    x='method', 
    y='time', 
    figsize=(12, 6), 
    fontsize=14, 
    legend=False
)
 

Want to work with me?

GrantMatch is looking for a Student Co-op -- Junior Software Developer

https://fairtax.ca/careers/junior-software-developer/