Python进阶(一)

一.函数式编程和高阶函数

概念与实例精讲:http://www.cnblogs.com/kym/archive/2011/03/07/1976519.html

高阶函数就是把函数作为参数

例:

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

调用的时候f传入一个函数abs,如:

test(-5,10,abs)#ads是取正数

执行过程: 

abs(-5)+abs(10)

结果是:15

如果传入其他的函数如:平方根 math.sqrt

import math
test(4,16,math.sqrt)

执行结果: 2+4=6


map函数

map是python内置的一个高阶函数,它接受一个函数 f 和一个list,并通过把 f 依次作用在list上返回一个新的list。
1.有list=[1,2,3,4,5,6,7,8] 求list平方后的新list

先定义一个求平方的函数,传入map即可

def f(x):
    return x*x
list=[1,2,3,4,5,6,7,8]
print map(f,list)
结果:[1, 4, 9, 16, 25, 36, 49, 64]

注意:map()函数不改变原有的list,而是返回一个新的list。list可以是任何数据类型,但要保证你传入的函数 f 可以处理这种数据类型。

2.把用户名处理成首字母大写的形式

['adam','LIsA','BarT']

def format(s):
    return s[0].upper()+s[1:].lower()
list=['jAck','HELLOKITTY','PeteR']
print map(format,list)

结果:['Jack', 'Hellokitty', 'Peter']


reduce() 函数

reduce() 函数是python内置的一个高阶函数,reduce()函数接受的参数和map() 类似,一个函数 f ,一个list,但执行和map()不同,reduce() 传入的函数 f 必须接受两个参数,reduce() 对list的每个元素反复调用函数 f ,并返回最终结果值。

例:

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

调用

reduce(f,[1,3,5,7,9])

执行过程是:

计算头两个元素:f(1,3) ,结果:4

计算结果和下一个元素:f(4,5), 结果:9

计算结果和下一个元素:f(9,7),结果:16

计算结果和下一个元素:f(16,9),结果:25

计算结束 结果:25

reduce() 还可以接受第三个参数为可选参数:

reduce(f,[1,3,5,7,9],100)

此时的第一轮计算变为f(100,1)

最后的结果:125

3.利用reduce() 函数来求积,2*4*5*7*12

def f(x,y):
    return x*y
list=[2,4,5,7,12]
print reduce(f,list)

结果:3360


filter()函数:

filter() 函数是python内置的另一个高阶函数,接受一个函数 f,一个list,函数f的作用是对每一个元素进行判定,返回true/false,filter()根据判断结果自动过滤掉不符合的元素,返回由符合条件的元素组成的新list。

4.[1, 4, 6, 7, 9, 12, 17]   删除其中的偶数

def f(x):
    return x%2==1
list=[1, 4, 6, 7, 9, 12, 17]
print filter(f,list)

结果:[1, 7, 9, 17]


5.删除None或者空字符串

def notEmpty(s):
    return s and len(s.strip())>0
list=['test', None, '', 'str', '  ', 'END']
print filter(notEmpty,list)

结果['test', 'str', 'END']


6.过滤出1~100中的平方根是整数的数。

import math
def f(x):
    return int(math.sqrt(x))*int(math.sqrt(x))==x
list=range(1,101)
print filter(f,list)

结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


sorted() 函数自定义排序函数

sorted([2,1,3,4,19,5]) 结果:[1,2,3,4,5,19]

自定义:如果x在y前面返回-1;在后面返回1;相等返回0;

倒序排列:

def f(x,y):
    if x>y:
        return -1
    if x<y:
        return 1
    return 0
list=[5,3,1,6,8,4]
print sorted(list,f)

结果:[8, 6, 5, 4, 3, 1]

返回函数:

python函数不但可以返回int,str,list,dict等数据类型,还可以返回函数。

例:定义一个函数f(),我们让他返回一个函数g()

def f():
    print 'f......'
    def g():
        print 'g......'
    return g
g1=f();#返回的g()赋值给g1
g1();#调用g1

结果:

>>>
f......
g......


6.编写一个函数,接受一个list,计算他们的乘积

def calc_prod(lst):
    def lazy_prod():
        def f(x, y):
            return x * y
        return reduce(f, lst, 1)
    return lazy_prod
f = calc_prod([1, 2, 3, 4])
print f()


闭包:

在函数内部定义的函数和外部定义的函数一样的,只是他们无法被外部访问:

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum

像这种内层函数引用了外层函数的参数,然后返回内层函数的情况,称之为闭包。

特点:返回的函数引用的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。

例如:我要返回三个函数,分别计算1*1,2*2,3*3

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print f1()
print f2()
print f3()

结果是:9,9,9
原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:因为f1现在才计算i*i,但现在i的值已经变为3

因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。

正确示例:

def count():
    fs=[]
    for i in range(1,4):
        def f(j):
            def g():
                return j*j
            return g
        r=f(i)
        fs.append(r)
    return fs
f1,f2,f3=count()
print f1(),f2(),f3()

匿名函数:

高阶函数可以接受函数做参数,有些时候,我们不需要显示的定义函数,直接传入函数耿方便,在Pytho中对匿名函数提供了有限的支持,还是以map()函数为例,计算f(x)=x*x,除了定义f(x)的方式外,还可以用匿名函数,匿名函数用lambda关键字。lambda表示匿名函数,冒号前面的是参数,多个参数用逗号分开。

平方:

map(lambda x:x*x,[1,2,3,4,5,6,78,9])
[1,4,9,16,25,49,64,81]

排序:

print sorted([1,3,9,5,0],lambda x,y:-cmp(x,y))
[9, 5, 3, 1, 0]

返回匿名函数:

>>> myabs = lambda x: -x if x < 0 else x 
>>> myabs(-1)
1
>>> myabs(1)
1







posted @ 2015-03-20 22:38  顾明伟  阅读(223)  评论(0编辑  收藏  举报