0
Functions in Pythonarguments, lambdas, decorators, generators
Defining simple functions:>>> def my_func():... print "Inside my function"...>>> my_func()Inside my function
Function with arguments - basics>>> def func_with_args(a, b):... print a: , a... print b: , b...>>> func_with_args(5, c)a:...
Two types of arguments● positional - arguments order matters     >>> func_with_args(5, c)     a: 5     b: c● keyword - arg...
Mixing position and keywordarguments>>> def func_with_args(a, b, c):... print a, b, c...>>> func_with_args(1, c=3, b=2)123...
Passing attributes - old style>>> func_with_args(1, 2, 3) # standart call123>>> apply(func_with_args, [1, 2, 3]) # positio...
Passing attributes - new style>>> func_with_args(*[1, 2, 3]) # positional123>>> func_with_args(**{b: 2, a: 1, c: 3}) # key...
Function arguments revisited>>> def f(*args, **kwargs):... print args... print kwargs>>> f()(){}>>> f(1,2,3)(1, 2, 3){}>>>...
Default arguments>>> def func(a=5):... print a>>> func()5>>> func(6)6>>> func()5
Default arguments - part II>>> def func(a=[]):... print a>>> func()[]>>> func([a])[a]>>> func()[]
Default arguments - part III>>> def func(a=[]):... a = a * 5... print a>>> func()[]>>> func()[]>>> func([1])[1, 1, 1, 1, 1...
Default arguments - part IV - problem>>> def func(a=[]):... a.append(2)... print a>>> func()[2]>>> func()[2, 2]>>> func([1...
Default arguments - part V - solution>>> def func(a=None):... a = a or []... a.append(2)... print a...>>> func()[2]>>> fun...
Preloading arguments>>> def func(a, b, c):... print a, b, c>>> import functools>>> func_preloader = functools.partial(func...
Preloading arguments - mixing>>> def func(a, b, c):... print a, b, c>>> import functools>>> func_preloader = functools.par...
Python introspection""" In computing, type introspection is the ability of aprogram to examine the type or properties of a...
Introspection basics>>> def func(a, b, c):... """ Just an example how introspection works """... pass>>> help(func)Help on...
Methods related to introspection● type(var) # show the type of the object● dir(var) # lists objects methods and attributes...
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]
Lambdas and print# Python 2.7.3>>> a = lambda x: print x # print is a statement File "<stdin>", line 1  a = lambda x: prin...
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(lambd...
Generatorsyield x # Generator function send protocol>>> def a():... yield 5... yield 6... yield 7>>> a()<generator object ...
Generators - range vs xrange>>> range(10**10)Traceback (most recent call last): File "<stdin>", line 1, in <module>MemoryE...
Creating generators>>> def fib():... a, b = 0, 1... while True:...    yield a, b...    a, b = b, a+b...>>> g = fib()>>> g<...
Creating generators>>> g.next()(0, 1)>>> g.next()(1, 1)>>> g.next()(1, 2)>>> g.next()(2, 3)
Exhausting generators>>> def cubes(n):... for i in range(n):...      yield i**3>>> c = cubes(3)>>> c.next() # 0>>> c.next(...
Generators and comprehension lists>>> def cubes(n):... for i in range(n):...      yield i**3...>>> [a for a in cubes(3)][0...
Generators and the send method>>> def waiting_for_input():... i = 0... while True:...     i = yield i**3...>>> f = waiting...
Decorators>>> def decorator(func):... print Entering decorator... return func...>>> @decorator... def f():... print Execut...
Decorators simplified>>> def decorator(func):... print Entering decorator... return func...>>> @decorator... def f():... p...
Functions as Decorators>>> def decorator(func):... def wrap():...       print Calling function %s % func.__name__...      ...
Functions as decorators - part II>>> def decorator(func):... def wrap(a, b, c):...       print Function f called with %s, ...
Classes as decorators>>> class decorator(object):... def __init__(self, func):...       print Initializing decorator...   ...
Decorators with arguments>>> def decorator(debug=False):... def wrap(func):...    def f_wrap(a, b, c):...       if debug:....
Decorators with arguments>>> @decorator(debug=True)... def f(a, b, c):... return a + b + c...>>> f(1, 2, 3)Function f call...
Q&A
Problems to solve1) Create a function that accept both positional andkeyword arguments and returns their sum2) Create a ge...
About Meeng. Ilian Iliev●   Web Developer for 9+ years●   Python/Django fan for 3+ years●   ilian@i-n-i.org●   http://ilia...
Upcoming SlideShare
Loading in...5
×

Functions in python

13,622

Published on

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
13,622
On Slideshare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
93
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

Transcript of "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/
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×