lecture 9: memory python - cornell university · p = shape.point2(1,2) q = shape.point2(10,7) p id1...

Post on 21-Jul-2020

2 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Lecture 9: Memory in Python

CS 1110Introduction to Computing Using Python

[E. Andersen, A. Bracy, D. Fan, D. Gries, L. Lee, S. Marschner, C. Van Loan, W. White]

http://www.cs.cornell.edu/courses/cs1110/2020sp

• You can use both office hours (held by profs and TAs) and consulting hours (held by undergrad consultants). See CS1110 office/consulting hours calendar on course website.

• Register your A1 group on CMS now, before submitting any A1 file!  Cannot form group after you submit.

• A1 first submission due Feb 19 Wedn at 11:59pm• Read §10.0‐10.2, 10.4‐10.6, 10.8‐10.13 before next lecture

Announcements

2

No-laptop zone on your left

front

ok

Review:  Conditionals and Testing

Nested Conditionals

def what_to_wear(raining, freezing):if raining:

if freezing:print("Wear a waterproof coat.")

else:print("Bring an umbrella.")

else:if freezing:

print("Wear a warm coat!")else:

print("A sweater will suffice.")4

Nested Conditionals

def what_to_wear(raining, freezing):if raining:

if freezing:print("Wear a waterproof coat.")

else:print("Bring an umbrella.")

else:if freezing:

print("Wear a warm coat!")else:

print("A sweater will suffice.")5

# an alternativeif ________:

print( ... )elif ________:

print ( ... )elif ________ :

print ( ... )else:

print ( ... )

Program Flow and Testing

Can use print statements to examine program flow

# Put max of x, y in z

if x > y:

z = xelse:

z = y

6

Program Flow and Testing

Can use print statements to examine program flow

'before if''inside if x>y''after if'

# Put max of x, y in zprint('before if')if x > y:

print('inside if x>y')z = x

else:print('inside else (x<=y)')z = y

print('after if')

“traces” or “breadcrumbs”

x must have been greater

than y

7

Memory in Python

Global Space

• Global Space What you “start with” Stores global variables Lasts until you quit Python

x = 4

4x

Global  Space 

Enter Heap Space

• Global Space What you “start with” Stores global variables Lasts until you quit Python

• Heap Space Where “folders” are stored Have to access indirectly

4x

Global  Space  Heap  Space 

x = 4p = shape.Point2(1,2)q = shape.Point2(10,7)

id1p

id1Point2

1x

2y

id2Point2

10x

7y

id2q

p & q live in Global Space.  Their folders live on the Heap.

Calling a Function Creates a Call Frame

4x

Global  Space  Heap  Space 

def adjust_x_coord(pt, n):pt.x = pt.x + n

x = 4p = shape.Point2(1,2)adjust_x_coord(p, x)

id1p

id1Point2

1x

2y

1

Call Frameadjust_x_coord 1

id1pt4n

What’s in a Call Frame?• Boxes for parameters at the start of the function• Boxes for variables local to the function as they are created

Calling a Function Creates a Call Frame

4x

Global  Space  Heap  Space 

def adjust_x_coord(pt, n):pt.x = pt.x + n

x = 4p = shape.Point2(1,2)adjust_x_coord(p, x)

id1p

id1Point2

1 5x

2y

1

Call Frameadjust_x_coord 1

id1pt4n

What’s in a Call Frame?• Boxes for parameters at the start of the function• Boxes for variables local to the function as they are created

NoneRETURN

Putting it all together

• Global Space What you “start with” Stores global variables Lasts until you quit Python

• Heap Space Where “folders” are stored Have to access indirectly

• Call Frames Parameters Other variables local to function Lasts until function returns

id2pGlobal  Space 

id2Heap  Space 

f1

f2Ca

ll Fram

es

Two Points Make a Line

14

start = shape.Point2(0,0)stop = shape.Point2(0,0)print("Where does the line start?")x = input("x: ")start.x = int(x)y = input("y: ")start.y = int(y)print("The line starts at ("+x+ ","+y+ ")." ) print("Where does the line stop?")x = input("x: ")stop.x = int(x)y = input("y: ")stop.y = int(y)print("The line stops at ("+x+ ","+y+ ")." )

Where does the line start?x: 1y: 2The line starts at (1,2).Where does the line stop?x: 4y: 6The line stops at (4,6).

start = shape.Point2(0,0)stop = shape.Point2(0,0)print("Where does the line start?")x = input("x: ")start.x = int(x)y = input("y: ")start.y = int(y)print("The line starts at ("+x+ ","+y+ ")." ) print("Where does the line stop?")x = input("x: ")stop.x = int(x)y = input("y: ")stop.y = int(y)print("The line stops at ("+x+ ","+y+ ")." )

Redundant Code is BAAAAD!

15

Let’s make a function!

16

def configure(pt, role): print("Where does the line " + role + "?")x = input("x: ")pt.x = int(x)y = input("y: ")pt.y = int(y)print("The line " +role+ "s at ("+x+ ","+y+ ")." )

start = shape.Point2(0,0)stop = shape.Point2(0,0)configure(start, "start")configure(stop, "stop")

def configure(pt, role): print("Where does the line " + role + "?")x = input("x: ")pt.x = int(x)y = input("y: ")pt.y = int(y)print("The line " +role+ "s at ("+x+ ","+y+ ")." )

start = shape.Point2(0,0)stop = shape.Point2(0,0)configure(start, "start")configure(stop, "stop")

Still a bit of redundancy

17

Yay, Helper Functions!

18

def get_coord(name):x = input(name+": ")return int(x)

def configure(pt, role): print("Where does the line " + role + "?")pt.x = get_coord("x")pt.y = get_coord("y") print("The line " +role+ "s at ("+x+ ","+y+ ")." )

start = shape.Point2(0,0)stop = shape.Point2(0,0)configure(start, "start")configure(stop, "stop")

Frames and Helper Functions• Functions can call each other!• Each call creates a new call frame• Writing the same several lines of code in 2 places? Or

code that accomplishes some conceptual sub-task? Or your function is getting too long? Write a helper function! Makes your code easier to read write edit debug

19

Drawing Frames for Helper Functions (1)

def get_coord(name):x = input(name+": ")return int(x)

def configure(pt, role): print("Where does the line " + role + "?")pt.x = get_coord("x")pt.y = get_coord("y") print("The line " +role+ "s at ("+str(pt.x)+

","+str(pt.y)+ ")." ) start = shape.Point2(0,0)configure(start, "start") 20

12

3

45

configure 3

id1pt

6

Call Frames

“start”role

Global  Space Heap  Space id1startid1

Point2

0 x

0y

4

Q: what do you do next?

def get_coord(name):x = input(name+": ")return int(x)

def configure(pt, role): print("Where does the line " + role + "?")pt.x = get_coord("x")pt.y = get_coord("y") print("The line " +role+ "s at ("+str(pt.x)+

","+str(pt.y)+ ")." ) start = shape.Point2(0,0)configure(start, "start") 21

12

3

45

configure 3 4

id1pt

6

"start"role

A: Cross out the configure call frame.B: Create a get_coord call frame.C: Cross out the 4 in the call frame.D: A & B E: B & C

Call Frames

Global  Space Heap  Space id1startid1

Point2

0x

0y

def get_coord(name):x = input(name+": ")return int(x)

def configure(pt, role): print("Where does the line " + role + "?")pt.x = get_coord("x")pt.y = get_coord("y") print("The line " +role+ "s at ("+str(pt.x)+

","+str(pt.y)+ ")." ) start = shape.Point2(0,0)configure(start, "start") 22

get_coord

"x"name

1

configure

id1pt

"start"role

12

3

45

6

Not done! Do not cross out!!

Drawing Frames for Helper Functions (2)

3 4Call Frames

Global  Space Heap  Space id1startid1

Point2

0x

0y

def get_coord(name):x = input(name+": ")return int(x)

def configure(pt, role): print("Where does the line " + role + "?")pt.x = get_coord("x")pt.y = get_coord("y") print("The line " +role+ "s at ("+str(pt.x)+

","+str(pt.y)+ ")." ) start = shape.Point2(0,0)configure(start, "start") 23

get_coord

"x"name

1 2

Drawing Frames for Helper Functions (3)

configure

id1pt

"start"role

12

3

45

6

"1"x

1RETURN

3 4Call Frames

Global  Space Heap  Space id1startid1

Point2

0x

0y

def get_coord(name):x = input(name+": ")return int(x)

def configure(pt, role): print("Where does the line " + role + "?")pt.x = get_coord("x")pt.y = get_coord("y") print("The line " +role+ "s at ("+str(pt.x)+

","+str(pt.y)+ ")." ) start = shape.Point2(0,0)configure(start, "start") 24

get_coord

"x"name

1 2

Drawing Frames for Helper Functions (4)

configure 3 4

id1pt

"start"role

12

3

45

6

x

1RETURN

"1"

Call Frames

Global  Space Heap  Space id1startid1

Point2

0 x

0y

1 5

The Call Stack• The set of function frames

drawn in call order• Functions frames are “stacked” Cannot remove one above

w/o removing one below

• Python must keep the entire stack in memory Error if it cannot hold stack

(“stack overflow”)

25

function1calls

calls

calls

calls

function2

function3

function4

function5

26

Errors and the Call Stack

def get_coord(name):x = input(name+": ")return int(x1)

def configure(pt, role): print("Where does the line " + role + "?")pt.x = get_coord("x")pt.y = get_coord("y") print("The line " +role+ "s at ("+x+ ","+y+ ")." )

start = shape.Point2(0,0)configure(start, "start")

12

3

45

6

Where does the line start?x: 1Traceback (most recent call last):

File "v3.py", line 15, in <module>configure(start, "start")

File "v3.py", line 9, in configurept.x = get_coord("x")

File "v3.py", line 5, in get_coordreturn str(x1)

NameError: name 'x1' is not defined

Modules and Global Space

27

id5math id5module

Import

• Creates a global variable (same name as module)

• Puts variables, functions of module in a folder

• Puts folder id in the global variable

pi 3.141592 e 2.718281

functions

Heap  Space Global  Space 

>>> import math

Modules vs Objects

28id3p

id3

x 5

y 2 z 3

Point3

>>> import math>>> math.pi

>>> p = shapes.Point3(5,2,3)>>> p.x

Global Space 

id5math

Heap Space

id5math module

pi 3.141592 e 2.718281

functions

29

Functions and Global SpaceA function definition• Creates a global variable (same name as function)• Creates a folder for body• Puts folder id in the global variable

INCHES_PER_FT = 12def get_feet(ht_in_inches):

return ht_in_inches // INCHES_PER_FT

Global Space

12INCHES_PER_FT

id6get_feet

id6

Bodyfunction

Heap Space

Body

Function Definition vs. Call Frame

30

Global Space

Call Frame(memory for function call )

It’s alive!

Heap Space(Function definition goes here)

Storage in Python

id2p id2

f1

f2

• Global Space What you “start with” Stores global variables, modules & functions Lasts until you quit Python

• Heap Space Where “folders” are stored Have to access indirectly

• Call Frame Stack Parameters Other variables local to function Lasts until function returns

Heap  Space Global  Space 

Call Fram

e Stack

top related