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 max2(num1,num2):
return num1 ifnum1>num2 else num2
def min2(num1,num2):
return num1 ifnum1
print max2(4,8)
print min(4,8)
b)
def max2(num1,num2):
return num1 ifnum1>num2 else num2
def min2(num1,num2):
return num1 ifnum1
def my_max2(*arg):
returnreduce(max2,arg)
def my_min2(*arg):
returnreduce(min2,arg)
print my_max2(1,2,3,4,5,6,7,8,9)
print my_min2('wer','vfd')
11–4. 返回值。给你在5-13 的解建立一个补充函数。建立一个带以分为单位的总时间以及
返回一个以小时和分为单位的等价的总时间。
code:
def totalmins(strtime):
num=strtime.split(':')
return int(num[0])*60+int(num
![[1] [1]](http://static.javashuo.com/static/loading.gif)
)
def hourtime(strtime):
returnstr(strtime)
if __name__=='__main__':
while True:
strtime=raw_input('please input(0 toquit):')
if strtime==0:
break
else:
print'total minstime:%s'%totalmins(strtime)
print 'thesame time;%s'%hourtime(strtime)
11–6. 变长参数。下一个称为printf()的函数。有一个值参数,格式字符串。剩下的就是根
据格式化字符串上的值,要显示在标准输出上的可变参数,格式化字符串中的值容许特别的字符串
格式操做指示符,如%d, %f, etc。提示:解是很琐碎的----无需实现字符串操做符功能性,但你需
要显示用字符串格式化操做(%)
tips:彻底看不懂在说什么
11–7. 用map() 进行函数式编程。给定一对同一大小的列表, 如[1 , 2 , 3] 和
['abc','def','ghi',....],将两个标归并为一个由每一个列表元素组成的元组的单一的表,以使我
们的结果看起来像这样:{[(1, 'abc'), (2, 'def'), (3, 'ghi'),...}.(虽然这问题在本质上和
第六章的一个问题类似,那时两个解没有直接的联系)而后建立用zip 内建函数建立另外一个解。
code:
seq1=[1,2,3]
seq2=['abc','def','hik']
map1=map(None,seq1,seq2)
print map1
zip解;
seq1=[1,2,3]
seq2=['abc','def','hik']
print zip(seq1,seq2)
用filer()进行函数式编程.使用练习5-4 你给出的代码来决定闰年。更新你的代码一
边他成为一个函数若是你尚未那么作的话。而后写一段代码来给出一个年份的列表并返回一个只
有闰年的列表。而后将它转化为用列表解析。
code:
def is_loop(year):
if (int(year)%4==0 andint(year)0==0) or int(year)
@0 ==0 :
return year
if __name__=='__main__':
year=[1983,2009,2300,4500,1234,1998]
printfilter(is_loop,year)
11–9. 用reduce()进行函数式编程。复习11.7.2 部分,阐述如何用reduce()数字集合的累
加的代码。修改它,建立一个叫average()的函数来计算每一个数字集合的简单的平均值。
code;
def average(list1):
sumNew=reduce(lambdax,y:x+y,list1)
returnfloat(sumNew)/len(list1)
if __name__=='__main__':
list1=(1,2,3,4,5,6,7,8)
print 'the averageis:%.2f'%(average(list1))
11–10.用filter()进行函数式编程。在unix 文件系统中,在每一个文件夹或者目录中都有两个
特别的文件:'.'表示如今的目录,'..'表示父目录。给出上面的知识,看下os.listdir()函数的文
档并描述这段代码作了什么:
files = filter(lambda x: x and x[0] != '.', os.listdir(folder))
code:一个文件夹下除了'.',和以'.'开头的全部文件。
11–11.用map()进行函数式编程。写一个使用文件名以及经过除去每行中全部排头和最尾的空
白来“清洁“文件。在原始文件中读取而后写入一个新的文件,建立一个新的或者覆盖掉已存在的。
给你的用户一个选择来决定执行哪个。将你的解转换成使用列表解析。
code:
import os
def newfile(filename):
fobj1=open(filename)
lines=fobj1.readlines()
fobj1.close()
fobj2=open('newfile.txt','w')
for line in lines:
fobj2.write(line.strip()+os.linesep)
fobj2.close()
def oldback(filename):
fobj1=open(filename,'w')
fobj2=open('newfile.txt')
lines=fobj2.readlines()
for line in lines:
fobj1.write(line+os.linesep)
fobj1.close()
fobj2.close()
os.remove('newfile.txt')
if __name__=='__main__':
filename=raw_input('plsinput filename:')
choose=raw_input('pleasechoose your choice fo new file.')
if choose=='new':
newfile(filename)
elifchoose=='old':
newfile(filename)
oldback(filename)
else:
print 'you want to quit.'
11–12. 传递函数。给在这章中描述的testit()函数写一个姊妹函数。timeit()会带一个函数
对象(和参数一块儿)以及计算出用了多少时间来执行这个函数,而不是测试执行时的错误。返回下
面的状态:函数返回值,消耗的时间。你能够用time.clock()或者time.time(),不管哪个给你
提供了较高的精度。(通常的共识是在POSIX 上用time.time(),在win32系统上用time.clock())
注意:timeit()函数与timeit 模块不相关(在python2.3 中引入)
code:
import time
def timeit(fun,*args):
time1=time.clock()
for i inrange(10000000):
fun(*args)
time2=time.clock()
return time2-time1
def fun(*args):
return map(lambdax:x+2,args)
if __name__=='__main__':
usingtime=timeit(fun,1,2,34,5,6,7,8,9)
print 'using timeis:%d'%(usingtime)
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()以及递归)
a)
def mult(x,y):
return x*y
print mult(3,5)
b)
def mult(x,y):
return x*y
print reduce(mult,range(1,5))
c)
print reduce(lambda x,y:x*y,range(1,5))
d)
11–14. 递归。咱们也来看下在第八章中的Fibonacci 数字。重写你先前计算Fibonacci 数字
的解(练习8-9)以便你可使用递归。
tips:
若是函数包含了对其自身的调用,该函数就是递归的
code:
Dict1={0:0,1:1}
def fib2(n):
if n in Dict1:
return Dict1
rest=fib2(n-1)+fib2(n-2)
Dict1
![[n] [n]](http://static.javashuo.com/static/loading.gif)
=rest
return rest
print fib2(6)
11–15.递归。重写练习6-5 的解,用递归向后打印一个字符串。用递归向前以及向后打印一个
字符串。
code)
def fronttoback(string):
if string:
print string[0],
return fronttoback(string[1:])
def backtofront(string):
if string:
print string[-1],
return backtofront(string[:-1])
fronttoback('iloveyou')
print
backtofront('iloveyou')
11–17.定义
(a) 描述偏函数应用和currying 之间的区别。
(b) 偏函数应用和闭包之间有什么区别?
(c) 最后,迭代器和生成器是怎么区别开的?
a)currying(就是偏函数把)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,而且返回接受余下的参数并且
返回结果的新函数的技术。
闭包的概念前面也说过就是函数里面嵌套一个函数,这个里面的函数调用到上层函数的变量,并return innerfunc,这个变量称为自由变量。
def outfunc(v):
newvarial=v
def innier():
print 'pa'
return newvarial
return innier