Learning Python Part 2

Languages are complex Strings are at the heart of many programs. We asks our users for information that our code requires to do the task. We provide feedback to the users when the task has completed or failed. We share information with other systems. This is almost always done using strings and string manipulation.

In part 2 we are going to look at how we use strings. How we can change these strings using the Python library. How we can give the information back to the user in useful manner and how to get information from the user to begin with.

Defining strings

Strings are defined in a number of different ways, all of which use quotes.

It is recommended that you choose either the single or double quote method and stick to it throughout your project for the sake of consistency.

Straightforward situations look like this

# Single quote example
sentence = 'Where is my coffee?'
# Double quote example
sentence = "Where is my coffee?"

You will come across more complicated scenarios in which case it is recommended you use these variations

# Single quote with quotation
sentence = 'I shouted "Hooray!"'
# Double quote with word contraction
sentence = "You shouldn't have"

When the options above aren’t enough you’ve got these options

# Triple quote
sentence = """You shouldn't have shouted "Hooray!" so soon."""
# Escape Sequence
sentence = "You shouldn't have shouted \"Hooray!\" so soon."

The triple quote method allows for multiple line strings. It is preferred that the string starts immediately after the opening quotes and the closing quotes are on their own line. Whitespace is honored in multiple line quote, so pay attention to any spacing you might use.

multiple_line = """Hello,
    I am learning Python.
        The end.
"""
print(multiple_line)
> Hello,
      I am learning Python.
          The end.

A \ in a string is not simply a backslash, it is known as the escape sequence. Here are some examples of common uses of the escape sequence.

# \' will insert a single quote.
sentence = "I won\'t shout."
print(sentence)
> I won't shout.
# \" will insert a double quote.
sentence = "I shouted \"Hooray!\""
print(sentence)
> I shouted "Hooray!"
# \\ will insert a backslash.
sentence = "He\\She went to the market."
print(sentence)
> He\She went to the market.
# \t will insert a tab.
sentence = "Name\tAge"
print(sentence)
> Name    Age
# \n will insert a new line.
sentence = "My first sentence.\nMy second sentence."
print(sentence)
> My first sentence.
  My second sentence.

The escape sequence is not recommended for readability reasons. You can find out more about string literals and escape sequences in the Python documentation

Comments

It is common practice to provide comments with your code. Comments are used to provide context to the reader of the code.

""" Documentation Comment

    This uses the triple quote method, specifically the
    double quote.

    These comments can be used to generate documentation
    and provide a summary of methods or classes.
    """
    
# You can also comment using a single hash
#
# Do not forget to keep comments accurate or it
# will mislead the reader

full_name = "" # In-line comments should be avoided

Arithmetic operators on strings

We can combine different strings together using concatenation +.

first_name = "John"
last_name = "Doe"
separator = " "
full_name = first_name + separator + last_name
print(full_name)
> John Doe

Repetition can be achieved using the * symbol.

cheer = "Hooray! "
cheer = cheer * 3
print(cheer)
> Hooray! Hooray! Hooray! 

String Methods

The string type has a number of methods for you to use. These methods are made available by the Python library. More information on string methods can be found here

Using the capitalize method, only the first character will be uppercase and the remaining characters will be lowercase.

print("wHeRe iS My CoFFee".capitalize())
print(" hello".capitalize())
> Where is my coffee 123
>  hello

Using the lower method will return a string with all lowercase characters.

print("wHeRe iS My CoFFee".lower())
> where is my coffee

Similarly, using the upper method will return the string with all uppercase characters.

sentence = "wHeRe iS My CoFFee"
print(sentence.upper())
> WHERE IS MY COFFEE

Using the title method, will capitalize the first letter of each word separated by a space. Apostrophe’s used for word contraction may lead to undesired results. You can find a way around that scenario here

print("wHeRe iS My CoFFee".title())
print("you're a python legend".title())
> Where Is My Coffee
> You'Re A Python Legend

More string methods

You can do a lot more than simply change the capitalization of your string. For example, we can count how many occurrences there are of a string within a string.

sentence = "how much wood would a wood chuck chuck if a wood chuck could chuck wood"
print(sentence.count("wood"))
print(sentence.count("would"))
> 4
> 1

We can also remove any unwanted whitespace from the leading and trailing part of our string using the strip method.

sentence = "   wHeRe iS My CoFFee   "
print(sentence)
print(sentence.strip())
>   wHeRe iS My CoFFee   
> wHeRe iS My CoFFee

The strip method can take on a chars argument, a string containing the characters to strip from the leading and trailing parts of our string. The chars argument is case sensitive.

sentence = "   wHeRe iS My CoFFee   "
characters_to_remove = "e fsw"
print(sentence.strip(characters_to_remove))
> HeRe iS My CoFF

Using the replace method we can substitute an old set of characters for a new set of characters within a string.

sentence = "the dog chased the cat"
sentence = sentence.replace("dog", "canine")
sentence = sentence.replace("cat", "feline")
print(sentence)
sentence = sentence.replace("the", "a")
print(sentence)
> the canine chased the feline
> a canine chased a feline

The replace method takes a third argument, count, which can limit how many occurrences to replace in the string.

sentence = "words words words"
sentence = sentence.replace("words", "three", 1)
sentence = sentence.replace("words", "simple", 1)
print(sentence)
> three simple words

Chaining methods

Until now we’ve seen a variety of ways to manipulate strings using methods. These methods can be chained together. Have a look at the example below which tries to create a friendly readable string from a filename.

file_name = "[Book]_learning-python-book-part-2.pdf"
print(file_name)
file_name = file_name.lower()
print(file_name)
file_name = file_name.replace("book", "", 1)
print(file_name)
file_name = file_name.replace("pdf", "")
print(file_name)
file_name = file_name.strip("[]_.")
print(file_name)
file_name = file_name.replace("-", " ")
print(file_name)
file_name = file_name.title()
print(file_name)
> [Book]_learning-python-book-part-2.pdf
> [book]_learning-python-book-part-2.pdf
> []_learning-python-book-part-2.pdf
> []_learning-python-book-part-2.
> learning-python-book-part-2
> learning python book part 2
> Learning Python Book Part 2

We can chain the methods together to look like this

file_name = "[Book]_learning-python-book-part-2.pdf"
file_name = file_name.lower().replace("book", "", 1).replace("pdf", "")
file_name = file_name.strip("[]_.").replace("-", " ").title()
print(file_name)
> Learning Python Book Part 2

Strings as immutables

Strings are immutable but what does that even mean? Simply it just means that it can’t be modified once created. The methods actually return completely new strings and don’t manipulate the original variable at all. We can however assign the return value of the method to our variable.

sentence = "hello world"
print(sentence)
print(sentence.upper())
print(sentence)
sentence = sentence.upper()
print(sentence)
> hello world
> HELLO WORLD
> hello world
> HELLO WORLD

String formatting

The string type has a format method which is an extremely powerful way to present information as a string. The method works a little like the replace method and uses a replacement field surrounded by curly braces {}.

sentence = "My {} sentence"
replacement_field = "original"
print(sentence.format(replacement_field))
> My original sentence

We can do this with multiple variables at a time, We can use implicit positioning. The first parameter in format will replace the first occurrence of a replacement field, the second parameter will replace the second occurrence of a replacement field and so on.

sentence = "{} {} {}"
day_1 = "Monday"
day_2 = "Tuesday"
day_3 = "Wednesday"
month_1 = "January"
month_2 = "February"
month_3 = "March"

print(sentence.format(day_1, day_2, day_3))
print(sentence.format(month_1, month_2, month_3))
> Monday Tuesday Wednesday
> January February March

We can get more control of which parameter to use with our replacement field using explicit positioning, The replacement field has a parameter index value. The parameter index value begins at zero and indicates the position of which parameter to use. This means that the first parameter, first_name has an index of zero, the second parameter last_name will then have an index of one.

first_name = "John"
last_name = "Doe"

full_name = "{1}, {0}"

print(full_name.format(first_name, last_name))
> Doe, John

We can also use explicit positioning using a field name which is many times more readable. {last_name} is a replacement field using the field name last_name. The way we provide parameters to format changes as well. We assign the variable my_last_name to the field name last_name

my_first_name = "John"
my_last_name = "Doe"
full_name = "{last_name}, {first_name}"
print(full_name.format(
    last_name = my_last_name,
    first_name = my_first_name))
Doe, John

Now that we can position the parameters, we can apply the Format Specification to them. We do this by using a colon : and then the rules to apply after it. One of the rules we can apply is the minimum amount of character space a parameter can use. This is called padding. In this example we specify a replacement field with a padding of ten.

word1 = "Hello"
word2 = "World"
sentence = "{0:10}{1}"
print(sentence.format(word1, word2))
> Hello     World

We can also indicate the style in which to apply padding, left < aligned, right > aligned or even center ^ aligned.

#!/usr/bin/env python3
left = "Left"
center = "Center"
right = "Right"
output = "|{0:<10}|{1:^20}|{2:>10}|"
print(output.format(left, center, right))
> |Left      |       Center       |     Right|

We can also format other data types like decimal and float, which has a default precision of six and applies rounding.

print("{:d}".format(12)) # Decimal
print("{:f}".format(123.123456789)) # Float
12
123.123457

This example looks at specifying the precision to use .2f, combining it with padding 8.2f as well as choosing zero as a fill character 08.2f.

print("{:.2f}".format(123.123456789))
print("{:8.2f}".format(123.123456789))
print("{:08.2f}".format(123.123456789))
123.12
  123.12
00123.12

User Input

The input method provides the user with a prompt and waits for them to type in information which we assign to a variable.

name = input("Name: ")
print(name)
> Name: John
> John

We can use type casting with the input method, this can lead to errors for the user so be careful.

age = int(input("Age: "))
print(age)
age = int(input("Age: "))
print(age)
> Age: 12
> 12
> Age: twelve
> ValueError: invalid literal for int() with base 10: 'twelve'

Finally we can achieve something like this.

first_name = str(input("What is your first name? "))
middle_name = str(input("What is your middle name? "))
last_name = str(input("What is your last name? "))
age = int(input("How old are you? "))

first_name = first_name.capitalize()
middle_name = middle_name.capitalize()
last_name = last_name.capitalize()

candidate = "{age:3} - {first_name}, {middle_name_initial:.1}. {last_name}"
print(candidate.format(
    first_name = first_name,
    middle_name_initial = middle_name,
    last_name = last_name,
    age = age
))
> What is your first name? John
> What is your middle name? Matthew
> What is your last name? Doe
> How old are you? 12
>  12 - John, M. Doe

I hope you enjoyed reading this. Feel free to give me feedback on Twitter or report an issue on GitHub (links at the bottom of the page)