初学Python 8 高阶函数

Python中的高阶函数是指,以函数作为另一个函数的参数。
map:
接受两个参数,一个函数,一个iterable,将函数依次作用到序列的每个元素,并把写过作为新的iterator返回。
这里的r就是一个iterator(迭代器)

>>> def f(x):
      return x*x
>>> r=map(f,[1,2,3,4,5,6,7,8,9]) 
>>> r
<map object at 0x05518C30>
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(map(str,[1,3,4,5,6]))  //把数字转化为字符串     
['1', '3', '4', '5', '6']
>>> 

reduce:
把一个函数作用在一个序列上。必须接收两个参数,依次作用于序列中的一个或多个元素,并把结果继续和序列的下一个元素做累积计算。
效果如同:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
>>> from functools import reduce
>>> def add(x,y):
      return x+y
>>> reduce(add,[1,3,5,7,9])
25
>>> def func(x,y):
      return x*10+y
>>> reduce(func,[1,3,5,7,9])
13579

注意,字符串也是一个序列
filter:
用于过滤序列,接收一个函数和一个序列,把函数以此作用于每个元素,根据返回值是True还是False,决定保留还是丢弃该元素。

>>> def odd(x):
      return  x%2==0   
>>> list(filter(odd,[1,2,3,4,5,6,7,8,9]))
[2, 4, 6, 8]

iterator是Python的惰性序列,当要用到某些元素时,才去计算它的值。可用于计算无限序列。
filter()的作用是从一个序列中筛选出符合条件的元素,而且由于使用了惰性计算,只有在取filter()结果的时候,才会真正筛选并返回下一个晒出的元素。
sorted()
可以对list进行排序,也是一个高阶函数,能接受一个key函数来自定义排序。
对数字默认升序,对字符串默认以ASCII升序排序,注意大写字母<小写字母

>>> sorted([1,22,435,-242,-3],key=abs)     
[1, -3, 22, -242, 435]

如果要实现反向排序,可以再传入第三个参数reverse=True

>>> sorted([1,22,435,-242,-3],key=abs,reverse=True)     
[435, -242, 22, -3, 1]

和c里面的sort挺像的,key=函数就像cmp函数,定义了排序规则。

高阶函数不仅可以以函数作为参数,还可以以函数作为返回值。

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
//只有再次调用返回的函数,才能得到计算结果
>>> f()
25

第一次调用时,相关的参数和变量都保存在返回函数中,这种程序结构称为“闭包“
但是,每次调用就算是相同的参数,返回的都是一个新的函数,是不同的。调用结果互不影响。

>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False

因为”闭包“,所以参数和变量不利己计算,所以闭包的返回函数不要反悔任何循环变量,或者后续会发生变化的变量。
定义函数!=执行函数

匿名函数lambda
关键字lambda表示匿名函数,冒号前面的表示参数,当然也可以没有参数,直接以lamdba的式子作为返回。
只能有一个表达式,可以把lambda表达式复制给一个变量,而后直接使用变量名来使用函数。

>>> f=lambda x :x*x
>>> f
<function <lambda> at 0x05D00A98>
>>> f(5)
25
>>> l=list(filter(lambda x:x%2==1,range(0,20)))
>>> l
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 
效果一样
>>> def fun(x):
    return x%2==1
>>> ll=list(filter(fun,range(0,20)))
>>> ll
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

Python的functools模块,用于高阶函数,那些以函数作为参数或返回函数的函数。
装饰器Decorator
能够在代码运行期间动态增加功能的方法
由于函数也是一个对象,函数对象可以赋值给一个变量,而后通过变量也能调用函数。注意使用变量要像使用函数一样加括号。
Python的装饰器可以用函数实现,也可以用类实现。
函数的__name__属性可以看到函数的名字

>>> def hah():
    print('hahahahha')
>>> hah
<function hah at 0x053F1858>
>>> hah()
hahahahha
>>> f=hah()
hahahahha
>>> f=hah
>>> f
<function hah at 0x053F1858>
>>> f()
hahahahha
>>> f.__name__
'hah

偏函数functools.partial
可以把原函数的某些参数设为指定值(即固定住),从而在使用时可以简化。
int()函数把字符串转化为整数,默认为十进制,也可以指定base参数,把字符串当作指定的进制数。

int('12345')
12345
int('12345',base=8)
5349
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值