python初學過程的一些小練習題
# 習題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