函数详解

函数名赋予变量

个人理解,由于函数名其实就是指向函数的变量,当赋予另一个变量时,该变量就指向了该空间,从而可以代替函数名,即又给了某个函数取了一个别名。如下:

f = abs
print(f(-10))
printabs(-10)) #我们可以从中知道f()与abs()是完全相同的。
输出:10
    10

传入参数

由上面,我们知道其实函数名只是一个指向函数的变量,因此我们可以将函数名作为另一个函数的参数(与C++中传入函数指针类似)。带有函数名参数的函数又称为高阶函数。

def add(x, y, f):
    return f(x) + f(y)

print(add(-10,-11,abs))

map/reduce

map()与reduce()是Python的内建函数。

map

map为一个简单的映射,它有两个参数,一个是映射函数,一个是定义域。如下:

r = map(abs,[-1,-2,-3,-4])
print(list(r))

一般形式为:

map(f,Iterable) #可看作[f(x) for x in Iterable]

如果有多个参数怎么办呢?下面有个例子

def add(x, y, f):
      return f(x) + f(y)
r  = map(add,[-1,-2,-3],[-5,-6,-7],[abs,abs,abs])
print(list(r))

输出:[6, 8, 10]

明显,当映射函数有多个参数,就有多少个Iterable,且第n个Iterable为第n个参数的集合。
需要注意的是map()函数返回的是Iterator,因此可有list()函数将其变成list。

reduce

reduce的一般形式

reduce(f, [x1, x2, x3, x4])
#效果等于f(f(f(x1, x2), x3), x4)

str2int

from functools import reduce
def fn(x,y):
    return 10*x + y

# fn = lambda x , y :10*x+y
def str2int(s):
    return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]

print(reduce(fn,map(str2int,'12345')))

注意lambda允许用户快速定义单行函数,即只有一个表达式的函数。

filter

filter函数用于过滤序列。filter返回的是一个Iterator


r = filter(lambda x: x%2==1,[1,2,3,4,5,6,7,8,9])
print(list(r))

'''
list(filter(f,L)) = [x for x in L if f(x)]
'''

寻找素数

def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n

def _not_divisible(n):
    return lambda x:x%n > 0

def primes():
    yield 2
    it = _odd_iter()
    while True:
        n = next(it)
        yield n
        it = filter(_not_divisible,it)

for n in primes():
    if n < 25:
        print(n)
    else:
        break

该函数整体简单,需要理解的是_not_divisible函数,该函数是经过简化的,展开为:

def fn(x,n):
    return x % n > 0

原来_not_divisible函数中只有一个参数,是因为关键字lambda隐藏了另一个参数,每次过滤时序列输入的待检测元素。

sorted

sorted(L,key = f,reverse=True)

L为集合,key为一个排序前对L中的每个元素进行处理的函数,reverse结果是否逆序。

函数返回函数

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

f = lazy_sum(1,2,3,4,5)
print(f())

一个函数可以返回一个计算结果,也可以返回一个函数。
返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2015-08-19 22:18  mlhy  阅读(240)  评论(0编辑  收藏  举报