Python 拓展之推导式

写在之前

大家好,这里是零基础学习 Python 系列,在这里我将从最基本的Python 写起,然后再慢慢涉及到高阶以及具体应用方面。我是完全自学的 Python,所以很是明白自学对于一个人的考验,所以在这里我会尽我最大的努力,把 Python 尽可能简单的表述清楚,让更多想要学习 Python 的朋友能够入门。同时写这个教程也算是对自己之前所学知识的一个巩固和提高,喜欢的朋友们可以点个关注,有问题欢迎随时和我交流。本文所有的代码编写均是Python3 版本。

推导式是从一个或多个迭代器快速简洁的创建数据结构的一种办法,它可以将循环和条件判断结合,从而可以避免语法冗长的代码。

列表推导式

我在之前的文章中(零基础学习 Python 之 for 循环语句)写过列表推导式,但是写的相对简单,今天我准备再详细说一下,会的权当复习,不会的正好学习。

如果让你创建一个从 0 到 5 的整数列表,按照我们之前学过的方法,你可以这样:

>>> my_list = []
>>> my_list.append(0)
>>> my_list.append(1)
>>> my_list.append(2)
>>> my_list.append(3)
>>> my_list.append(4)
>>> my_list.append(5)
>>> my_list
[0, 1, 2, 3, 4, 5]

如果用我们前天学过的 for 循环,你可以这样:


>>> my_list = []
>>> for i in range(0,6):
...     my_list.append(i)
... 
>>> my_list
[0, 1, 2, 3, 4, 5]

上面的两个方法都是可行的 Python 方法,得到的都是相同的结果,但是这都不是最像 Python 风格的创建列表的方式,什么是 Python 风格?当然是简洁优雅!请看下面:

>>> my_list = [i for i in range(0,6)]
>>> my_list
[0, 1, 2, 3, 4, 5]

看完这种方法,再比较之前的那两种方法,列表推导的优点一目了然。

在第一行中,第一个变量 i 为列表的生成值,换句话说,就是将循环的结果放在列表 my_list 中,第二个 i 是循环变量,这里要提一点的是,第一个变量 i 可以是表达式,请看下面的例子:


>>> my_list = [i*i for i in range(0,6)]
>>> my_list

除了上面第一个变量可以是表达式以外,列表推导式也可以加上条件表达式,请看下面的例子:

>>> my_list = [i for i in range(0,6) if i  % 2 == 1]
>>> my_list
[1, 3, 5]

上述的例子通过列表推导式得到一个 0 到 5 之间的奇数列表,是不是要比传统的方法简洁很多呢?所以,现在你是不是该动动手指写一个传统的求奇数列表的例子来对比对比呢?

上面我们用的一直是一个 for 循环的例子,那如果是双层 for 循环呢?


>>> first = range(1,4)
>>> second = range(7,9)
>>> for i in first:
...    for j in second:
...            print(i,j)
... 
1 7
1 8
2 7
2 8
3 7
3 8

如果是上面这个例子,你该怎么用列表推导式呢?如果你思考完,请看下面的答案:


>>> first = range(1,4)
>>> second = range(7,9)
>>> results = [(i,j) for i in first for j in second]
>>> for result in results:
...     print(result)
... 
(1, 7)
(1, 8)
(2, 7)
(2, 8)
(3, 7)

我在这将上面的例子用了元组输出,具体用什么形式,看当时的情况和自己的心情。

字典推导式

除了列表,字典其实也有自己的推导式,它和列表推导式其实有些相似,也有 if 条件判断以及多个 for 循环的迭代语句,下面举个最简单的例子:


>>> words = 'rocky like python'
>>> letter_cnt = {letter:words.count(letter) for letter in words}
>>> letter_cnt
{'r': 1, 'o': 2, 'c': 1, 'k': 2, 'y': 2, ' ': 2, 'l': 1, 'i': 1, 'e': 1, 'p': 1, 't': 1, 'h': 1, 'n': 1}

上面的例子是计算句子里每个字母出现的个数,但是不知道你有没有发现,有些重复的字母的次数出现了多次?还记得怎么解决掉字符串里重复的字母么?是 set 啊,快点动手试试吧。

集合推导式

集合也不例外,也有自己的推导式,也是跟上面的列表推导式和字典推导式类似,不只是在简单的,或者是带条件判断的都是如此,请看下面的例子:


>>> my_set = {i for i in range(0,6) if i % 3 == 1}
>>> my_set
{1, 4}

生成器推导式

我们说了三个,是不是掉了什么?对,是存在感最不强的元组,那么元组推导式是什么样子的呢?你肯定想说:“简单!不就是把列表推导式的方括号变成圆括号不就得了么?!”,其实我想告诉你的事,确实有圆括号的推导式,但不是元组的,因为元组没有推导式!圆括号的那个推导式是生成器推导式,不信的话请看下面的例子:


>>> my_exp = (i for i in range(0,6))
>>> my_exp
<generator object <genexpr> at 0x110090308>
>>> type(my_exp)
<class ‘generator'>

你现在只需要知道生成器是将数据传给迭代器的一种方式就好了,至于生成器我在之后的文章中会详细讲到,尽情期待。

虽然我们还没学生成器这个概念,但是不妨碍我们学习这个推导式,你可以直接对生成器的对象进行迭代,比如像下面一样:

>>> for exp in my_exp:
...    print(exp)
... 
0
1
2
3
4
5

作为一个每个知识点都想写的人来说,这里劳烦大家再记住一点的是,一个生成器只能生成一次,如果想再生成一次的话,你会发现它消失掉了,什么意思呢,看下面的例子:


>>> second_exp = list(my_exp)
>>> second_exp
[]

现在生成器先记住这些就可以,记不住也没关系,我还会细讲生成器,我们到时候再讨论。

写在最后

最后感谢你能看到这里,希望我写的东西能够让你有到收获,但是我还是希望我在文章里插入的代码,你们能自己动手试一下,都很简单。原创不易,每一个字,每一个标点都是自己手敲的,所以希望大家能多给点支持,该关注关注,该点赞点赞,该转发转发,有什么问题欢迎在后台联系我,也可以在公众号 -- Python空间 找到我的微信加我。

The end。

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

推荐阅读更多精彩内容