推导式是从一个或多个迭代器快速简洁的建立数据结构的一种办法,它能够将循环和条件判断结合,从而能够避免语法冗长的代码。python
我在以前的文章中(零基础学习 Python 之 for 循环语句)写过列表推导式,可是写的相对简单,今天我准备再详细说一下,会的权当复习,不会的正好学习。bash
若是让你建立一个从 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 循环,你能够这样:app
>>> 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]
复制代码
看完这种方法,再比较以前的那两种方法,列表推导的优势一目了然。ui
在第一行中,第一个变量 i 为列表的生成值,换句话说,就是将循环的结果放在列表 my_list 中,第二个 i 是循环变量,这里要提一点的是,第一个变量 i 能够是表达式,请看下面的例子:spa
>>> my_list = [i*i for i in range(0,6)]
>>> my_list
复制代码
除了上面第一个变量能够是表达式之外,列表推导式也能够加上条件表达式,请看下面的例子:code
>>> my_list = [i for i in range(0,6) if i % 2 == 1]
>>> my_list
[1, 3, 5]
复制代码
上述的例子经过列表推导式获得一个 0 到 5 之间的奇数列表,是否是要比传统的方法简洁不少呢?因此,如今你是否是该动动手指写一个传统的求奇数列表的例子来对比对比呢?cdn
上面咱们用的一直是一个 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空间」,期待和你的交流。