Python之高阶函数

  • 个人博客地址: Python之高阶函数
  • 做过Swift开发的童鞋都知道, 在Swift中有许多的高阶函数(Map, Filter, Reduce, Zip等), 这些在开发中让我们节省大量代码
  • Python中同样有许多的内置函数, 但是这里也只介绍几个常用的高阶函数

map映射

根据提供的函数对指定序列做映射, 并返回映射后的序列

map(function, iterable, ...)

参数/返回值

  • function -- 函数, 序列中的每个元素需要执行的操作, 可以是匿名函数
  • iterable -- 一个或多个序列
  • Python 2.x中返回列表, Python 3.x中返回map

使用示例

# 调用外部函数
def square(x):
    return x ** 2

res = map(square, [1, 2, 3, 4])
print(res)
print(list(res))

# 使用匿名函数
res1 = map(lambda x: x * 3, [1, 2, 3, 4])
print(list(res1))

# 使用内置函数
res2 = map(str, [2, 3, 4, 5])
print(list(res2))

# 多个序列
res3 = map(lambda x, y: x * y, [1, 2, 3, 4], [3, 2, 4, 1])
print(list(res3))

'''输出结果
<map object at 0x1041a5da0>
[1, 4, 9, 16]
[3, 6, 9, 12]
['2', '3', '4', '5']
[3, 4, 12, 4]
'''

reduce

  • 函数会对参数序列中元素进行累积
  • 函数将集合中的所有数据进行下列操作:用传给educe中的函数function先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,最后得到一个结果
  • Python3中,reduce函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里,如果想要使用它,则需要通过引入functools模块来调用reduce函数
reduce(function, iterable[, initializer])

参数/返回值

  • function -- 函数, 序列中的每个元素需要执行的操作, 可以是匿名函数
  • iterable -- 需要执行操作的序列
  • initializer -- 可选,初始参数
  • 最后返回函数的计算结果, 和初始参数类型相同

使用示例

# 求元素的和
def mySum(x, y):
    return x + y

list1 = [1, 2, 3, 4]
red = reduce(mySum, list1)
print(red)

red2 = reduce(mySum, list1, 2)
print(red2)

# 匿名函数
red3 = reduce(lambda x, y: x * y, list1)
print(red3)

red4 = reduce(lambda x, y: x * y, list1, 3)
print(red4)

red5 = reduce(lambda x, y: x + y, ['1', '2', '3', '4'], '数字: ')
print(red5)

'''输出结果:
10
12
24
72
数字: 1234
'''

filter过滤

用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表

filter(function, iterable)

参数/返回值

  • function -- 过滤操作执行的函数
  • iterable -- 需要过滤的序列
  • 序列的每个元素作为参数传递给函数进行判,然后返回TrueFalse,最后将返回True的元素放到新列表中
  • Python 2.x中返回的是过滤后的列表, 而Python 3.x中返回到是一个filter

使用示例

def isOdd(x):
    if x % 2 == 1:
        return True
    return False

list2 = [1, 2, 3, 4, 5, 6]
fil0 = filter(isOdd, list2)
print(fil0)
print(list(fil0))

# 匿名函数
fil = filter(lambda x: x % 2 == 0, list2)
print(list(fil))

'''输出结果:
<filter object at 0x1039e20f0>
[1, 3, 5]
[2, 4, 6]
'''

sorted排序

  • 在列表中有一个内置的排序函数sort(), 对列表的对象进行排序, 没有返回值
  • sorted()函数对所有可迭代的对象进行排序操作
  • sortsorted区别:
    • sort是应用在list上的方法,sorted可以对所有可迭代的对象进行排序操作。
    • listsort方法返回的是对已经存在的列表进行操作,而内建函数sorted方法返回的是一个新的list,而不是在原来的基础上进行的操作
list.sort(cmp=None, key=None, reverse=False)
sorted(iterable[, cmp[, key[, reverse]]])

参数/返回值

  • iterable -- 可迭代对象
  • cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True降序,reverse = False升序(默认)
  • sort没有返回值, sorted返回重新排序的列表

使用示例

使用sort()排序

# 用sort
list3 = [3, 7, 2, 5, 0, 4]
list3.sort()
print(list3)

aList = ['123', 'Google', 'Runoob', 'Taobao', 'Facebook']
aList.sort(reverse=True) # 降序
print(aList)


def takeSecond(elem):
    return elem[1]

random = [(2, 2), (3, 4), (4, 1), (1, 3)]

# 指定第二个元素排序
random.sort(key=takeSecond)
print(random)

'''输出结果:
[0, 2, 3, 4, 5, 7]
['Taobao', 'Runoob', 'Google', 'Facebook', '123']
[(4, 1), (2, 2), (1, 3), (3, 4)]
'''

使用sorted()函数排序时

list4 = sorted(list3)
print(list4)

#按绝对值大小排序
list5 = [4,-7,2,6,-3]
#key接受函数来实现自定义排序规则
list6 = sorted(list5, key=abs)
print(list6)

# 将序排列
print(sorted(list5, key=abs, reverse=True))

#函数可以自己写
def myLen(str):
    return len(str)

list7 = ['b333','a1111111','c22','d5554']
list8 = sorted(list7, key=myLen) # 默认升序排序
print(list8)

# 匿名函数
list9 = sorted(list7, key=lambda x: len(x), reverse=True)
print(list9)

'''输出结果:
[0, 2, 3, 4, 5, 7]
[2, -3, 4, 6, -7]
[-7, 6, 4, -3, 2]
['c22', 'b333', 'd5554', 'a1111111']
['a1111111', 'd5554', 'b333', 'c22']
'''

enumerate

  • 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中
  • Python 2.3以上版本可用,2.6添加start参数
enumerate(sequence, [start=0])

参数/返回值

  • sequence -- 一个序列、迭代器或其他支持迭代对象
  • start -- 下标起始位置
  • 函数返回enumerate(枚举) 对象

使用示例

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
sea1 = enumerate(seasons)
print(sea1)
print(list(sea1))

# 自定义起始索引
sea2 = list(enumerate(seasons, start=1))
print(sea2)

# 普通的 for 循环
i = 0
for element in seasons:
     print(i, seasons[i])
     i +=1

# for 循环使用 enumerate
for i, ele in enumerate(seasons):
    print(i, ele)


'''输出结果:
<enumerate object at 0x103a46438>
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
0 Spring
1 Summer
2 Fall
3 Winter

0 Spring
1 Summer
2 Fall
3 Winter
'''

zip

  • 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存
  • 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同
  • 函数有一个参数, 接受一个或多个序列
  • 函数利用*号操作符,可以将元组解压为列表
  • zip方法在Python 2.x中返回一个列表, 在Python 3.x中返回一个对象
zip([iterable, ...])

使用示例

a = [1, 2, 3]
b = ['a', 'b', 'c']
c = [4, 5, 6, 7]

zip1 = zip(a, b)
print(zip1)
print(list(zip1))

# 两个列表不同元素个数, 元素个数与最短的列表一致
zip2 = zip(a, c)
print(list(zip2))

# `*`号操作符,可以将元组解压为列表
a1, c1 = zip(*zip(a, c))
print(a1)
print(c1)


'''输出结果:
<zip object at 0x103a41408>
[(1, 'a'), (2, 'b'), (3, 'c')]
[(1, 4), (2, 5), (3, 6)]
(1, 2, 3)
(4, 5, 6)
'''

reverse

  • reverse()函数用于将列表中的元素反向排列
  • 该函数没有参数没有返回值
  • 使用示例如下
list31 = [1, 2, 3, 4]
list31.reverse()
print(list31)

# 输出:
[4, 3, 2, 1]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容