chapter 11 exercise

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])

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 [n]
   rest=fib2(n-1)+fib2(n-2)
    Dict1 [n]=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
相关文章
相关标签/搜索