chapter 11 function

第十一章,函數
#coding: utf-8
from operator import add,sub
from random import randint, choice

ops={'+':add,'-':sub}
MAXTRIES=2

def doprob():
    op=choice('+-')
    nums=[randint(1,40) fori in range(2)]
   nums.sort(reverse=True)
    ans=ops[op](*nums)
   pr='%d%s%d='%(nums[0],op,nums [1])
    oops=0


    while True:
       try:
           ifint(raw_input(pr))==ans:
              print '馬思堯correct'
              break
           ifoops==MAXTRIES:
             print'answer\n%s%d'%(pr,ans)
          else:
              print'馬思堯你算錯了,incorrect...try again'
              oops=oops+1
       except(KeyBoardInterrupt,EOFError,ValueError):
           print'invalid input... try again'



def main():
    while True:
       doprob()
       try:
          opt=raw_input('again? [y]').lower()
           if opt andopt[0]=='n':
              break
       except(KeyboardInterrupt,EOFError):
          break

if __name__=='__main__':
    main()

這個小程序的知識點在ans=ops[op](*nums),把一個列表傳遞給函數,ops[op]是add()或者sub()函數。
Python 一樣容許程序員執行一個沒有顯式定義參數的函數,相應的方法是經過一個把元組(非關鍵字
參數)或字典(關鍵字參數)做爲參數組傳遞給函數。咱們將在本章中討論這兩種形式。基本
上,你能夠將全部參數放進一個元組或者字典中,僅僅用這些裝有參數的容器來調用一個函數,而
沒必要顯式地將它們放在函數調用中:func(*tuple_grp_nonkw_args,**dict_grp_kw_args)

閉包的概念:
若是在一個內部函數裏,對在外部做用域(但不是在全局做用域)的變量進行引用,那麼內部函數就被認爲是closure。定義在外部函數內的但由內部

函數引用或者使用的變量被稱爲自由變量
自由變量 和 函數,這兩個關鍵稍後再說。仍是得在贅述下「閉包」的意思,望文知意,能夠形象的把它理解爲一個封閉的包裹,這個包裹就是一個

函數,固然還有函數內部對應的邏輯,包裹裏面的東西就是自由變量,自由變量能夠在隨着包裹處處遊蕩。固然還得有個前提,這個包裹是被建立出

來的。
在經過Python的語言介紹一下,一個閉包就是你調用了一個函數A,這個函數A返回了一個函數B給你。這個返回的函數B就叫作閉包。你在調用函數A

的時候傳遞的參數就是自由變量。
實例:
def func(name):
    definner_func(age):
       print 'name:', name, 'age:', age
    return inner_func
bb = func('the5fire')
bb(26)  # >>> name: the5fire age:26

這裏面調用func的時候就產生了一個閉包——inner_func,而且該閉包持有自由變量——name,所以這也意味着,當函數func的生命週期結束以後,

name這個變量依然存在,由於它被閉包引用了,因此不會被回收
2. 爲何使用閉包
3. 使用閉包


裝飾器,第一次據說這個東西,好好研究一下。
那什麼是裝飾器?。。。。如今咱們知道裝飾器實際就是函數,他們接受函數對象
裝飾器的做用:
   引入日誌
?? 增長計時邏輯來檢測性能
?? 給函數加入事務的能力

使用函數裝飾器的例子(deco.py)

默認參數和關鍵字參數的區別,
其實我一直知道默認參數是什麼,可是不知道關鍵字參數是什麼。
def func(name,age=1,gender=m):
pass
這個函數裏age,gender就是默認參數,調用函數時能夠不給age和gender賦值。func('raoxiaoyuan')是正確的
那麼關鍵字參數是什麼呢?
#關鍵字參數
#用上面第一個例子 person( name, age=1, gender='M')
#用關鍵字給function傳值時,不雖要跟著順序來也沒問題

#就算 age 和 name 順序不一樣, 但因為是用關鍵字來傳值,因此沒問題
person( age=18, name='Jacky')  
#output --> name: Jacky   age: 18   gender: 'M'

person( gender='F', age=17, name='Ashley')
#output --> name: Ashley  age: 17  gender: 'F'

//////////////////////////////////////////////////////
原來關鍵字參數就是age=18, name='Jacky'這樣來賦值就是關鍵字參數啊,嗚呼哀哉。。。


可變長參數有幾種:
1.非關鍵字可變長參數(元組)

def function_name([formal_args,]*vargs_tuple):#*vargs_tuple這個元組收納全部其餘的參數。
"function_documentation_string"
function_body_suite

2..關鍵字變量參數(Dictionary)(字典)

def function_name([formal_args,][*vargst,] **vargsd):
function_documentation_string function_body_suite

[*vargst,]#*vargst這個元組收納全部其餘的非關鍵字的參數
 **vargsd#關鍵字變量參數應該爲函數定義的最後一個參數,帶**

函數式編程的內建函數
apply()已棄用,不作研究
filter():
filter(...)
    filter(function or None,sequence) -> list, tuple, or string
說明:

     對sequence中的item依次執行function(item),將執行結果爲True(!=0)的item組成一個List/String/Tuple(取決於sequence的類型)返

回,False則退出(0),進行過濾。

map():
map(...)
    map(function, sequence[,sequence, ...]) -> list
說明:

     對sequence中的item依次執行function(item),執行結果輸出爲list。

reduce():
reduce(...)
    reduce(function,sequence[, initial]) -> value
說明:

     對sequence中的item順序迭代調用function,函數必需要有2個參數。要是有第3個參數,則表示初始值,能夠繼續調用初始值,返回一個值。


應用map,reduce,filter

1):實現5!+4!+3!+2!+1!
code:
def newlist(n):
    count=[]
    for i in map(lambdax:x+1,range(n)):
       m=reduce(lambda x,y:x*y,map(lambdax:x+1,range(i)))
       count.append(m)
    return count



if __name__=='__main__':
    try:
       n=input('please input number(int type):')
       result=newlist(n)
       print reduce(lambda x,y:x+y,result)

   except(NameError,TypeError):
       print 'that is not a number'


2)將100~200之內的質數挑選出來
code:
def is_prime(start,stop):
    stop=stop+1
    prime = filter(lambda x: not [x%i for i in range(2,x) if x%i ==0],range(start,stop))
    prime = filter(lambda x: not [x%i for i in range(2,x) if x%i ==0],range(start,stop))
    print prime


is_prime(100,200)


偏函數應用:什麼是偏函數?Currying 能泛化成爲偏函數應用(PFA), 這種函數將任意數量(順
序)的參數的函數轉化成另外一個帶剩餘參數的函數對象。
在某種程度上,這彷佛和不提供參數,就會使用默認參數情形類似。

例子:


變量做用域:
核心筆記:搜索標識符(aka 變量,名字,等等)
當搜索一個標識符的時候,python 先從局部做用域開始搜索。若是在局部做用域內沒有找到那
個名字,那麼就必定會在全局域找到這個變量不然就會被拋出NameError 異常。
一個變量的做用域和它寄住的名字空間相關。咱們會在12 章正式介紹名字空間;對於如今只能
說子空間僅僅是將名字映射到對象的命名領域,如今使用的變量名字虛擬集合。做用域的概念和用
於找到變量的名字空間搜索順序相關。當一個函數執行的時候,全部在局部命名空間的名字都在局
部做用域內。那就是當查找一個變量的時候,第一個被搜索的名字空間。若是沒有在那找到變量的
話,那麼就可能找到同名的全局變量。這些變量存儲(搜索)在一個全局以及內建的名字空間,。
僅僅經過建立一個局部變量來「隱藏「或者覆蓋一個全局變量是有可能的。回想一下,局部名字空間是首先被搜索的,存在於其局部做用域。若是找

到一個名字,搜索就不會繼續去尋找一個全
局域的變量,因此在全局或者內建的名字空間內,能夠覆蓋任何匹配的名字。


若是函數包含了對其自身的調用,該函數就是遞歸

生成器?
相關文章
相關標籤/搜索