[关闭]
@NumberFairy 2018-07-02T02:06:31.000000Z 字数 1935 阅读 1123

Python高级函数

TAG: Python

Python 高阶函数

可以接收函数作为参数的函数;Python中有一些内置函数,比如abs等,也有sqrt,但是sqrt()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法,即math.sqrt(x);比如:

import math
def add(x,y,f):
    return f(x)+f(y)
print add(25,9,math.sqrt)

map()函数

是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。比如:(把单词的首字母大写,其它字母小写)

def format_name(s):
    return s[0].upper()+s[1:].lower()
print map(format_name,['LARA','jack','adMin'])

reduce()函数

也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。比如:(写个求积的函数)

def prod(x,y):
    return x*y
print reduce(prod,[1,2,3,4,5,6])

cmp()函数

Python内置比较函数cmp(),用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。比如:这里给出了一个自定义的函数,按降序排列;这里发现sorted函数的自定义排序情况样是根据自定义函数的返回值为-1来确定的。如果要升序,把自定义函数的返回值调一下就OK。

def mySorted(x,y):
    if x>y:
        return 1
    if x<y:
        return -1
    return 0
print sorted([3,1,4,7,16,2],mySorted)

返回函数的函数

Python中的函数不仅可以返回值,比如int , str,list,dict等,还可以返回函数。比如:

def getFun(list):
def lazy():
    def prod(x,y):
        return x*y
    return reduce(prod,list)
return lazy
f = getFun([1,2,3,4])
print f
print f()
/******** 输出结果:*******/
<function lazy at 0x7fdef8ea6668>
25
/**************************/
第一个返回的应该是lazy函数对应的内存地址;第二个才是返回集合[1,2,3,4]的乘积的值。

filter()函数

是Python的内置高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。比如:(判断1到100以内的平方根为整数的值)

    import math
    def my_sqrt(x):
        r = (math.sqrt(x))
        return r*r == x
    print filter(my_sqrt,range(1,101))

闭包

像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。比如:

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()
/*******RESULT********/
最后的结果都是:9(这里可以参考c语言的指针进行分析)

匿名函数

在Python中,对匿名函数提供了有限支持。关键字lambda x:x*x表示匿名函数,冒号前面的x表示函数参数。匿名函数有个限制,就是只能有一个表达式,不写returne,返回值就是该表达式的结果。比如:(下面的结果是依赖python2.x,如果是python3.x的话,需将list作用于map函数才能得到下面的结果,即:list(map(lambda x:x*x, [1,2,3,4,5])))

>>> map(lambda x:x*x,[1,2,3,4,5])
[1,4,9,16,25]

再比如:

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注