Upcoming SlideShare
×

# Functions in python

18,793 views
19,630 views

Published on

10 Likes
Statistics
Notes
• Full Name
Comment goes here.

Are you sure you want to Yes No
• Be the first to comment

Views
Total views
18,793
On SlideShare
0
From Embeds
0
Number of Embeds
14,139
Actions
Shares
0
128
0
Likes
10
Embeds 0
No embeds

No notes for slide

### Functions in python

1. 1. Functions in Pythonarguments, lambdas, decorators, generators
2. 2. Defining simple functions:>>> def my_func():... print "Inside my function"...>>> my_func()Inside my function
3. 3. Function with arguments - basics>>> def func_with_args(a, b):... print a: , a... print b: , b...>>> func_with_args(5, c)a: 5b: c
4. 4. Two types of arguments● positional - arguments order matters >>> func_with_args(5, c) a: 5 b: c● keyword - argument name matters func_with_args(b=5, a=c) a: c b: 5
5. 5. Mixing position and keywordarguments>>> def func_with_args(a, b, c):... print a, b, c...>>> func_with_args(1, c=3, b=2)123>>> func_with_args(a=1, 3, b=2) File "<stdin>", line 1SyntaxError: non-keyword arg after keyword arg
6. 6. Passing attributes - old style>>> func_with_args(1, 2, 3) # standart call123>>> apply(func_with_args, [1, 2, 3]) # positional123>>> apply(func_with_args, [], {a: 1, c: 3, b: 2}) # keywords123>>> apply(func_with_args, [1], {c: 3, b: 2}) # mixed123
7. 7. Passing attributes - new style>>> func_with_args(*[1, 2, 3]) # positional123>>> func_with_args(**{b: 2, a: 1, c: 3}) # keywords123>>> func_with_args(*[1], **{b: 2, c: 3}) # mixed123>>> func_with_args(*[1], **{b: 2, a: 1, c: 3})TypeError: func_with_args() got multiple values for keywordargument a
8. 8. Function arguments revisited>>> def f(*args, **kwargs):... print args... print kwargs>>> f()(){}>>> f(1,2,3)(1, 2, 3){}>>> f(a=1, c=3, b=2)(){a: 1, c: 3, b: 2}>>> f(1, b=2, c=3)(1,){c: 3, b: 2}
9. 9. Default arguments>>> def func(a=5):... print a>>> func()5>>> func(6)6>>> func()5
10. 10. Default arguments - part II>>> def func(a=[]):... print a>>> func()[]>>> func([a])[a]>>> func()[]
11. 11. Default arguments - part III>>> def func(a=[]):... a = a * 5... print a>>> func()[]>>> func()[]>>> func([1])[1, 1, 1, 1, 1]>>> func()[]
12. 12. Default arguments - part IV - problem>>> def func(a=[]):... a.append(2)... print a>>> func()[2]>>> func()[2, 2]>>> func([1])[1, 2]>>> func()[2, 2, 2]
13. 13. Default arguments - part V - solution>>> def func(a=None):... a = a or []... a.append(2)... print a...>>> func()[2]>>> func()[2]
14. 14. Preloading arguments>>> def func(a, b, c):... print a, b, c>>> import functools>>> func_preloader = functools.partial(func, a=5, c=3)>>> func_preloader()TypeError: func() takes exactly 3 arguments (2 given)>>> func_preloader(b=2)523
15. 15. Preloading arguments - mixing>>> def func(a, b, c):... print a, b, c>>> import functools>>> func_preloader = functools.partial(func, a=5, c=3)>>> func_preloader(2)TypeError: func() got multiple values for keyword argument a
16. 16. Python introspection""" In computing, type introspection is the ability of aprogram to examine the type or properties of an objectat runtime. """ Wikipedia - Type Introspection
17. 17. Introspection basics>>> def func(a, b, c):... """ Just an example how introspection works """... pass>>> help(func)Help on function func in module __main__:func(a, b, c) Just an example how introspection works
18. 18. Methods related to introspection● type(var) # show the type of the object● dir(var) # lists objects methods and attributes● id(var) # return object specific identificator● getattr(obj, <attribute name>, <default value>)● hasattr(obj, <attribute name>)● globals()● locals()● callable(obj) # returns True if the object is callable
19. 19. Lambda functions>>> f = lambda x,y: x+y>>> f(1,2)3>>> f = lambda x,y=[]: x+y>>> f([1])[1]>>> f([1], [2])[1, 2]
20. 20. Lambdas and print# Python 2.7.3>>> a = lambda x: print x # print is a statement File "<stdin>", line 1 a = lambda x: print xLambdas can not contain statements# Python 3.2.3>>> f = lambda x: print(x) # print is a function>>> f(5)5
21. 21. Lambdas usage>>> map(lambda x: x**2, range(5))[0, 1, 4, 9, 16]>>> [x**2 for x in range(5)][0, 1, 4, 9, 16]>>> reduce(lambda a, x: a+x, range(5))10Avoid using lambdas and check Guido van Rossums visionfor lambdas http://www.artima.com/weblogs/viewpost.jsp?thread=98196
22. 22. Generatorsyield x # Generator function send protocol>>> def a():... yield 5... yield 6... yield 7>>> a()<generator object a at 0x158caa0>>>> a()<generator object a at 0x158caa0>
23. 23. Generators - range vs xrange>>> range(10**10)Traceback (most recent call last): File "<stdin>", line 1, in <module>MemoryError>>> xrange(10**10)xrange(10000000000)# range has been replaced by xrange in Python 3.x
24. 24. Creating generators>>> def fib():... a, b = 0, 1... while True:... yield a, b... a, b = b, a+b...>>> g = fib()>>> g<generator object fib at 0x19b4be0>
25. 25. Creating generators>>> g.next()(0, 1)>>> g.next()(1, 1)>>> g.next()(1, 2)>>> g.next()(2, 3)
26. 26. Exhausting generators>>> def cubes(n):... for i in range(n):... yield i**3>>> c = cubes(3)>>> c.next() # 0>>> c.next() # 1>>> c.next() # 8>>> c.next()Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration
27. 27. Generators and comprehension lists>>> def cubes(n):... for i in range(n):... yield i**3...>>> [a for a in cubes(3)][0, 1, 8]
28. 28. Generators and the send method>>> def waiting_for_input():... i = 0... while True:... i = yield i**3...>>> f = waiting_for_input()>>> f.next() # 0>>> f.send(8) # 512>>> f.send(10) # 1000>>> f.send(12) # 1728
29. 29. Decorators>>> def decorator(func):... print Entering decorator... return func...>>> @decorator... def f():... print Executing F...Entering decorator>>> f()Executing F
30. 30. Decorators simplified>>> def decorator(func):... print Entering decorator... return func...>>> @decorator... def f():... print Executing F# Using the decorator above is the same as using:>>> f = decorator(f)
31. 31. Functions as Decorators>>> def decorator(func):... def wrap():... print Calling function %s % func.__name__... func()... print Exiting decorator... return wrap...>>> @decorator... def f():... print Executing F...>>> f()Calling function fExecuting FExiting decorator
32. 32. Functions as decorators - part II>>> def decorator(func):... def wrap(a, b, c):... print Function f called with %s, %s, %s % (a, b, c)... return func(a, b, c)... return wrap...>>> @decorator... def f(a, b, c):... return a + b + c...>>> f(1, 2, 3)Function f called with 1, 2, 36
33. 33. Classes as decorators>>> class decorator(object):... def __init__(self, func):... print Initializing decorator... self.func = func... def __call__(self, *args, **kwargs):... print Calling method... return self.func(*args, **kwargs)>>> @decorator... def f(a, b, c):... return a + b + c...Initializing decorator>>> f(1, 2, 3)Calling method6
34. 34. Decorators with arguments>>> def decorator(debug=False):... def wrap(func):... def f_wrap(a, b, c):... if debug:... print Function f called with %s, %s, %s % (a,b, c)... return func(a, b, c)... return f_wrap... return wrap
35. 35. Decorators with arguments>>> @decorator(debug=True)... def f(a, b, c):... return a + b + c...>>> f(1, 2, 3)Function f called with 1, 2, 36>>> @decorator(debug=False)... def f(a, b, c):... return a + b + c...>>> f(1, 2, 3)6
36. 36. Q&A
37. 37. Problems to solve1) Create a function that accept both positional andkeyword arguments and returns their sum2) Create a generator that implements a dice that "brokes"after the 10th roll3) Create a decorator that converts letters to numberaccording to their position in the alphabet and combine itwith the solution of problem #1. When converting letters tonumbers make them lowercase and count from 0 i.e. a==0,b==1.
38. 38. About Meeng. Ilian Iliev● Web Developer for 9+ years● Python/Django fan for 3+ years● ilian@i-n-i.org● http://ilian.i-n-i.org● https://github.com/IlianIliev/