高阶函数与匿名函数

高阶函数
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式
常用高阶函数
map()
reduce()
filter()
sorted()
 
lambda 匿名函数
使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
使用lambda在某些时候让代码更容易理解。
匿名函数是一个可迭代对象
 
##定义函数f
def f(x):
    return x**2
print f(4)
 
Python中使用lambda的话,写成这样
 
##不需要定义函数名,直接赋值给变量g
g = lambda x : x**2
print g(4)

 

map 函数
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
>>> a=range(10)
>>> b=range(10)
>>> c = lambda x : x**2      ##定义平方匿名函数,赋值给变量c
>>> map(c,a)                 ##直接获得一个 a 列表中值得的平方
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>>map(lambda x,y:x**y,  a,b)             ##跟多个参数,
[1, 1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]
 
 
 
reduce() 函数
函数会对参数序列中元素进行累积。
函数将一个数据集合(列表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果
 
语法
reduce(function, iterable[, initializer])
function -- 函数,有两个参数
iterable -- 可迭代对象
initializer -- 可选,初始参数
返回值 --计算结果
>>> a = lambda x, y: x+y   ##lambda 定义平方匿名函数,赋值给变量a
>>> reduce(a, [1,2,3,4,5])  ##计算列表中元素和
15
>>> reduce(a, [1,2,3,4,5], 10)  ##将列表元素和作为a的一个参数与10再进行计算
25

 

 
 
sorted 函数
函数对所有可迭代的对象进行排序操作。
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
 
>>> a={8:'d', 9:'e', 2:'a', 4:'z'}
>>> sorted(a.items(), key=lambda x:x[0])      ##将字典换成列表,以key进行排序
[(2, 'a'), (4, 'z'), (8, 'd'), (9, 'e')]

>>> sorted(a.items(), key=lambda x:x[1])      ##以值进行排序
[(2, 'a'), (8, 'd'), (9, 'e'), (4, 'z')]
 
 
 
filter()函数
用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
 
语法
filter(function, iterable)
参数
function -- 判断函数。
iterable -- 可迭代对象。
返回值  -- 列表。
 
过滤出列表中的所有奇数
 
#!/usr/bin/python
# -*- coding: UTF-8 -*-

##定义判断奇数函数,(取模余1)
def is_odd(n):
    return n % 2 == 1

newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)
 
 
结果
[1, 3, 5, 7, 9]
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

posted on 2017-11-02 21:46  song-liang  阅读(311)  评论(0编辑  收藏  举报

导航