01
函数和变量可以互指
第一次接触到这个知识点的时候,我还不是特别适应,内置的函数怎么可以用一个变量来代替?但是python确实是这么做的,这也不妨碍它的顺利执行。举个例子说明一下,我们以Python内置的求绝对值的函数为例:
这里的f相当于内置的abs函数。这种的已经很疯狂了,再来看一种更疯狂的操作,直接用一个函数名作为一个普通变量,然后毁坏函数本身:
当我们给这个abs赋值一个普通的变量的时候,这个内置函数本身已经被损坏了,不能再去求一个数字的绝对值了,除非重新打开python。
传入函数
这种的方法也很bug,可以直接讲一个函数作为参数传到另外一个函数当中,这种函数称之为高阶函数,举个例子来说明:
我们定义一个add函数,它接收三个参数,一个x,一个y,一个f,当我们调用add的时候,它的调用过程是这样的:
x = -5
y = 6
f = abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
return 11
02
map/reduce
Python中内建了map和reduce函数,我们一个一个分析,先说说map,map函数接收两个参数,一个是函数,另外一个是iterable,map将传入的函数一次作用到可迭代对象的每个元素,并把结果作为迭代器返回。
举个例子说明一下:
可以看出来,list函数在map中把取相反数的函数f作用到每一个list的元素上,生成新的对象,然后输出。
再说说reduce,reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)
reduce在某些特定场景下具有重要的作用,例如我们想把一个[1,3,5,7,9]的list变成一个整数13579,reduce的处理方法如下:
再来看一个利用map和reduce实现str2int的方法:
第二个函数char2num可以利用一个数据字典进行映射,将字符映射成一个一个的数字,第一个函数f直接将一个一个的数字进行拼接。
03
filter和sort
filter()
filter函数用于过滤序列,和map类似,filter也接收一个函数和一个序列,filter中的函数是一个条件,它将满足条件的元素保留,不满足的丢弃,来看下面这个例子:
它的作用是过滤掉序列中的偶数。
sort()
sort函数主要是用来排序的,其核心是比较数字大小,如果是两个数据字典比较大小的话,必须自定义比较的规则。
先来看看他的排序功能:
再来看看它是如何制定比较规则的:
我们可以看到,在list的后面给出了比较规则,规则就是绝对值进行比较,按照绝对值大小的顺序将list中的数字排列出来。
再看一个字符串比较的例子:
我们可以看到,是根绝ASCII码的顺序比较的,C的ASCII码是67,Z是90,小的字数字放在前面。对于这个问题,我们将难度升级,设想这样一种情况,我们不区分大小写进行排序。要实现这种方式的排序,我们必须先把大写的字母转化成小写,这就需要我们利用一个内置的lower函数来进行转换,如下:
我们可以看到,这样的结果就是我们想要的。