*************************高阶特性********************

一、*)变量可以指向函数

在python中函数名实质上是指向函数体的内容;
函数本身也可以赋值给变量,即:变量可以指向函数。

In [2]: max(12,23)
Out[2]: 23

In [3]: lh = max     #函数名其实就是指向函数的变量!


二、*)高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另
一个函数作为参数,这种函数就称之为高阶函数。

Screenshot from 2018-01-13 21-24-45.png

Screenshot from 2018-01-13 21-24-54.png


三、*)内置高阶函数

  1. map函数

寻找帮助: help(map)
map(...)
    map(function, sequence[, sequence, ...]) -> list

map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依
次作用到序列的每个元素,并把结果作为新的 list 返回。

Screenshot from 2018-01-13 21-29-14.png


Screenshot from 2018-01-13 21-32-01.png

练习: 把这list列表中的所有数字转为字符串;([1,2,3]---['1','2','3'])


Screenshot from 2018-01-13 21-33-36.png


练习:In [30]: l = '1 2 3 5' 转为整数


Screenshot from 2018-01-13 21-52-52.png


2.reduce函数

寻找帮助 help(reduce)

reduce(...)
    reduce(function, sequence[, initial]) -> value

eg:reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).

对于序列中的每个元素迭代调用function函数;
reduce 把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接
收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。

Screenshot from 2018-01-13 21-41-27.png


3.filter函数

filter(...)
    filter(function or None, sequence) -> list, tuple, or string
注意:function函数返回值为bool类型

filter() 也接收一个函数和一个序列。和 map() 不同的时,
filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True
还是 False 决定保留还是丢弃该元素。

Screenshot from 2018-01-13 22-01-34.png

Screenshot from 2018-01-13 22-04-46.png


练习: 把一个序列中的空字符串删请尝试用 filter() ;


Screenshot from 2018-01-14 19-37-17.png


练习:

- 题目描述:

给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))

Screenshot from 2018-01-13 22-22-19.png



Screenshot from 2018-01-13 22-25-18.png

Screenshot from 2018-01-13 22-25-29.png


4.sorted函数


sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
            迭代对象         函数                                     (逆序)
                      cmp=用于比较的参数,返回值一定和cmp函数的返回值对应(1 -1 0);
sorted返回一个新的对象,可以对任意可迭代的对象进行排序;
li.sort()作用于列表本身;只能用于列表排序;

• 排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速
排序,排序的核心是比较两个元素的大小。


Screenshot from 2018-01-13 22-33-02.png


--逆序排序

Screenshot from 2018-01-13 22-37-20.png

--忽略大小写


Screenshot from 2018-01-13 22-40-41.png

四、*)匿名函数

lambda 参数名:函数返回值
参数名:支持可变参数,**kwargs.....

•当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
•关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数


Screenshot from 2018-01-13 22-52-47.png

Screenshot from 2018-01-13 22-52-47.png

练习:找出货物中价格最低的货物和数量最多货物。


Screenshot from 2018-01-13 23-02-51.png

Screenshot from 2018-01-13 23-03-26.png


五、闭包


Screenshot from 2018-01-13 23-09-34.pngScreenshot from 2018-01-13 23-09-14.png

Screenshot from 2018-01-13 23-09-34.png


六、*)装饰器

•装饰器就是用来装饰函数。
• 想要增强原有函数的功能;
• 但不希望修改now()函数的定义;
• 在代码运行期间动态增加功能的方式;

练习:

  1. ATM

Screenshot from 2018-01-13 23-13-28.png

Screenshot from 2018-01-13 23-13-40.png


2.*记时器


Screenshot from 2018-01-13 23-15-39.png

Screenshot from 2018-01-13 23-16-12.png


3.万能记时器

Screenshot from 2018-01-13 23-18-15.png

Screenshot from 2018-01-13 23-18-23.png


练习:
   编写Logger装饰器,实现被装饰的函数运行结束后,打印日志信息;
   要求:
   日志格式内容:时间 函数名 运行使用时间[x]
   被装饰的函数可以接受任意个参数;
   装饰器可以传参数,并将装饰器的参数打印出来;显示为‘装饰器所传参数为:xxx’

Screenshot from 2018-01-14 19-20-58.png

Screenshot from 2018-01-14 19-21-12.png