再谈Python的高阶函数和装饰器笔记(1)

高阶函数:我的理解就是闭包、内嵌函数

再谈Python的高阶函数和装饰器笔记(1)

再谈Python的高阶函数和装饰器笔记(1)

举例:

计数器:

再谈Python的高阶函数和装饰器笔记(1)

有问题么?

问题出在base+=step,对base赋值,局部变量,没有先定义

改进:声明为非局部变量nonlocal,但是不要是global变量

再谈Python的高阶函数和装饰器笔记(1)

再谈Python的高阶函数和装饰器笔记(1)

观察一下:

id(f1)

id(f2)

f1==f2

自定义sort函数:

再谈Python的高阶函数和装饰器笔记(1)

以下是加入reverse参数的改进:推荐flag的用法

再谈Python的高阶函数和装饰器笔记(1)

改写为高阶函数,注意comp函数:

再谈Python的高阶函数和装饰器笔记(1)

comp函数比较通用。可以抽象出来。如下:

再谈Python的高阶函数和装饰器笔记(1)

再改写成高阶函数形式:

再谈Python的高阶函数和装饰器笔记(1)

先简化一下comp函数,使其不带reverse参数:

再谈Python的高阶函数和装饰器笔记(1)

替换成sort自己的调用:

再谈Python的高阶函数和装饰器笔记(1)

再进一步改造comp函数为匿名函数lambda a,b:a<b

再谈Python的高阶函数和装饰器笔记(1)

再改造一下,去掉reverse参数吗,由匿名函数比较关系决定升序还是降序

再谈Python的高阶函数和装饰器笔记(1)

知识点补充:enumerate、集合set操作

>>> import random
>>> l=[random.randint(1,100) for i in range(5)]
>>> l
[10, 14, 62, 30, 45]

>>> print(list(enumerate(l)))
[(0, 10), (1, 14), (2, 62), (3, 30), (4, 45)]
>>> for e in enumerate(l):
    print(e[0])   
0
1
2
3
4

>>> for i,x in enumerate(l):
    print(i,'   ',x)
0     10
1     14
2     62
3     30
4     45

>>> k=set(l)
>>> k
{10, 45, 14, 30, 62}

 |  add(...)
 |      Add an element to a set.
 |      
 |      This has no effect if the element is already present.
 |  
 |  clear(...)
 |      Remove all elements from this set.
 |  
 |  copy(...)
 |      Return a shallow copy of a set.
 |  
 |  difference(...)
 |      Return the difference of two or more sets as a new set.