Exercises
To make writing and testing your exercises much easier:
Download the
exercises test files
Extract 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)