Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Functions in python

20,718 views

Published on

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/

×