Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Python #4 - Functions Functions A function is a block of organized, reusable code that is used to perform a single, related action. Functions provide better modularity for your application and a high degree of code reusing. Defining Functions with def Function name and its arguments. Function definition begins with def def get_final_answer(filename): """Documentation String""" line1 Read documentation using >>> help(<function name>) Colon. line2 return total_counter ... First line with less indentation is considered to be outside of the function definition. ‘return’ indicates the value to be sent back to the caller. Calling a Function >>> def myfun(x, y): return x * y >>> myfun(3, 4) 12 4 Example >>> def greet(): return 'Good Evening' >>> greet() 'Good Evening' >>> temp = greet() >>> print(temp) Good Evening >>> temp 'Good Evening' Functions without returns All functions in Python have a return value even if no return line inside the code. >>> def myfun(x,y): print(x*y) Functions without a return return the special value None. None is a special constant in the language. None is equivalent to False. The interpreter doesn’t print None >>> myfun(2,1) 2 >>> z = myfun(2,1) 2 >>> z >>> print(z) None 6 Every function returns something def sign(num): if num > 0: return 1 elif num == 0: return 0 # else: # return -1 print sign(3) 1 print sign(-9) None If the function doesn't return a value, Python returns None Yet another reason why commenting out blocks of code is a bad idea... Functions are objects in Python Functions can be used just like any other data They can be Arguments to function Return values of functions Assigned to variables Parts of tuples, lists, etc >>> … def myfun(x): return x*3 >>> def apply(q, x): return q(x) >>> apply(myfun, 7) 21 8 Variable scope When writing functions it is important to understand scope. Scope refers to the area in a program where a variable is defined. Normally, a variable is defined after it has been assigned a value. You cannot reference a variable until it has been assigned a value. >>> p = p+1 Traceback (most recent call last): File "<pyshell#72>", line 1, in <module> p = p+1 NameError: name 'p' is not defined Variable scope: use the LEGB rule Local -> Enclosed -> Global -> Built-in •Local: can be inside a function (or class method, for example). •Enclosed can be enclosing function, e.g., if a function is wrapped inside another function. •Global refers to the uppermost level of the executing script itself, and •Built-in are special names that Python reserves for itself Global Scope >>> def myfun(): print(x) return x+1 >>> x = 10 >>> myfun() 10 11 ... and local variables >>> def myfun2(): y=2 print(y) return y+2 >>> print(y) Traceback (most recent call last): File "<pyshell#42>", line 1, in <module> print(y) NameError: name 'y' is not defined >>> myfun2() 2 4 Scope: EXAMPLE The global keyword A global variable can be declared in a function using the keyword global fun2() contains a global declaration of x Caution: Must call the function! >>> def fun2(): global zz zz = 100 >>> fun2() >>> zz 100 >>> def fun2(): global tt tt = 100 >>> tt Traceback (most recent call last): File "<pyshell#68>", line 1, in <module> tt NameError: name 'tt' is not defined Scope again! Example >>> x = 99 >>> y = 17 >>> def fun(x): y=100 print(x,y) >>> fun(77) 77 100 >>> print(x,y) 99 17 By value ? By reference? Most languages (C, Java, ...) distinguish “passing by value” and “passing by reference”. In Python, such a distinction is somewhat artificial, and it is a bit subtle whether your variables are going to be modified or not. Fortunately, there exist a rule. 1. 2. 3. Parameters to functions are references to objects, which are passed by value. When you pass a variable to a function, python passes the reference to the object to which the variable refers (the value). Not the variable itself. If the value passed in a function is immutable, the function does not modify the caller’s variable. If the value is mutable, the function may modify the caller’s variable in-place. By value ? By reference? The run time stack The run-time stack is a data structure that is used by Python to execute programs. Python needs this run-time stack to maintain information about the state of your program as it executes. A stack is a data structure that lets you push and pop elements. – – You push elements onto the top of the stack and you pop elements from the top of the stack. Think of a stack of trays. You take trays off the top of the stack in a cafeteria. Stacks can be created to hold a variety of different types of elements. The run-time stack is a stack of activation records. An activation record is an area of memory that holds a copy of each variable that is defined in the local scope of a function while it is executing. Function parameters >>> def greet(name): answer = 'Hello' + name return answer >>> greet('master') 'Hellomaster' Give them parameters def greet(name): answer = 'Hello, ' + name return answer 'doctor' temp temp = 'doctor' stack value Give them parameters name def greet(name): answer = 'Hello, ' + name return answer 'doctor' temp temp = 'doctor' result = greet(temp) stack Each function call creates a new stack frame value Give them parameters name def greet(name): answer = 'Hello, ' + name return answer answer 'doctor' temp 'Hello, doctor' stack value temp = 'doctor' result = greet(temp) Each function call creates a new stack frame Give them parameters def greet(name): answer = 'Hello, ' + name return answer temp = 'doctor' result = greet(temp) 'doctor' temp 'Hello, doctor' result stack value Each function call creates a new stack frame def add(a): b=a+1 return b def double(c): d = 2 * add(c) return d stack value Each function call creates a new stack frame 10 def add(a): b=a+1 return b def double(c): d = 2 * add(c) return d val = 10 val stack value Each function call creates a new stack frame def double(c): d = 2 * add(c) return d val = 10 result = double(val) 10 double def add(a): b=a+1 return b c val stack value def double(c): d = 2 * add(c) return d val = 10 result = double(val) add def add(a): b=a+1 return b a double Each function call creates a new stack frame c 10 val stack value def double(c): d = 2 * add(c) return d val = 10 result = double(val) print result add def add(a): b=a+1 return b a b 10 double Each function call creates a new stack frame c 11 val result stack value Each function call creates a new stack frame def double(c): d = 2 * add(c) return d val = 10 result = double(val) print result 10 double def add(a): b=a+1 return b c d val result 22 stack value Each function call creates a new stack frame def add(a): b=a+1 return b def double(c): d = 2 * add(c) return d val = 10 result = double(val) print result 10 val result 22 stack value Each function call creates a new stack frame def add(a): b=a+1 return b def double(c): d = 2 * add(c) return d val = 10 result = double(val) print result 22 10 val result 22 stack value Only see variables in the current and global frames temp = 'doctor' result = greet(temp) greet name global def greet(name): temp = 'Hello, ' + name return temp temp temp stack 'Hello, doctor' 'doctor' value Only see variables in the current and global frames def greet(name): temp = 'Hello, ' + name return temp global temp = 'doctor' result = greet(temp) print result Hello, doctor 'Hello, doctor' temp 'doctor' result stack value Example Can define default parameter values def adjust(value, amount=2.0): return value * amount Default Values for Arguments You can provide default values for a function’s arguments These arguments are optional when the function is called >>> def myfun(b, c=3, d=“hello”): return b + c >>> myfun(5,3,”hello”) >>> myfun(5,3) >>> myfun(5) All of the above function calls return 8. 3 6 Can define default parameter values def adjust(value, amount=2.0): return value * amount print(adjust(5)) 10 Can define default parameter values def adjust(value, amount=2.0): return value * amount print(adjust(5)) 10 print(adjust(5, 1.001)) 5.005 Keyword Arguments Functions can be called >>> def myfun (a, b, c): return a-b >>> myfun(2, 1, 43) 1 >>> myfun(c=43, b=1, a=2) 1 >>> myfun(2, c=43, b=1) 1 with arguments out of order These arguments are specified in the call Keyword arguments can be used for a final subset of the arguments. 3 9 Keyword and positional arguments >>> myfun(1,b=2,c=43) -1 >>> myfun(b=2,1,c=3) SyntaxError: positional argument follows keyword argument Example. Root of <equation> . i^4 -93i -19620 Example. Root of <equation> Example. Fibonacci Example. Summing up all elements in a tuple >>> t=(1.5 ,2.0 ,3.1 ,6.4 , -4.7 ,7.1 , -0.01) >>> s=0 >>> for x in t: ... s += x ... >>> print s Example >>> t=(1.5 ,2.0 ,3.1 ,6.4 , -4.7 ,7.1 , -0.01) >>> sum(t) Lambda Notation Functions can be defined without giving them names. This is most useful when passing a short function as an argument to another function. >>> apply(lambda z: z * 4) Argument to apply() is an unnamed function that takes one input and returns the input multiplied by four. Note: only single-expression functions can be defined using this lambda notation. Lambda notation has a rich history in CS research and the design of many current programming languages. 4 6 Example. f (x, y) = x+2y Example Default argument value !!!! >>> f=lambda x, y=0, z=0, w : x+2*y+3*z+4*w SyntaxError: non-default argument follows default argument >>> f=lambda x, y=0, z=0, w=1 : x+2*y+3*z+4*w >>> f=lambda x, y=0, z : x+2*y+3*z+4*w SyntaxError: non-default argument follows default argument Functions call ... lambda