写在之前

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

列表推导式

我在之前的文章中(零基础学习 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空间」,期待和你的交流。

Python 拓展之推导式的更多相关文章

  1. python基础——列表推导式

    python基础--列表推导式 1 列表推导式定义 列表推导式能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形 2 列表推导式语法 基本格式如下: [expr for va ...

  2. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  3. python的各种推导式

    python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...

  4. Python基础-列表推导式

    python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...

  5. python 3列表推导式的的一点理解!

    python 3列表推导式的的一点理解! Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式, ...

  6. Python 入门之 推导式

    Python 入门之 推导式 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1.推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i f ...

  7. Python的列表推导式

    1.列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 2.举例说明: #!/usr/bin/python # -*- codi ...

  8. python的各种推导式(列表推导式、字典推导式、集合推导式)

    推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...

  9. Python基础-列表推导式、匿名函数、os/sys/time/datetime/pymysql/xlwt/hashlib模块

    列表推导式 [表达式 for 变量 in range(n) if 条件]  等效于 for 变量 in in range(n): if 条件: 表达式 优点:书写方便,缺点:不易读 注意:用的是方括号 ...

随机推荐

  1. RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍

    1. AMF AMF(是Action Message Format的缩写)是在flash和flex中与远程服务端交换数据的一种格式.它是二进制格式,Flash应用与服务端或数据库通过RPC交换数据时, ...

  2. IOS 绘制基本图形(画文字、图片水印)

    - (void)drawRect:(CGRect)rect { // Drawing code // [self test]; // 1.加载图片到内存中 UIImage *image = [UIIm ...

  3. IOS Prefix.pch程序常见文件 的作用

    #import <Availability.h> #ifndef __IPHONE_5_0 #warning "This project uses features only a ...

  4. noip模拟赛#23

    T1:n个元素的集合.要求取出k个子集,使得k个子集交集为空集.问有多少中取法. =>推了很久...想的是从k等于2的情况推到k等于3的情况....然后k=2推出来了k=3也推出来了...推了挺 ...

  5. fetch用法说明

    语法说明 fetch(url, options).then(function(response) { // handle HTTP response }, function(error) { // h ...

  6. 2018.10.29 NOIP2018模拟赛 解题报告

    得分: \(70+60+0=130\)(\(T3\)来不及打了,结果爆\(0\)) \(T1\):简单的求和(点此看题面) 原题: [HDU4473]Exam 这道题其实就是上面那题的弱化版,只不过把 ...

  7. linux apache 不解析php文件显示源码

    首先检查是否安装PHP 没有的话就先安装 如果安装过 在/etc/httpd/conf/httpd.conf文件中 在<IfModule mime_module>里面 AddType ap ...

  8. ASIHTTPRequest的使用

    本文转自csdn ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中. ...

  9. Zabbix监控告警Lack of free swap space on Zabbix server解决办法

    报错详情如下: 是因为Zabbix监控没有考虑虚拟主机的交换空间情况 解决办法修改配置 修改表达式内容:{Template OS Linux:system.swap.size[,pfree].last ...

  10. 爬虫 xpath etree自动补全页面

    aa = etree.HTML(response.content) bb = etree.tostring(aa) doc = etree.HTML(bb)