Ruby's Louvre

每天学习一点点算法

导航

python学习笔记—— 函数

〈p>读取远程页面

from urllib import urlretrieve

def printFile(url):
    f = open(url)
    for line in f:
        if line.strip():
            print line
    f.close()

def loadFile(url=r'http://www.idkin.com/contact.html', process=printFile):
    try:
        fileName = urlretrieve(url,'tmp.html')[0]
        print(fileName)
    except BaseException, e:
        print(str(e))
    if fileName:
        process(fileName)

if __name__ == "__main__":
    loadFile()

#urlretrieve的返回值是一个tuple, 第一个元素就是目标文件名
#如果urlretrieve仅获取一个参数,返回值的第一个元素就是产生的临时文件名

filter函数,类似javascript1.7的Array#filter。filter函数的功能相当于过滤器。调用一个布尔函数fn来迭代遍历每个seq中的元素;返回一个使fn返回值为true的元素的序列。

from random import randint
def filter(fn,arr):
    ret = [];
    for i in arr:
        if fn(i):
            ret.append(i)
    return ret;
arr = [1,2,3,4,5,6];
print filter(lambda n:n%2,arr)

map函数,类似javascript1.7的Array#map。map函数func作用于给定序列的每个元素,并用一个列表来提供返回值。

from random import randint
def map(fn,arr):
    ret = [];
    for i in arr:
        ret.append(fn(i))
    return ret;
arr = [1,2,3,4,5,6];
print map(lambda n:n+10,arr)

我们也可以用并归的思想实现此迭代器:

def rmap ( fun, list ):
    if list == []:
        return []
    else:
        return [fun( list[0] )] + rmap( fun, list[1:] )

reduce函数,类似javascript1.7的Array#reduce。fn为二元函数,将fn作用于seq序列的元素,每次携带一对(先前的结果以及下一个序列的元素),连续的将现有的结果和下一个值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值。

from random import randint
def reduce(fn,seq,initial=None): 
    lseq = list(seq) 
    if initial is None: 
        res = lseq.pop(0) 
    else: 
        res = initial 
    for i in lseq: 
        res = fn(res,i) 
    return res
arr = [1,2,3,4,5,6];
print reduce(lambda a,b:a+b,arr)

追踪闭包词法的变量

output = 'int %r id=%#0x val=%d'
w = x = y =z  =1

def f1():
    x = y = z = 2
    
def f2():
    y = z = 3
    
    def f3():
        z = 4
        print output %('w', id(w),w)
        print output %('x', id(x),x)
        print output %('y', id(y),y)
        print output %('z', id(z),z)
        
        clo = f3.func_closure
        if clo:
            print "f3 closure vars: ",[str(c) for c in clo]
        else:
            print "no f3 closure vars"
            
    f3()
    clo = f2.func_closure
    if clo:
        print "f2 closure vars: ",[str(c) for c in clo]
    else:
        print "no f2 closure vars"
f2()
    
clo = f1.func_closure
if clo:
    print "f1 closure vars: ",[str(c) for c in clo]
else:
    print "no f1 closure vars"
f1()
   

打印日志


# coding='utf-8'
from time import time

def logged(when):
    def log(f,*args,**kargs):
        print '''Called:
        function:%s
        args:%r
        kargs:%r''' % (f,args,kargs)
    def pre_logged(f):
        def wrapper(*args,**kargs):
            log(f,*args,**kargs)
            return f(*args,**kargs)
        return wrapper

    def post_logged(f):
        def wrapper(*args,**kargs):
            now=time()
            try:
                return f(*args,**kargs)
            finally:
                log(f,*args,**kargs)
                print "time delta: %s" %(time()-now)
        return wrapper

    try:
        return {"pre":pre_logged,"post":post_logged}[when]
    except KeyError, e:
        raise ValueError(e),'must be "pre" or "post"'

@logged("post")
def hello(name):
    print "Hello,",name

hello("World")

生成器


# coding='utf-8'
def counter(start_at=10):
    count = start_at
    while(True):
        val = (yield count)
        if(val is not None):
            count = val
        else:
            count += 1
            if(count == 10):
                break

for i in counter(3):
   print i

posted on 2011-06-27 14:14  司徒正美  阅读(1502)  评论(0编辑  收藏  举报