In [2]:
def make_multiplier_of(n):
def multiplier(x):
return x * n
return multiplier
In [3]:
times3 = make_multiplier_of(3)
In [4]:
type(times3)
Out[4]:
In [5]:
times3(3)
Out[5]:
In [6]:
times3(11)
Out[6]:
In [7]:
times5 = make_multiplier_of(5)
In [8]:
times5(3)
Out[8]:
In [9]:
timessomething = make_multiplier_of()
In [10]:
def my_decorator(func):
def inner():
print("Running my_decorator")
return inner
In [12]:
def other_func():
print("Running other_func")
In [13]:
other_func()
In [14]:
other_func = my_decorator(other_func)
In [15]:
other_func()
In [16]:
other_func
Out[16]:
In [19]:
@my_decorator
def another_func():
print("Running another_func")
In [20]:
another_func()
In [31]:
from time import time
from time import sleep
In [45]:
def timer(func):
def wrapper():
t1 = time()
func()
t2 = time()
print("{} duration is {}".format(func.__name__, t2 - t1))
return wrapper
In [46]:
def slow_func():
sleep(2)
In [47]:
slow_func = timer(slow_func)
In [48]:
slow_func()
In [49]:
@timer
def even_slower_func():
sleep(5)
In [50]:
even_slower_func()
In [62]:
def italic(fn):
def _():
return "<i>" + fn() + "</i>"
return _
In [63]:
def bold(fn):
def _():
return "<b>" + fn() + "</b>"
return _
In [68]:
@bold
@italic
def hello():
return "hello world"
In [69]:
print(hello())
In [70]:
my_list = [2, 4, 6, 8]
In [71]:
my_first_iterator = iter(my_list)
In [72]:
type(my_list)
Out[72]:
In [73]:
type(my_first_iterator)
Out[73]:
In [74]:
dir(my_list)
Out[74]:
In [75]:
dir(my_first_iterator)
Out[75]:
In [76]:
for i in my_list:
print(i)
In [77]:
for i in my_first_iterator:
print(i)
In [78]:
next(my_first_iterator)
In [79]:
my_second_iterator = iter(my_list)
In [80]:
my_third_iterator = iter(my_list)
In [81]:
next(my_second_iterator)
Out[81]:
In [82]:
next(my_second_iterator)
Out[82]:
In [83]:
next(my_third_iterator)
Out[83]:
In [84]:
my_first_iterator()
In [85]:
dir(my_first_iterator)
Out[85]:
In [86]:
my_string = "abcdefg"
In [87]:
for i in my_string:
print(i)
In [89]:
my_string = "ijklmno"
In [90]:
next(my_string)
In [91]:
dir(str)
Out[91]:
In [92]:
my_iter_string = iter(my_string)
In [93]:
next(my_iter_string)
Out[93]:
In [94]:
dir(my_iter_string)
Out[94]:
In [95]:
def gen_numbers():
for n in range(9):
yield n
In [96]:
my_gen = gen_numbers()
In [97]:
type(my_gen)
Out[97]:
In [98]:
for i in my_gen:
print(i)
In [100]:
for n in range(9):
print(n)
In [118]:
class MyGenNumbers(object):
def __init__(self):
self.max = 9
self.current = -1
def __next__(self):
if self.current >= self.max:
raise StopIteration
self.current += 1
return self.current
def __iter__(self):
return self
In [119]:
my_gen_numbers = MyGenNumbers()
In [120]:
type(my_gen_numbers)
Out[120]:
In [121]:
for i in my_gen_numbers:
print(i)
In [122]:
my_list = [x * 100 for x in range(10)]
In [123]:
my_list
Out[123]:
In [124]:
type(my_list)
Out[124]:
In [125]:
my_generator = (x * 100 for x in range(10))
In [126]:
type(my_generator)
Out[126]:
In [127]:
for i in my_generator:
print(i - 3)
In [ ]: