61a lecture 13
play

61A Lecture 13 Second withdrawal 50 Different of the same amount - PDF document

A Function with Behavior That Varies Over Time Let's model a bank account that has a balance of $100 Argument: Return value: >>> withdraw(25) amount to withdraw remaining balance 75 >>> withdraw(25) 61A Lecture 13 Second


  1. A Function with Behavior That Varies Over Time Let's model a bank account that has a balance of $100 Argument: Return value: >>> withdraw(25) amount to withdraw remaining balance 75 >>> withdraw(25) 61A Lecture 13 Second withdrawal 50 Different of the same amount return value! >>> withdraw(60) 'Insufficient funds' Wednesday, September 26 >>> withdraw(15) Where's this 35 balance stored? >>> withdraw = make_withdraw(100) Within the function! 2 Persistent Local State Reminder: Local Assignment Assignment binds names to values in the current local frame A function with a parent frame The parent contains local state Every call changes the balance Execution rule for assignment statements: 1. Evaluate all expressions right of =, from left to right. 2. Bind the names on the left the resulting values in the first frame of the current environment. http://goo.gl/StRZP 3 4 Example: http://goo.gl/wcF71 Non-Local Assignment & Persistent Local State The Effect of Nonlocal Statements nonlocal <name> , <name 2>, ... def make_withdraw(balance): """Return a withdraw function with a starting balance.""" Effect : Future references to that name refer to its pre-existing binding in the first non-local frame of def withdraw(amount): the current environment in which that name is bound. Declare the name "balance" nonlocal nonlocal balance Python Docs: an "enclosing scope" if amount > balance: return 'Insufficient funds' From the Python 3 language reference : balance = balance - amount Names listed in a nonlocal statement must refer to Re-bind balance where it pre-existing bindings in an enclosing scope. was bound previously return balance Names listed in a nonlocal statement must not collide with pre-existing bindings in the local scope. return withdraw http://docs.python.org/release/3.1.3/reference/simple_stmts.html#the-nonlocal-statement Demo http://www.python.org/dev/peps/pep-3104/ 5 6

  2. The Many Meanings of Assignment Statements Python Particulars x = 2 Python pre-computes which frame contains each name before Status Effect executing the body of a function. Create a new binding from name "x" • No nonlocal statement Therefore, within the body of a function, all instances of a to object 2 in the first frame of • "x" is not bound locally the current environment. name must refer to the same frame. • No nonlocal statement Re-bind name "x" to object 2 in the • "x" is bound locally first frame of the current env. • nonlocal x Re-bind "x" to 2 in the first non- • "x" is bound in a local frame of the current non-local frame environment in it is bound. Local assignment • nonlocal x SyntaxError: no binding for nonlocal • "x" is not bound in 'x' found a non-local frame • nonlocal x • "x" is bound in a SyntaxError: name 'x' is parameter non-local frame and nonlocal • "x" also bound locally 7 8 Mutable Values & Persistent Local State Creating Two Different Withdraw Functions Mutable values can be changed without a nonlocal statement. Mutable value can change Demo Name-value binding cannot change 9 10 The Benefit of Non-Local Assignment Multiple References to a Single Withdraw Function •Ability to maintain some state that is local to a function, but evolves over successive calls to that function. •The binding for balance in the first non-local frame of the environment associated with an instance of withdraw is inaccessible to the rest of the program. •An abstraction of a bank account that manages its own Demo internal state. John's Steven's Account Account $10 $1,000,000 11 12

  3. Sameness and Change Referential Transparency, Lost • As long as we never modify objects, we can regard a compound object •Expressions are referentially transparent if substituting an to be precisely the totality of its pieces . expression with its value does not change the meaning of a program. • A rational number is just its numerator and denominator. • This view is no longer valid in the presence of change . mul(add(2, mul(4, 6)), add(3, 5)) • Now, a compound data object has an "identity" that is something more than the pieces of which it is composed. mul(add(2, 24 ), add(3, 5)) • A bank account is still "the same" bank account even if we change the balance by making a withdrawal. mul( 26 , add(3, 5)) • Conversely, we could have two bank accounts that happen to have the same balance, but are different objects . •Re-binding operations violate the condition of referential John's Steven's transparency because they let us define functions that do Account Account more than just return a value; we can change the environment , causing values to mutate. $10 $10 Demo 13 14

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend