Difference between revisions of "CSC111 Lab 5 2015"
Line 339: | Line 339: | ||
Notice what happens when you add the <tt>end=""</tt> construct in the print statement. It changes the way the print() function ends printing what it has to print. By default, if you do not have an <tt>end=""</tt> construct, '''print()''' brings the cursor to the next line. But this behavior can be changed. We are going to use this, in the new program below. | Notice what happens when you add the <tt>end=""</tt> construct in the print statement. It changes the way the print() function ends printing what it has to print. By default, if you do not have an <tt>end=""</tt> construct, '''print()''' brings the cursor to the next line. But this behavior can be changed. We are going to use this, in the new program below. | ||
<br /> | <br /> | ||
− | ==Functions and Stick Figure== | + | ==Functions and Stick Figure, Version 1== |
<br /> | <br /> | ||
* This section will be cleaner if you start a new program, rather than add to an existing program. | * This section will be cleaner if you start a new program, rather than add to an existing program. | ||
Line 431: | Line 431: | ||
</source> | </source> | ||
<br /> | <br /> | ||
+ | ==Functions and Stick Figure, Version 2== | ||
+ | <br /> | ||
+ | * Use the same approach to create this stick figure: | ||
+ | <br /> | ||
+ | <source lang="text"> | ||
+ | /+=====> | ||
+ | \O___ | ||
+ | | | ||
+ | | | ||
+ | / \ | ||
+ | / \ | ||
+ | </source> | ||
+ | <br /> | ||
+ | * Try to organize your functions similarly to the way I did. Below is my stickFigure1() function. Figure out the missing pieces! Note: I added '1' suffix to all the function names to differentiate them from the functions used for the Version-1 stick-figure. | ||
+ | <br /> | ||
+ | ::<source lang="python"> | ||
+ | def stickFigure1(): | ||
+ | leftForearm1() | ||
+ | sword1() | ||
+ | leftArm1() | ||
+ | head1() | ||
+ | rightArm1() | ||
+ | body1() | ||
+ | leftThigh1() | ||
+ | rightThigh1() | ||
+ | leftCalf1() | ||
+ | rightCalf1() | ||
+ | </source> | ||
</showafterdate> | </showafterdate> | ||
<br /><br /> | <br /><br /> |
Revision as of 22:01, 23 February 2015
--D. Thiebaut (talk) 12:17, 22 February 2015 (EST)
<showafterdate after="20150225 11:00" before="20150601 00:00">
Contents
Preparation
- Copy paste the program below in a new Idle window, and call it lab5Companion.py.
- Save your new program to your working directory, where you normally save your lab programs.
- Run the program. It should create 3 text files in your folder. You will be using them in this lab. The files are called:
- chocoQuotes.txt
- hargitay.txt
- joanneHarris.txt
# lab5Companion.py # D. Thiebaut # This program will create several files in the directory # where you will run it. # The files are retrieved from a Web server, stored temporarily # in a string, and stored in a local file on your disk. # The 3 files are very, very short. # Their names are: # - chocoQuotes.txt # - hargitay.txt # - joanneHarris.txt import urllib.request # the lib that handles the url stuff # main program def main(): # list of files to retrieve fileNames = [ "chocoQuotes.txt", "hargitay.txt", "joanneHarris.txt" ] # get each file, one at a time for fileName in fileNames: # url where the files are located url = "http://cs.smith.edu/~dthiebaut/111/files/" + fileName # fetch the file and put its contents in the # strign text. response = urllib.request.urlopen( url ) text = response.read().decode( 'UTF-8' ) # write text to file, in the same directory as this program. file = open( fileName, "w" ) file.write( text + "\n" ) file.close() # give feedback to user. print( "File {0:1} created in your folder".format( fileName ) ) main()
Splitting Long Strings
In this section you will see how to take text represented as a multi-line string, and process it various ways.
- Long strings that span several lines can be created by enclosing them in triple quotes; either triple single-quotes (), or triple double-quotes (""").
- Copy/paste the program below in a new program. You may call it lab5.py
# lab5.py text = """Chocolate Chocolate is the first luxury. It has so many things wrapped up in it: Deliciusness in the moment, childhood memories, and that grin-inducing feeling of getting a reward for being good. --Mariska Hargitay""" def main(): # make sure main knows that this variable exists global text # split the long string into individual lines lines = text.split( "\n" ) # print each line for line in lines: print( line ) main()
- Run the program. Verify that it outputs the entirety of the text.
- Just to make sure we understand what the variable lines contain, make your program print lines, with a simple print( lines ) statement.
- Observe that it's just a regular Python list.
Challenge #1 |
- Modify your program, and make it print the poem so that each line is centered in a field of 60 spaces. You must use the text variable, and print its line. Do not create a new version of the poem!
- Expected output
Chocolate
Chocolate is the first luxury.
It has so many things wrapped up in it:
Deliciusness in the moment,
childhood memories,
and that grin-inducing
feeling of getting a reward for being good.
--Mariska Hargitay
Challenge #2 |
- Make your program print the first line of the poem, centered, but also in uppercase.
- Make it display the other lines centered, without changing their case.
- Expected output
CHOCOLATE
Chocolate is the first luxury.
It has so many things wrapped up in it:
Deliciusness in the moment,
childhood memories,
and that grin-inducing
feeling of getting a reward for being good.
--Mariska Hargitay
Challenge #3 |
- One more modification. Now make your program print the last line right-justified in a field of 60 spaces.
- The first line is still in upper-case.
- Make it display the other lines centered, without changing their case.
- Expected output
CHOCOLATE
Chocolate is the first luxury.
It has so many things wrapped up in it:
Deliciusness in the moment,
childhood memories,
and that grin-inducing
feeling of getting a reward for being good.
--Mariska Hargitay
Challenge #4 |
- Make your program print the poem in a box. The top and bottom lines have 50 dashes in them.
- Expected output
+--------------------------------------------------+
| CHOCOLATE |
| Chocolate is the first luxury. |
| It has so many things wrapped up in it: |
| Deliciusness in the moment, |
| childhood memories, |
| and that grin-inducing |
| feeling of getting a reward for being good. |
| --Mariska Hargitay|
+--------------------------------------------------+
Reading Text From File
- Open Finder or Windows Explorer and go to the folder that contains your lab5.py program, as well as your lab5Companion.py programs. Make sure the folder contains the 3 text files you created earlier.
- Open the file name hargitay.txt. Verify that it contains the same poem we have been playing with.
- Either create a new program or add a new main() function to your existing program (rename the original main, main2(), maybe?), and put the code below in the new function:
def main(): fileName = "hargitay.txt" file = open( fileName, "r" ) lines = file.readlines() file.close() for line in lines: print( line )
- Run the program. Observe its output.
- The reason for the double-spacing is that each line read from the file contains a '\n' at the end of it. And when you print such a line, the print() function adds its own \n at the end. This is why you get a blank line in between lines.
- One way to remove the '\n' at the end of each line is to print the line as follows: print( line.rstrip() ). The rstrip() method right-strips the string of all white-space characters, which include spaces, tabs, and '\n'-characters.
Challenge #5 |
- Make your program get the name of the file from the user, with an input() statement.
- Then, make your program output the contents of the file in a box, as you did in Challenge 4.
- Test your program by providing it with different file names:
- hargitay.txt
- joanneHarris.txt
- chocoQuotes.txt
- Adjust the width of the box if necessary.
Challenge #6 |
- Exact same challenge as Challenge 5, but this time start with this program, where I have replaced the .readlines() method with .read().
def main(): fileName = input( "File name? " ) file = open( fileName, "r" ) text = file.read() file.close() print( "The type of text is", type( text ) ) print( "text = ", text )
- Note
- when Python says that something is of type <class 'str'>, it means that it is a string.
Writing Text to File
- Try this new version of main:
def main(): fileName = "hargitay.txt" file = open( fileName, "r" ) text = file.read() file.close() text = text.replace( "chocolate", "carrot" ) text = text.replace( "Chocolate", "Carrot" ) file = open( fileName, "w" ) file.write( text + "\n" ) file.close()
- Open Finder or Windows Explorer, and take a look at the file "hargitay.txt", either with TextEdit or with Notepad. See anything different?
- BTW, You can recreate the original file by running the lab5Companion.py program again.
Challenge #7 |
- Modify the program so that it prompts the user for
- The name of the file to read from and write to, and
- a word
- and make the program read the file, replace the word chocolate in it with the word the user picked, and save the resulting text back to the file.
- Verify that your program works correctly and modifies the file you select and replaces chocolate with the word you choose.
Moodle Submission
Submit your solution program for Challenge #7 to Moodle, in the Lab 5 PB 7 section.
Functions
Preparation
- Try the following statements in the Python console:
>>> def test():
print( "hello" )
print( "there" )
>>> test()
>>> def test():
print( "hello", end="" )
print( "there" )
>>> test()
>>> def test():
print( "hello", end="-" )
print( "there" )
>>> test()
>>>
Notice what happens when you add the end="" construct in the print statement. It changes the way the print() function ends printing what it has to print. By default, if you do not have an end="" construct, print() brings the cursor to the next line. But this behavior can be changed. We are going to use this, in the new program below.
Functions and Stick Figure, Version 1
- This section will be cleaner if you start a new program, rather than add to an existing program.
- Add this code section to your new program:
def head(): print( " o" ) def leftArm(): print( " /", end="" ) def torso(): print( "O", end="" ) def rightArm(): print( "\\" ) def leftLeg(): print( " /", end="" ) def rightLeg(): print( " \\" ) def stickFigure(): head() leftArm() torso() rightArm() leftLeg() rightLeg() def main(): stickFigure() main()
- Take a close look at the program. Locate the end="" construct, which prevents the print from going to the next line when it's done.
- Notice also the "\\" string. Because the '\' character is used to print special characters, like '\n' (new line), or '\t' (tab), if we want to print a regular backslash character, we have to use 2 backslashes next to each other.
- Run the program. Notice how it displays a stick figure.
Functions and Stick Figure, Version 2
- Modify the stick figure program so that it looks like the code below:
def head(): print( " o" ) def leftArm(): print( " /", end="" ) def torso(): print( "O", end="" ) def rightArm(): print( "\\" ) def leftLeg(): print( " /", end="" ) def rightLeg(): print( " \\" ) def body(): leftArm() torso() rightArm() def newStickFigure(): head() body() leftLeg() rightLeg() def main(): newStickFigure() main()
- Observe how the code is different, and the new function body() is used to display the body of the stick figure (torso plus arms).
- Using the example of body(), add a new function called legs() that will call leftLeg() and rightLeg() to draw both legs. Modify newStickFigure() by removing the calls to leftLeg() and rightLeg(), and adding instead a call to legs(). Your new function should look something like this:
def newStickFigure(): head() body() legs()
Functions and Stick Figure, Version 2
- Use the same approach to create this stick figure:
/+=====>
\O___
|
|
/ \
/ \
- Try to organize your functions similarly to the way I did. Below is my stickFigure1() function. Figure out the missing pieces! Note: I added '1' suffix to all the function names to differentiate them from the functions used for the Version-1 stick-figure.
def stickFigure1(): leftForearm1() sword1() leftArm1() head1() rightArm1() body1() leftThigh1() rightThigh1() leftCalf1() rightCalf1()
</showafterdate>