Python随笔4:Python内置序列函数之zip函数

:本文所有代码均经过Python 3.7实际运行检验,保证其严谨性。

上次Python随笔2说的是Python内置序列函数之enumerate函数,今天接着讨论另外一个内置序列函数,zip函数。

在讨论zip函数之前,有必要在Python随笔2里面说的序列之外,再简单介绍一下几个术语:

可迭代对象iterable、迭代器iterator以及它们和序列sequence的关系。

1.Python中万物皆对象,可迭代对象可以看作是迭代器、生成器、序列等的统称。判断一个对象是否可迭代对象,有一个简单的方法,那就是看这个对象能否用for...in...语句来进行遍历循环,能遍历循环的就是可迭代对象,不能的话,就不是可迭代对象。

2.可迭代对象iterable包括以下类型:迭代器iterator、序列sequence、字典dictionary等。

3.迭代器大致可以看作是“消耗型”的一种特殊的可迭代对象,它只能被遍历一次。一般也不能直接查看其内部元素,而是要通过类似于list(iterator)这种方式才能查看。迭代器iterator还有一个子类generator,经常搭配yield使用。

好了,灯光师!摄影师!让我们的焦点再回到今天的主角zip函数上。

zip函数的具体语法是:
zip(*iterables)——创建一个聚合了来自每个可迭代对象中的元素的迭代器。它返回一个元组的迭代器。参数iterables代表可迭代对象,前面有个*号表示可迭代对象的数量不确定,可以只有一个,也可以有多个。

看下面的例子:

s1 = ['a', 'b', 'c']

s2 = ['你', '我', '他']

zipped = zip(s1)  # zip()中的参数可以为2个。

zipped  # zip()函数返回的对象zipped是一个迭代器iterator。
Out[23]: <zip at 0x2209d37e088>  #无法直接查看zipped迭代器中的元素。

list(zipped)  # 使用list()这种方式来查看zipped迭代器中的元素。
Out[24]: [('a',), ('b',), ('c',)]

zipped2 = zip(s1, s2)  # zip()里有2个参数的情况。

list(zipped2)  
Out[27]: [('a', '你'), ('b', '我'), ('c', '他')]

zip的中文意思是,拉上拉链。当zip()中有2个参数(参数为可迭代对象)时,很容易顾名思义,理解其含义了——假设zip()中的2个参数都是序列,每个序列都是一条拉链,使用了zip()函数后,拉上拉链后各个序列对应的关系如何就不难想象了。

zip()里的参数当然可以不止是2个,可以是3个,以及更多个。但是,正如拉拉链时的效果服从于“短板理论”,zip()最终的效果也取决于所有可迭代对象中的长度最小的那个。如下面的例子所示:

s1 = ['a', 'b', 'c']

s2 = ['你', '我', '他']

s3 = ['Are you ok?']

zipped = zip(s1, s2, s3)

list(zipped)  #最短的可迭代对象长度只有1,所以最后只有一个元组。
Out[32]: [('a', '你', 'Are you ok?')]

zip函数常用于遍历多个序列,有时会和此前讲过的enumerate函数搭配使用,呈现出另外一种效果。

for i, (a, b) in enumerate(zip(s1, s2)):  #zip这里和enumerate函数搭配使用。
    print(f"{i}: {a}, {b}")
    
0: a, 你
1: b, 我
2: c, 他

zip函数不但能拉上拉链,还能拉下拉链,只是这种用法略显“玄幻”,出人意表:

zipped = [('a', '你'), ('b', '我'), ('c', '他')]

s1, s2 = zip(*zipped)  #*zipped带星号的用法本文前半部分有讲。

s1
Out[41]: ('a', 'b', 'c')

s2
Out[42]: ('你', '我', '他')
小结

zip函数的用顾名思义(zip的中文意思是拉上拉链),很容易理解,以zip()中有2个序列(可迭代对象)为例,每个序列(可迭代对象)都是其中一条拉链,拉上后两个序列(可迭代对象)中的元素对应关系如何,很容易想象得到。

此外,zip函数搭配enumerate函数可以实现不同的效果;甚至还能实现拉下拉链的效果,只是此法略显“玄幻”罢了。

替换字符串

在Python里面修改字符串的某一位字符,有两种方法。
拿一个例子作说明:
有一个字符串abcdefg,把其中的g替换为A,得到新的字符串abcdefA。

方法一:使用字符串的str.relace方法。其具体语法是:

str.replace(old, new[, count])——返回字符串的副本,其中出现的所有字符串old都将被替换为new。如果给出了可选参数count,则只替换前count次出现的old字符串。

s = 'abcdefg'

s = s.replace('g', 'A')

s
Out[4]: 'abcdefA'

方法二:用re正则表达式模块中的re.sub方法,其具体语法是:

re.sub(pattern, repl, string)——在一个字符串string中,用repl替换所有匹配正则表达式pattern的子串,返回替换后的字符串。repl你是想将之替换到字符串里的单个字符。

import re

s = 'abcdefg'

re.sub(r'[g]', 'A', s)
Out[3]: 'abcdefA'

小结

如果只是单纯得替换1个字符串或者连续几个字符串这种轻操作,方法一str.relace方法足够了;如果想要非连续替换多种字符串格式,re.sub的强大必然不会令你失望。

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

推荐阅读更多精彩内容