Exercises
To make writing and testing your exercises much easier:
Download the
exercises test filesExtract the ZIP file
Write your exercises in the provided Python files
Testing Your Exercises
Each exercise has automated tests written for it already.
To check whether your exercise passes the tests, type python test.py FUNCTION_NAME (where FUNCTION_NAME is the name of the function you’re working on).
Once your code has passed the tests, you’ll see some variation of this message:
$ python test.py is_email
Testing is_email
..
----------------------------------------------------------------------
Ran 2 tests in 1.151s
OK
You can also just type python test.py to see a list of all exercises.
Intro Exercises
These exercises are all in the intro.py file in the exercises directory.
Edit the appropriate function in that file to complete each exercise.
To run the tests, from the exercises folder, type python test.py <function_name>, like this:
$ python test.py has_vowel
Hint
Match objects are always “truthy” and None is always “falsey”. Truthy means when you convert something to a boolean, it’ll be True.
You can convert the result of re.search to a boolean to get True or False for a match or non-match like this:
>>> bool(re.search(r"hello", sentence))
True
>>> bool(re.search(r"hi", sentence))
False
Has Vowels
Create a function has_vowel, that accepts a string and returns True if the string contains a vowel (a, e, i, o, or u) returns False otherwise.
Tip
Modify the has_vowel function in the intro module.
Your function should work like this:
>>> has_vowel("rhythm")
False
>>> has_vowel("exit")
True
Is Integer
Create a function is_integer that accepts a string and returns True if the string represents an integer.
By our definition, an integer:
Consists of 1 or more digits
May optionally begin with
-Does not contain any other non-digit characters.
Tip
Modify the is_integer function in the intro module.
Your function should work like this:
>>> is_integer("")
False
>>> is_integer(" 5")
False
>>> is_integer("5000")
True
>>> is_integer("-999")
True
>>> is_integer("+999")
False
>>> is_integer("00")
True
>>> is_integer("0.0")
False
Is Fraction
Create a function is_fraction that accepts a string and returns True if the string represents a fraction.
By our definition a fraction consists of:
An optional
-characterFollowed by 1 or more digits
Followed by a
/Followed by 1 or more digits, at least one of which is non-zero (the denominator cannot be the number
0).
Tip
Modify the is_fraction function in the intro module.
Your function should work like this:
>>> is_fraction("")
False
>>> is_fraction("5000")
False
>>> is_fraction("-999/1")
True
>>> is_fraction("+999/1")
False
>>> is_fraction("00/1")
True
>>> is_fraction("/5")
False
>>> is_fraction("5/0")
False
>>> is_fraction("5/010")
True
>>> is_fraction("5/105")
True
>>> is_fraction("5 / 1")
False
Substitution Exercises
These exercises are all in the substitution.py file in the exercises directory.
Edit the appropriate function in that file to complete each exercise.
To run the tests, from the exercises folder, type python test.py <function_name>, like this:
$ python test.py normalize_jpeg
Normalize JPEG Extension
Make a function that accepts a JPEG filename and returns a new filename with jpg lowercased without an e.
Tip
Modify the normalize_jpeg function in the substitution module.
Hint
Lookup how to pass flags to the re.sub function.
Example usage:
>>> normalize_jpeg('avatar.jpeg')
'avatar.jpg'
>>> normalize_jpeg('Avatar.JPEG')
'Avatar.jpg'
>>> normalize_jpeg('AVATAR.Jpg')
'AVATAR.jpg'
Normalize Whitespace
Make a function that replaces all instances of one or more whitespace characters with a single space.
Tip
Modify the normalize_whitespace function in the substitution module.
Example usage:
>>> normalize_whitespace("hello there")
"hello there"
>>> normalize_whitespace("""Hold fast to dreams
... For if dreams die
... Life is a broken-winged bird
... That cannot fly.
...
... Hold fast to dreams
... For when dreams go
... Life is a barren field
... Frozen with snow.""")
'Hold fast to dreams For if dreams die Life is a broken-winged bird That cannot fly. Hold fast to dreams For when dreams go Life is a barren field Frozen with snow.'
Compress blank lines
Write a function that accepts a string and an integer N and compresses runs of N or more consecutive empty lines into just N empty lines.
Tip
Modify the compress_blank_lines function in the substitution module.
Example usage:
>>> compress_blank_lines("a\n\n\nb", max_blanks=1)
'a\n\nb'
>>> compress_blank_lines("a\n\nb", max_blanks=0)
'a\nb'
>>> compress_blank_lines("a\n\nb", max_blanks=2)
'a\n\nb'
>>> compress_blank_lines("a\n\n\n\nb\n\n\nc", max_blanks=2)
'a\n\n\nb\n\n\nc'
Normalize URL
I own the domain treyhunner.com. I prefer to link to my website as https://treyhunner.com, but I have some links that use http or use a www subdomain.
Write a function that normalizes all www.treyhunner.com and treyhunner.com links to use HTTPS and remove the www subdomain.
Tip
Modify the normalize_domain function in the substitution module.
Example usage:
>>> normalize_domain("http://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/")
'https://treyhunner.com/2015/12/python-list-comprehensions-now-in-color/'
>>> normalize_domain("https://treyhunner.com/2016/02/how-to-merge-dictionaries-in-python/")
'https://treyhunner.com/2016/02/how-to-merge-dictionaries-in-python/'
>>> normalize_domain("http://www.treyhunner.com/2015/11/counting-things-in-python/")
'https://treyhunner.com/2015/11/counting-things-in-python/'
>>> normalize_domain("http://www.treyhunner.com")
'https://treyhunner.com'
>>> normalize_domain("http://trey.in/give-a-talk")
'http://trey.in/give-a-talk'
Linebreaks
Write a function that accepts a string and converts linebreaks to HTML in the following way:
text is surrounded by paragraphs
text with two or more line breaks between is considered two separate paragraphs
text with a single line break between is separated by a
<br>
Tip
Modify the convert_linebreaks function in the substitution module.
Example usage:
>>> convert_linebreaks("hello")
'<p>hello</p>'
>>> convert_linebreaks("hello\nthere")
'<p>hello<br>there</p>'
>>> convert_linebreaks("hello\n\nthere")
'<p>hello</p><p>there</p>'
>>> convert_linebreaks("hello\nthere\n\nworld")
'<p>hello<br>there</p><p>world</p>'
I send out 1 Python exercise every week through a Python skill-building service called Python Morsels.
If you'd like to improve your Python skills every week, sign up!
You can find the Privacy Policy here.reCAPTCHA protected (Google Privacy Policy & TOS)