Flash card challenge: Difference between revisions
imported>Jesstess No edit summary |
imported>Jeremyb m (Reverted edits by 31.25.3.98 (talk) to last revision by Jesstess) |
||
(11 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
[[File:Flashcards.jpg|right|300px]] |
|||
== Project == |
== Project == |
||
Line 12: | Line 14: | ||
== Problem statement == |
== Problem statement == |
||
Write a Python script that takes a file as an argument and quizzes the user based on the contents of that file until the user quits the program. Questions should be selected randomly (as opposed to going in order through the file), and the user should type in their guess. The script should say whether or not a guess is correct and provide the correct answer if an incorrect answer is given. |
Write a Python script that takes a file containing flash card questions and answers as an argument and quizzes the user based on the contents of that file until the user quits the program. Questions should be selected randomly (as opposed to going in order through the file), and the user should type in their guess. The script should say whether or not a guess is correct and provide the correct answer if an incorrect answer is given. |
||
The file will contain flash card challenges in the form: |
The file will contain flash card challenges in the form: |
||
Line 48: | Line 50: | ||
=== Step 1: Get the questions from a fixed flash card file=== |
=== Step 1: Get the questions from a fixed flash card file=== |
||
Download http://web.mit.edu/jesstess/www/IntermediatePythonWorkshop/state_capitals.txt. |
|||
⚫ | Write the code to open and read |
||
⚫ | Write the code to open and read <code>state_capitals.txt</code> (we'll deal with getting a variable filename from the user later). Create a dictionary, where each comma-separated question and answer become a key and value in the dictionary. Note that each line in the file ends in a newline, which you'll need to remove from the word. |
||
<b>Step 1 resources</b>: |
<b>Step 1 resources</b>: |
||
Line 64: | Line 68: | ||
Write a <code>while</code> loop that loops forever and at each iteration through the loop randomly selects a key/value pair from the questions dictionary and prints the question. |
Write a <code>while</code> loop that loops forever and at each iteration through the loop randomly selects a key/value pair from the questions dictionary and prints the question. |
||
To randomly select a key from the dictionary, you can use the <code>random</code> module, and in particular the <code>random.choice</code> function. |
|||
When you run your script, to break out of the <tt>while</tt> loop you can press <tt>Control</tt> and then (while still holding down Control) <tt>c</tt>. |
|||
<b>Step 2 resources</b>: |
|||
<ul> |
|||
<li> |
|||
<code>while</code> loops: http://en.wikibooks.org/wiki/Python_Programming/Flow_control#While_loops |
|||
</li> |
|||
<li> |
|||
Dictionary manipulation: http://docs.python.org/tutorial/datastructures.html#dictionaries. In particular, look at getting a list of the dictionary's keys using the <code>keys</code> method. |
|||
</li> |
|||
Selecting a random value from a list using the <code>random</code> module: http://docs.python.org/library/random.html#random.choice |
|||
</li> |
|||
</ul> |
|||
Line 69: | Line 89: | ||
Inside your <code>while</code> loop, write the code that gets an answer from the user and compares it to the answer retrieved from the questions dictionary. If the answer is correct, say so. If the answer is incorrect, say so and print the correct answer. |
Inside your <code>while</code> loop, write the code that gets an answer from the user and compares it to the answer retrieved from the questions dictionary. If the answer is correct, say so. If the answer is incorrect, say so and print the correct answer. |
||
You can get input from a user using the <code>raw_input</code> function. |
|||
It is up to you how strict you want to be with a user's answer. Do you want capitalization to matter? |
|||
<b>Step 3 resources</b>: |
|||
<ul> |
|||
<li> |
|||
Using <code>raw_input</code> to get data from the user: http://docs.python.org/library/functions.html#raw_input |
|||
</li> |
|||
</ul> |
|||
Line 74: | Line 105: | ||
The <code>while</code> loop currently runs forever. Pick a special phrase (like "Exit") that the user can type instead of an answer that signals that they want to quit the program. When that special phrase is given, print a goodbye message and <code>break</code> out of the <code>while</code> loop to end the program. |
The <code>while</code> loop currently runs forever. Pick a special phrase (like "Exit") that the user can type instead of an answer that signals that they want to quit the program. When that special phrase is given, print a goodbye message and <code>break</code> out of the <code>while</code> loop to end the program. |
||
<b>Step 4 resources</b>: |
|||
<ul> |
|||
<li> |
|||
Using the <code>break</code> keyword to break out of a loop: http://docs.python.org/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops |
|||
</li> |
|||
<li> |
|||
Making decisions with <code>if</code>, <code>elif</code>, and <code>else</code>: http://docs.python.org/tutorial/controlflow.html#if-statements |
|||
</li> |
|||
</ul> |
|||
=== Step 5: Get the quiz questions file from the user=== |
=== Step 5: Get the quiz questions file from the user=== |
||
Write the code to get the quiz questions file from a command line argument. Handle the case where a user forgets to supply a file. |
Write the code to get the quiz questions file from a command line argument. Handle the case where a user forgets to supply a file; in this case, print an error message saying they need to supply a file, and then exit the program using the <code>exit()</code> function. |
||
<b>Step 5 resources</b>: |
<b>Step 5 resources</b>: |
||
Line 89: | Line 130: | ||
</li> |
</li> |
||
</ul> |
</ul> |
||
===Checking your work=== |
===Checking your work=== |
||
Line 94: | Line 136: | ||
Try out your script on the following quiz files: |
Try out your script on the following quiz files: |
||
* http://web.mit.edu/jesstess/www/IntermediatePythonWorkshop/metric.txt |
|||
* http://web.mit.edu/jesstess/www/IntermediatePythonWorkshop/french_food.txt |
|||
Does your script handle the case where the user forgets to provide a filename? |
|||
Line 99: | Line 145: | ||
Modify your script to quiz based on either the question or answer. e.g. for state capitals, the quizzer would present either a state, expecting its capital as the answer, or a capital, expecting its state as the answer. |
Modify your script to quiz based on either the question or answer. e.g. for state capitals, the quizzer would present either a state, expecting its capital as the answer, or a capital, expecting its state as the answer. |
||
===Congratulations!=== |
===Congratulations!=== |
||
You've implemented a substantial, useful script in Python from scratch. Keep practicing! |
You've implemented a substantial, useful script in Python from scratch to help people study. Keep practicing! |
||
[[File:Fireworks.png|150px]] |
|||
[[File:Balloons.png|150px]] |
Latest revision as of 15:38, 25 November 2013
Project
Write a flash card quizzer from scratch.
Goals
- practice breaking down a problem and solving it in Python from scratch
- practice command line option parsing
- practice reading from files
- practice working with dictionaries and for loops
Problem statement
Write a Python script that takes a file containing flash card questions and answers as an argument and quizzes the user based on the contents of that file until the user quits the program. Questions should be selected randomly (as opposed to going in order through the file), and the user should type in their guess. The script should say whether or not a guess is correct and provide the correct answer if an incorrect answer is given.
The file will contain flash card challenges in the form:
question,answer question,answer question,answer question,answer ...
For example, a state capitals flash card file might have the form:
Alabama,Montgomery Alaska,Juneau Arizona,Phoenix ...
Running the quizzer script with this file might look like this:
$ python quizzer.py state_capitals.txt Texas? Austin Correct! Nice job. New Mexico? Santa Fe Correct! Nice job. Oregon? Portland Incorrect. The correct answer is Salem. Virginia? Richmond Correct! Nice job. Virginia? Exit Goodbye
Breaking down the problem
Step 1: Get the questions from a fixed flash card file
Download http://web.mit.edu/jesstess/www/IntermediatePythonWorkshop/state_capitals.txt.
Write the code to open and read state_capitals.txt
(we'll deal with getting a variable filename from the user later). Create a dictionary, where each comma-separated question and answer become a key and value in the dictionary. Note that each line in the file ends in a newline, which you'll need to remove from the word.
Step 1 resources:
- File input and output: http://docs.python.org/tutorial/inputoutput.html#reading-and-writing-files.
- Stripping characters (like whitespace and newlines) from a string: http://docs.python.org/library/stdtypes.html#str.strip.
Step 2: Randomly select questions from the question dictionary
Write a while
loop that loops forever and at each iteration through the loop randomly selects a key/value pair from the questions dictionary and prints the question.
To randomly select a key from the dictionary, you can use the random
module, and in particular the random.choice
function.
When you run your script, to break out of the while loop you can press Control and then (while still holding down Control) c.
Step 2 resources:
-
while
loops: http://en.wikibooks.org/wiki/Python_Programming/Flow_control#While_loops -
Dictionary manipulation: http://docs.python.org/tutorial/datastructures.html#dictionaries. In particular, look at getting a list of the dictionary's keys using the
keys
method.
Selecting a random value from a list using the
random
module: http://docs.python.org/library/random.html#random.choice
Step 3: Get and check the user's answer
Inside your while
loop, write the code that gets an answer from the user and compares it to the answer retrieved from the questions dictionary. If the answer is correct, say so. If the answer is incorrect, say so and print the correct answer.
You can get input from a user using the raw_input
function.
It is up to you how strict you want to be with a user's answer. Do you want capitalization to matter?
Step 3 resources:
-
Using
raw_input
to get data from the user: http://docs.python.org/library/functions.html#raw_input
Step 4: Allow the user to quit the program
The while
loop currently runs forever. Pick a special phrase (like "Exit") that the user can type instead of an answer that signals that they want to quit the program. When that special phrase is given, print a goodbye message and break
out of the while
loop to end the program.
Step 4 resources:
-
Using the
break
keyword to break out of a loop: http://docs.python.org/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops -
Making decisions with
if
,elif
, andelse
: http://docs.python.org/tutorial/controlflow.html#if-statements
Step 5: Get the quiz questions file from the user
Write the code to get the quiz questions file from a command line argument. Handle the case where a user forgets to supply a file; in this case, print an error message saying they need to supply a file, and then exit the program using the exit()
function.
Step 5 resources:
- Command line argument parsing: http://docs.python.org/library/argparse.html#module-argparse.
- Getting and checking the number of command line arguments: http://docs.python.org/library/sys.html.
Checking your work
Try out your script on the following quiz files:
- http://web.mit.edu/jesstess/www/IntermediatePythonWorkshop/metric.txt
- http://web.mit.edu/jesstess/www/IntermediatePythonWorkshop/french_food.txt
Does your script handle the case where the user forgets to provide a filename?
Bonus challenge
Modify your script to quiz based on either the question or answer. e.g. for state capitals, the quizzer would present either a state, expecting its capital as the answer, or a capital, expecting its state as the answer.
Congratulations!
You've implemented a substantial, useful script in Python from scratch to help people study. Keep practicing!