大师兄的Python学习笔记(十二): 常用高级函数

大师兄的Python学习笔记(十一): 时间模块time,datetime和calendar
大师兄的Python学习笔记(十三): 理解装饰器

一、lambda匿名函数

  • 用于实现某些简单的函数功能。
  • 格式是:lambda [arg1 [,arg2,.....argn]]:expression, lambda:之间的部分为参数,:后的部分为表达式内容。
  • lambda函数没有return语句,直接返回函数的运行结果。
  • 好处一:不用担心函数名冲突。
  • 好处二:可以直接赋值给变量,再利用变量来调用函数。
>>># 普通函数实现
>>>def sum(x,y):
>>>    return x+y
>>>print(sum(2,3))
5

>>># 匿名函数实现
>>>sum = lambda x,y:x+y
>>>print(sum(2,3))
5

二、zip(<iterable1>,<iterable2>...)函数

  • 将多个可迭代对象一一对应生成元祖,并将元祖组成列表。
  • 如果迭代对象长度不同,则以最短的元素长度为准。
>>>l1 = ['武汉','北京','广州','上海']
>>>l2 = [54406,375,2194,326]
>>>l3 = [2420,3,8] #这里的list长度为3,所以zip后的数据以最短的列表为准
>>>z = zip(l1,l2,l3)
>>>print([x for x in z])
[('武汉', 54406, 2420), ('北京', 375, 3), ('广州', 2194, 8)]

三、map(<function>,<iterable>)函数

  • 用于映射序列。
  • 以<function>为参数,为<iterable>中的每个元素做映射,并形成一个新的列表。
>>>def square(d):
>>>    return d**2

>>>l = [i for i in range(10)]
>>>m = map(square,l)
>>>print([x for x in m])
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  • 通过匿名函数实现。
l = [i for i in range(10)]
m = map(lambda d:d**2,l)
print([x for x in m])
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

四、filter(<function>,<iterable>)函数

  • 用于过滤序列
  • 以<function>作为参数,对<iterable>中的每个元素做判断,并将返回的元素组成新的列表。
>>>def is_odd(d):
>>>    if d%2==1:
>>>        return d

>>>l = [i for i in range(10)]
>>>f = filter(is_odd,l)
>>>print([x for x in f])
[1, 3, 5, 7, 9]
  • 通过匿名函数实现。
>>>l = [i for i in range(10)]
>>>m = filter(lambda d: d % 2 == 1 and d or None,l) # 三项判断式
>>>print([x for x in m])
[1, 3, 5, 7, 9]

五、reduce(<function>,<iterable>,<initializer=0>)函数

  • reduce()函数在python3中被移出了标准库,需要从functools库中引用。
  • 用于对序列中的元素进行累计。
  • 以<function>作为参数, 将<iterable>的元素两两操作,并返回结果。
>>>from functools import reduce
>>>def sum(x,y):
>>>    return x+y

>>>l = [i for i in range(100)]
>>>s = reduce(sum,l)
>>>print(s)
4950
  • 通过匿名函数实现。
>>>from functools import reduce
>>>l = [i for i in range(100)]
>>>s = reduce(lambda x,y:x+y,l)
>>>print(s)
4950

六、enumerate(<iterator>,<start=0>)函数

  • 将<iterator>中的每个元素增加一个序号,并返回一个新的元祖列表。
  • <start>表示序号从几开始排起,默认为0。
>>>cities = ['北京','上海','天津','重庆']
>>>cities_with_serial = enumerate(city,101)
>>>print([x for x in cities_with_serial])
[(101, '北京'), (102, '上海'), (103, '天津'), (104, '重庆')]

七、collections模块

  • collections是Python的内建模块,包含了许多有用的集合类。
1. namedtuple(<name>,<value1>,<value2>,...)
  • 用来定义一个可命名的集合(tuple)数据类型。
  • <name>是数据类型的名称,相当于tuple类型的标注。
  • namedtuple的元素数量是在定义数据类型时固定的。
>>>from collections import namedtuple
>>># 定义数据类型
>>>Point = namedtuple('Point',['x','y']) # 坐标

>>># 实例化
>>>beijing_point = Point(100,200) 
>>>shanghai_point = Point(200,300)
>>>print('北京的坐标是{}'.format(beijing_point))
>>>print('上海的坐标是{}'.format(shanghai_point))
>>>print('北京的x坐标是{}'.format(beijing_point.x))
京的坐标是Point(x=100, y=200)
上海的坐标是Point(x=200, y=300)
北京的x坐标是100
2. deque(<iterable>)
  • 一种插入、删除更高效的列表(list)数据类型。
  • 除了list的基本功能外,还支持appendleft()popleft()指令,用于从队列头部插入和删除元素。
>>>from collections import deque
>>># 实例化数据类型
>>>cities = ['北京','上海','天津','重庆']
>>>cities_dq = deque(cities)
>>>print(cities_dq)
deque(['北京', '上海', '天津', '重庆'])

>>># 列表操作
>>>selected = cities_dq.popleft() # 返回并删除左边第一个元素‘北京’
>>>cities_dq.appendleft('武汉') # 从左边添加一个元素'武汉'
>>>print(selected)
北京
>>>print(cities_dq)
deque(['武汉', '上海', '天津', '重庆'])
3. defaultdict(<default>)
  • 一种强化的字典(dict)数据类型,当key值不存在时,返回默认值。
  • <default>为默认值函数。
  • 其它与dict数据类型相同。
>>>from collections import defaultdict
>>># 设置默认值
>>>cities_count = defaultdict(lambda:'数据统计中')
>>># 数据操作
>>>cities_count['北京'] = 325
>>>print(cities_count['北京'])
325
>>>print(cities_count['上海'])
数据统计中
4. OrderedDict
  • 一种强化的字典(dict)数据类型,可以保持key的顺序。
  • 顺序是key插入的顺序。
>>># 普通dict
>>>cities = dict()
>>>cities['北京'] = 375
>>>cities['上海'] = 326
>>>cities['武汉'] = 54406
>>>cities['广州'] = 2194
>>>print(cities) # dict是没有顺序的
{ '上海': 326, '武汉': 54406, '北京': 375,'广州': 2194}

>>># OrderedDict
>>>from collections import OrderedDict
>>>cities_od = OrderedDict()
>>>cities_od['北京'] = 375
>>>cities_od['上海'] = 326
>>>cities_od['武汉'] = 54406
>>>cities_od['广州'] = 2194
>>>print(cities_od)
OrderedDict([('北京', 375), ('上海', 326), ('武汉', 54406), ('广州', 2194)])
5. Counter
  • 一个计数器,用于统计可迭代对象中元素出现的次数。
>>>import collections,random
>>># 生成一个list包含若干元素
>>>l = list()
>>>for i in range(100):
>>>    l.append(random.choice(['猫','狗','兔子','熊']))

>>># 计算每种元素的个数
>>>counter = collections.Counter()
>>>for i in l:
>>>    counter[i]+=1
>>>print(counter)
>Counter({'狗': 37, '猫': 26, '兔子': 20, '熊': 17})

参考资料



本文作者:大师兄(superkmi)

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

推荐阅读更多精彩内容