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
相關文章
相關標籤/搜索