#!/usr/bin/python
# -*- coding: utf-8 -*-
# 11-3 函数。在这个练习中,我们将实现max()和min()内建函数。
# (a) 写分别带两个元素返回一个较大和较小元素,简单的max2()核min2()函数。
# 他们应该可以用任意的python 对象运作。举例来说,max2(4,8)和min2(4,8)会各自每次返回8 和4。
# (b) 创建使用了在a 部分中的解来重构max()和min()的新函数my_max()和my_min().
# 这些函数分别返回非空队列中一个最大和最小值。它们也能带一个参数集合作为输入。
# 用数字和字符串来测试你的解。
# (a)
def min2(a, b):
if (a < b):
return a
else:
return b
def max2(a, b):
if (a > b):
return a
else:
return b
# (b)
def my_min(*nkwargs):
args = []
for arg in nkwargs:
args.append(arg)
else:
return reduce(min, args)
def my_max(*nkwargs):
args = []
for arg in nkwargs:
args.append(arg)
else:
return reduce(max2, args)
print my_max(1, 2, 3, 4, 5, 6, 7)
print my_max("a", "c", "d", "A")
print my_min(1, 2, 3, 4, 5, 6, 7)
print my_min("a", "c", "d", "A")
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 11–6. 变长参数。下一个称为printf()的函数。有一个值参数,格式字符串。
# 剩下的就是根据格式化字符串上的值,要显示在标准输出上的可变参数,
# 格式化字符串中的值允许特别的字符串格式操作指示符,如%d, %f, etc。
# 提示:解是很琐碎的----无需实现字符串操作符功能性,
# 但你需要显示用字符串格式化操作(%)
def printf(format, *nkwargs):
print format % nkwargs
printf("%s, %d, %f", "aaa", 10.54, 10)
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 11–9. 用reduce()进行函数式编程。复习11.7.2 部分,阐述如何用reduce()数字集合的累加
# 的代码。修改它,创建一个叫average()的函数来计算每个数字集合的简单的平均值。
def average(*numbers):
count = len(numbers)
return reduce(lambda x, y: float(x+y), numbers)/count
print average(1, 2, 3, 4, 5, 6, 7, 8, 9)
11–10.用filter()进行函数式编程。在unix 文件系统中,在每个文件夹或者目录中都有两个
特别的文件:'.'表示现在的目录,'..'表示父目录。给出上面的知识,看下os.listdir()函数的文
档并描述这段代码做了什么:
files = filter(lambda x: x and x[0] != '.', os. listdir(folder))
显示folder文件夹下的所有非隐藏目录。
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 11–12. 传递函数。给在这章中描述的testit()函数写一个姊妹函数。
# timeit()会带一个函数对象(和参数一起)以及计算出用了多少时间来执行这个函数,
# 而不是测试执行时的错误。返回下面的状态:函数返回值,消耗的时间。
# 你可以用time.clock()或者time.time(),无论哪一个给你提供了较高的精度。
# (一般的共识是在POSIX 上用time.time(),在win32 系统上用time.clock())
# 注意:timeit()函数与timeit 模块不相关(在python2.3 中引入)
import time
def timeit(func):
def _timeif(*targs, **dargs):
pretime = time.time()
retval = func(*targs, **dargs)
consume = time.time() - pretime
print consume
return retval
return _timeif
@timeit
def test():
time.sleep(1)
if __name__ == '__main__':
test()
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 11–13.使用reduce()进行函数式编程以及递归。
# 在第8 张中,我们看到N 的阶乘或者N!作为从1 到N 所有数字的乘积。
# (a) 用一分钟写一个带x,y 并返回他们乘积的名为mult(x,y)的简单小巧的函数。
# (b) 用你在a 中创建mult()函数以及reduce 来计算阶乘。
# (c) 彻底抛弃掉mult()的使用,用lamda 表达式替代。
# (d) 在这章中,我们描绘了一个递归解决方案来找到N!
# 用你在上面问题中完成的timeit()函数,并给三个版本阶乘函数计时(迭代的,
# reduce()以及递归)
import time
import sys
sys.setrecursionlimit(1000000000)
def timeit(func):
def _timeif(*targs, **dargs):
pretime = time.time()
retval = func(*targs, **dargs)
consume = time.time() - pretime
print consume
return retval
return _timeif
# (a)
def mult(x, y):
return x * y
number = 10000
print
# (b)
@timeit
def factorial1(number):
return reduce(mult, range(1, number+1))
# (c)
@timeit
def factorial2(number):
return reduce(lambda x, y: x*y, range(1, number+1))
# (d)
def factorial3(number):
if number == 0 or number == 1:
return 1
else:
return factorial3(number-1) * number
@timeit
def factorial(number):
retval = factorial3(number)
return retval
factorial3(number)
factorial1(number)
factorial2(number)
factorial(number)
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 11–14. 递归。我们也来看下在第八章中的Fibonacci 数字。
# 重写你先前计算Fibonacci 数字的解(练习8-9)以便你可以使用递归。
def getfibonacci(number):
if number == 1 or number == 2:
return 1
else:
return getfibonacci(number-1) + getfibonacci(number-2)
print getfibonacci(10)
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 11–15.递归。从写练习6-5 的解,用递归向后打印一个字符串。
# 用递归向前以及向后打印一个字符串。
def reverse_show_string(a_string):
if len(a_string) == 1:
pass
print a_string
else:
print a_string[len(a_string)-1],
reverse_show_string(a_string[:len(a_string) - 1])
reverse_show_string("abcdef")
def cross_show_string(a_string):
if len(a_string) <= 2:
print a_string
else:
print a_string[0],
if len(a_string) > 1:
print a_string[len(a_string)-1],
cross_show_string(a_string[1:len(a_string) - 1])
cross_show_string("123456789")