Objects (Demo1) Objects Objects represent information They - - PowerPoint PPT Presentation

objects
SMART_READER_LITE
LIVE PREVIEW

Objects (Demo1) Objects Objects represent information They - - PowerPoint PPT Presentation

Objects (Demo1) Objects Objects represent information They consist of data and behavior, bundled together to create abstractions Objects can represent things, but also properties, interactions, & processes A type of object is


slide-1
SLIDE 1

Objects

(Demo1)

slide-2
SLIDE 2

Objects

  • Objects represent information
  • They consist of data and behavior, bundled together to create abstractions
  • Objects can represent things, but also properties, interactions, & processes
  • A type of object is called a class; classes are first-class values in Python
  • Object-oriented programming:
  • A metaphor for organizing large programs
  • Special syntax that can improve the composition of programs
  • In Python, every value is an object
  • All objects have attributes
  • A lot of data manipulation happens through object methods
  • Functions do one thing; objects do many related things

2

slide-3
SLIDE 3

Example: Strings

slide-4
SLIDE 4

Representing Strings: the ASCII Standard

American Standard Code for Information Interchange 8 rows: 3 bits 16 columns: 4 bits

  • Layout was chosen to support sorting by character code
  • Rows indexed 2-5 are a useful 6-bit (64 element) subset
  • Control characters were designed for transmission

4

(Demo2)

0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1

“Bell” (\a) “Line Feed” (\n)

slide-5
SLIDE 5

Representing Strings: the Unicode Standard

http://ian-albert.com/unicode_chart/unichart-chinese.jpg

  • 137K characters
  • 146 scripts (organized)
  • Enumeration of character properties,

such as case

  • Supports bidirectional display order
  • A canonical name for every character

LATIN CAPITAL LETTER A BASKETBALL AND HOOP EIGHTH NOTE

'🏁' '♪'

5

(Demo3) https://en.wikipedia.org/wiki/List_of_Unicode_characters

slide-6
SLIDE 6

Mutation Operations

slide-7
SLIDE 7

Some Objects Can Change

First example in the course of an object changing state The same object can change in value throughout the course of computation

7

[Demo4]

👷

BABY

👨

GIRL

👪

WOMAN

👶

OLDER WOMAN jessica same_person Unicode character name All names that refer to the same object are affected by a mutation Only objects of mutable types can change: lists & dictionaries {Demo5} https://en.wikipedia.org/wiki/Playing_card_suit

slide-8
SLIDE 8

Mutation Can Happen Within a Function Call

A function can change the value of any object in its scope

8

>>> four = [1, 2, 3, 4] >>> len(four) 4 >>> mystery(four) >>> len(four) 2 >>> four = [1, 2, 3, 4] >>> len(four) 4 >>> another_mystery() # No arguments! >>> len(four) 2 def mystery(s): s.pop() s.pop() def another_mystery(): four.pop() four.pop()

pythontutor.com/composingprograms.html#code=def%20mystery%28s%29%3A%0A%20%20%20%20s.pop%28%29%0A%20%20%20%20s.pop%28%29%0A%0Afour%20%3D%20[1,%202,%203,%204]%0Amystery%28four%29&mode=display&origin=composingprograms.js&cumulative=true&py=3&rawInputLstJSON=[]&curInstr=0

def mystery(s): s[2:] = []

  • r
slide-9
SLIDE 9

Tuples

(Demo6)

slide-10
SLIDE 10

Tuples are Immutable Sequences

Immutable values are protected from mutation

10

The value of an expression can change because of changes in names or objects An immutable sequence may still change if it contains a mutable value as an element >>> turtle = (1, 2, 3) >>> ooze() >>> turtle (1, 2, 3) >>> turtle = [1, 2, 3] >>> ooze() >>> turtle ['Anything could be inside!'] >>> x + x >>> x + x Name change: Object mutation: >>> x = 2 4 >>> x = 3 6 >>> x = [1, 2] [1, 2, 1, 2] >>> x.append(3) [1, 2, 3, 1, 2, 3] >>> s = ([1, 2], 3) >>> s[0] = 4 ERROR >>> s = ([1, 2], 3) >>> s[0][0] = 4 >>> s ([4, 2], 3) >>> x + x >>> x + x Next lecture: ooze can change turtle's binding

slide-11
SLIDE 11

Mutation

slide-12
SLIDE 12

Sameness and Change

  • As long as we never modify objects, a compound object is just the totality of its pieces
  • A rational number is just its numerator and denominator
  • This view is no longer valid in the presence of change
  • A compound data object has an "identity" in addition to the pieces of which it is composed
  • A list is still "the same" list even if we change its contents
  • Conversely, we could have two lists that happen to have the same contents, but are different

12

>>> a = [10] >>> b = [10] >>> a == b True >>> b.append(20) >>> a [10] >>> b [10, 20] >>> a == b False >>> a = [10] >>> b = a >>> a == b True >>> a.append(20) >>> a [10, 20] >>> b [10, 20] >>> a == b True

slide-13
SLIDE 13

Identity Operators

Identity <exp0> is <exp1> evaluates to True if both <exp0> and <exp1> evaluate to the same object Equality <exp0> == <exp1> evaluates to True if both <exp0> and <exp1> evaluate to equal values Identical objects are always equal values

13

(Demo)

slide-14
SLIDE 14

Mutable Default Arguments are Dangerous

A default argument value is part of a function value, not generated by a call

14

pythontutor.com/composingprograms.html#code=def%20f%28s%3D[]%29%3A%0A%20%20%20%20s.append%283%29%0A%20%20%20%20return%20len%28s%29%0A%20%20%20%20%0Af%28%29%0Af%28%29%0Af%28%29&mode=display&origin=composingprograms.js&cumulative=true&py=3&rawInputLstJSON=[]&curInstr=0

>>> def f(s=[]): ... s.append(3) ... return len(s) ... >>> f() 1 >>> f() 2 >>> f() 3 Each time the function is called, s is bound to the same value!

slide-15
SLIDE 15

Mutable Functions

slide-16
SLIDE 16

Functions with behavior that changes over time

16

def square(x): return x * x >>> square(5) 25 >>> square(5) 25 >>> square(5) 25 Returns the same value when called with the same input def f(x): ... >>> f(5) 25 >>> f(5) 26 >>> f(5) 27 Return value is different when called with the same input

slide-17
SLIDE 17

Example - Withdraw

>>> withdraw(25) 75 >>> withdraw(25) 50 >>> withdraw(60) 'Insufficient funds' >>> withdraw(15) 35 >>> withdraw = make_withdraw(100) Let's model a bank account that has a balance of $100 Argument: amount to withdraw Return value: remaining balance Different return value! Where's this balance stored? Within the parent frame of the function!

17

Second withdrawal of the same amount

A function has a body and a parent environment

slide-18
SLIDE 18

Persistent Local State Using Environments

The parent frame contains the balance, the local state of the withdraw function Every call decreases the same balance by (a possibly different) amount

18

All calls to the same function have the same parent

pythontutor.com/composingprograms.html#code=def%20make_withdraw%28balance%29%3A%0A%20%20%20%20def%20withdraw%28amount%29%3A%0A%20%20%20%20%20%20%20%20nonlocal%20balance%0A%20%20%20%20%20%20%20%20if%20amount%20>%20balance%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20'Insufficient%20funds'%0A%20%20%20%20%20%20%20%20balance%20%3D%20balance%20-%20amount%0A%20%20%20%20%20%20%20%20r
slide-19
SLIDE 19

Reminder: Local Assignment

Execution rule for assignment statements:

  • 1. Evaluate all expressions right of =, from left to right
  • 2. Bind the names on the left to the resulting values in the current frame

Assignment binds name(s) to value(s) in the first frame of the current environment

19

pythontutor.com/composingprograms.html#code=def%20percent_difference%28x,%20y%29%3A%0A%20%20%20%20%20%20%20%20difference%20%3D%20abs%28x-y%29%0A%20%20%20%20%20%20%20%20return%20100%20*%20difference%20/%20x%0Adiff%20%3D%20percent_difference%2840,%2050%29&mode=display&origin=composingprograms.js&cumulative=true&py=3&rawInputLstJSON=[]&curInstr=4
slide-20
SLIDE 20

Non-Local Assignment & Persistent Local State

def make_withdraw(balance): """Return a withdraw function with a starting balance.""" def withdraw(amount): nonlocal balance if amount > balance: return 'Insufficient funds' balance = balance - amount return balance return withdraw Declare the name "balance" nonlocal at the top of the body of the function in which it is re-assigned Re-bind balance in the first non-local frame in which it was bound previously

20

(Demo)

slide-21
SLIDE 21

Non-Local Assignment

slide-22
SLIDE 22

The Effect of Nonlocal Statements

http://www.python.org/dev/peps/pep-3104/

From the Python 3 language reference: Names listed in a nonlocal statement must refer to pre-existing bindings in an enclosing scope. Names listed in a nonlocal statement must not collide with pre-existing bindings in the local scope.

http://docs.python.org/release/3.1.3/reference/simple_stmts.html#the-nonlocal-statement

Effect: Future assignments to that name change its pre-existing binding in the first non-local frame of the current environment in which that name is bound. nonlocal <name>, <name>, ... Python Docs: an "enclosing scope"

22

Current frame

slide-23
SLIDE 23

The Many Meanings of Assignment Statements

x = 2 Status Effect

  • No nonlocal statement
  • "x" is not bound locally

Create a new binding from name "x" to object 2 in the first frame of the current environment

  • No nonlocal statement
  • "x" is bound locally

Re-bind name "x" to object 2 in the first frame

  • f the current environment
  • nonlocal x
  • "x" is bound in a

non-local frame

  • "x" also bound locally

SyntaxError: name 'x' is parameter and nonlocal

  • nonlocal x
  • "x" is not bound in a non-

local frame SyntaxError: no binding for nonlocal 'x' found

  • nonlocal x
  • "x" is bound in a non-local

frame Re-bind "x" to 2 in the first non-local frame of the current environment in which "x" is bound

23

slide-24
SLIDE 24

Python Particulars

Python pre-computes which frame contains each name before executing the body of a function. Within the body of a function, all instances of a name must refer to the same frame. Local assignment

24

pythontutor.com/composingprograms.html#code=def%20make_withdraw%28balance%29%3A%0A%20%20%20%20def%20withdraw%28amount%29%3A%0A%20%20%20%20%20%20%20%20if%20amount%20>%20balance%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20'Insufficient%20funds'%0A%20%20%20%20%20%20%20%20balance%20%3D%20balance%20
slide-25
SLIDE 25

Mutable Values & Persistent Local State

Mutable values can be changed without a nonlocal statement. Name-value binding cannot change because there is no nonlocal statement Mutable value can change

25

Name bound

  • utside of

withdraw def Element assignment changes a list goo.gl/y4TyFZ

slide-26
SLIDE 26

Multiple Mutable Functions

(Demo)

slide-27
SLIDE 27

Referential Transparency, Lost

  • Expressions are referentially transparent if substituting an expression with its value

does not change the meaning of a program.

  • Mutation operations violate the condition of referential transparency because they do

more than just return a value; they change the environment. mul(add(2, mul(4, 6)), add(3, 5)) mul(add(2, 24 ), add(3, 5)) mul( 26 , add(3, 5))

27

pythontutor.com/composingprograms.html#code=def%20f%28x%29%3A%0A%20%20%20%20x%20%3D%204%0A%20%20%20%20def%20g%28y%29%3A%0A%20%20%20%20%20%20%20%20def%20h%28z%29%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20nonlocal%20x%0A%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20x%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20x%20%2B%20y%20%2B%20z%0A%20%20%20%20%20%20%20%20return%20h%0A%20%20%20%20return%20g%0Aa%20%3D%20f%281%29%0Ab%20%3D%20a%282%29%0Atotal%20%3D%20b%283%29%20%2B%20b%284%29&mode=display&origin
slide-28
SLIDE 28

Environment Diagrams

slide-29
SLIDE 29

Go Bears!

29

def oski(bear): def cal(berk): nonlocal bear if bear(berk) == 0: return [berk+1, berk-1] bear = lambda ley: berk-ley return [berk, cal(berk)] return cal(2)

  • ski(abs)

Return Value Global frame

  • ski

func oski(bear)[parent=G] f1: oski bear func abs(...) [parent=G] Return Value Return Value Return Value cal func cal(berk) [parent=f1] f2: cal func λ(ley) [parent=f2] [parent=f1] berk 2 f3: cal [parent=f1] 2 berk list 1

3 1

f4: λ [parent=f2] list 1

2

ley 2 [parent=G]

[2, [3, 1]]

slide-30
SLIDE 30

Summary

  • Nonlocal allows for functions whose behavior changes over time
  • When declaring a variable nonlocal, we move part of the function's local state

to its parent

  • There are various rules for which variables may be declared nonlocal
  • Nonlocal gives us a new type of assignment, where we change the binding in a

parent instead

30