python的偏函式(partial)

林堯彬發表於2020-04-04

  偏函式就是固定原函式的某個引數,比如newadd就是固定了add方法的第一個引數,讓a=3,這樣對newadd方法只要傳入引數B就可以實現add方法了,剛看偏函式的寫法可能會不適應,因為partial的第一個引數為一個方法,後面引數卻為該方法的引數。

偏函式不僅可以固定一個引數,而且可以固定多個,按照從左到右的方法固定。

當函式的引數個數太多,需要簡化時,使用functools.partial可以建立一個新的函式,這個新函式可以固定住原函式的部分引數,從而在呼叫時更簡單。

import functools   
  
  
def add(a,b):  
    return a+b  
def addMulti(a,b,c):  
    return a*(b+c)  
if __name__ == '__main__':  
    newadd=functools.partial(add,3)  
    newadd1=functools.partial(addMulti,0)  
    newadd2=functools.partial(addMulti,3,0)  
    print newadd(5)  
    print newadd1(4,3)  
    print newadd2(4) 

輸出結果依次為8 ,0,12 

 

 這樣再看tornado的例子就不難理解了
import errno  
import functools  
import ioloop  
import socket  
  
def connection_ready(sock, fd, events):  
    while True:  
        try:  
            connection, address = sock.accept()  
        except socket.error, e:  
            if e.args[0] not in (errno.EWOULDBLOCK, errno.EAGAIN):  
                raise  
            return  
        connection.setblocking(0)  
        handle_connection(connection, address)  
  
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)  
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
sock.setblocking(0)  
sock.bind(("", port))  
sock.listen(128)  
  
oop 例項  
io_loop = ioloop.IOLoop.instance()  
ection_ready 的第一個引數為 sock ,既 socket 的返回值  
callback = functools.partial(connection_ready, sock)  
第一個引數是將 sock 轉換為標準的描述符,第二個為回撥函式,第三個是事件型別          
io_loop.add_handler(sock.fileno(), callback, io_loop.READ)  
  
io_loop.start()  

  

 

轉載於:https://www.cnblogs.com/mosson/p/7017807.html

相關文章