Python高阶函数

1)First class object 
函数在python中是一等公民
函数是对象,可调用的对象。
函数可以作为普通变量、参数、返回值等。
2)高阶函数
数学概念,y=g(f(x))
高阶函数满足条件;(1)接受一个或者多个函数作为参数.(2)输出一个函数。 
加括号和不加括号概念是完全不一样的。
3)高阶函数的事例 
#def counter(base):
    def inc(step=1):
        nonlocal base
        base +=step
        return base
    return inc
c=counter(10)
c1 = counter(10)
print(c())
print(c1())
高阶函数。
如果 c 不等于c1 也不是 is  and ==  为假。
如果 c()等于c1()    is and  == 是真值。
 
c is c1
False
 
c ==c1
False
 
c() is c1()
True
 
c() ==c1()
True
4)自定义sort函数。
 #初步代码
def sort(iterable,reverse = False,key = None ):
    lst = []
    for x in iterable:
        for i,y in enumerate(lst):
            if x>y:
                lst.insert(i,x)
                break
        else:
            lst.append(x)
    return lst
    
sort([1,5,6,7,4,3,2,9,8,0])
#out
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
#第二步优化:
def sort(iterable,reverse = False,key = lambda x,y:x>y ):
    lst = []
    for x in iterable:
        for i,y in enumerate(lst):
            #flag = True if x>y else False
            if key(x,y):
                lst.insert(i,x)
                break
        else:
            lst.append(x)
    return lst
    
sort([1,5,6,7,4,3,2,9,8,0])
#第三步
def sort(iterable,reverse = False,key = lambda x,y:x>y ):
    lst = []
    for x in iterable:
        for i,y in enumerate(lst):
            #flag = True if x>y else False
            if key(x,y):
                lst.insert(i,x)
                break
        else:
            lst.append(x)
    return lst
    
sort([1,5,6,7,4,3,2,9,8,0],key = lambda x,y:x<y)
#第四步
def sort
(iterable,reverse = False,key = lambda x,y:x>y ):
    lst = []
    for x in iterable:
        for i,y in enumerate(lst):
            flag = key(x,y) if not reverse else not key(x,y)
            if flag:
                lst.insert(i,x)
                break
        else:
            lst.append(x)
    return lst
    
sort([1,5,6,7,4,3,2,9,8,0],key = lambda x,y:x<y)


def sort1(iterable,reverse=False,key=None):
    ret = []
    for x in iterable:
        for i,y in enumerate(ret):
            if x > y:
                ret.insert(i,x)
                break
        else:
            ret.append(x)
    return ret

print(sort1([2,3,5,7,6,8,9]))
 



利用索引,i,x这些。。
 

 

3)     内建函数-高阶函数。

sorted(iterable[,key][,reverse])

排序

(1)sorted(iterable[,key][,reverse]) 返回一个新的列表,对一个可迭代对象的所有元素进行排序,按照key定义的函数。reverse表示是否反转

Sorted(lst,key=lambda x: 6-1) 返回新的列表

List.sort(key=lambda x:6-1)就地修改。

(2)filter(function,iterable)

过滤函数

过滤可迭代对象的元素,返回一个迭代器

function一个具有一个参数的函数,返回bool。

#list(filter(lambda x: x%3==0,[1,9,55,150,-3,78,28,123]))

#out   [9, 150, -3, 78, 123]

(3)map(func,*iterables)---map object

映射

对多个可迭代对象的元素按照指定的函数进行映射,返回一个迭代器。

#list(map(lambda x:2*x+1,range(5)))

#out [1, 3, 5, 7, 9]

#dict(map(lambda x:(x%5,x),range(500)))

#{0: 495, 1: 496, 2: 497, 3: 498, 4: 499}

(1)filter(function or None,iterable)

(2)map函数一个参数的函数。后面假定送进来的是一个元素的对象。

一般送进去的参数都是使用lambda。   lambda使用的是一个参数。

map后面的可迭代元素后面只能出现一个元素。

dict(map(lambda x,y: (x,y),zip(‘abcdfe’,range(5))))

这种表达式是错误的,前面的形参是两个,但是后面的实参却是二元组,条件不满足。

posted @ 2018-11-12 16:37  Python爱好者666  阅读(270)  评论(0)    收藏  举报