# 习题1:
假设Python没有提供map()函数,请自行编写一个my_map()函数实现与map()相同的功能。
def my_map(my_fun,my_list):
l= []
for s in my_list:
l.append(my_fun(s))
return l
# 高手的代码就是简洁啊
def my_map2(my_fun,my_list = []):
return [my_fun(s) for s in my_list]
# 习题2:
Python提供的sum()函数可以接受一个list并求和,,请编写一个prod()函数,可以接受一个list并利用reduce()求积。
def my_reduce(my_list):
def multiplication(x,y):
return x * y
return reduce(multiplication,my_list)
print(my_reduce([1,2,3,4,5]))
# 习题3:
请编写一个decorator,能在函数调用的前后打印出’begin call’和’end call’的日志。
再思考一下能否写出一个@log的decorator。
使它既支持:@log
def f():
pass
又支持:@log(‘execute’)
def f():
pass
解1:
def log(func):
def wrapper(*args, **kw):
print ‘begin call %s():’ % func.__name__
func(*args, **kw)
print ‘end call %s():’ %func.__name__
return wrapper
@log
def now():
print ‘2013-12-25’
now()
解2:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import functools
def log(text):
if isinstance(text,str):
def decorator(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print ‘prog beginning…’
print ‘%s %s…’ %(text,func.__name__)
func(*args,**kw)
print ‘prog endding…’
return wrapper
return decorator
else:
@functools.wraps(text)
def wrapper(*args,**kw):
print ‘prog begging…’
text(*args,**kw)
print ‘prog endding…’
return wrapper
@log(‘execute’)
def now():
print ‘2013-12-25’
now()
print’================================================’
@log
def today():
print ‘2013-12-25’
today()
# 习题4:
如果一个类想被用于for … in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。我们以斐波那契数列为例,写一个Fib类,可以作用于for循环:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器a,b
def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己
def next(self):
self.a, self.b = self.b, self.a + self.b # 计算下一个值
if self.a > 100000: # 退出循环的条件
raise StopIteration();
return self.a # 返回下一个值
for n in Fib():
print n
不要惧怕黑暗,人间没有永恒的夜晚;不要担心严寒,