前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python之高级特性(2)

Python之高级特性(2)

作者头像
AsiaYe
发布2019-11-06 15:19:02
3140
发布2019-11-06 15:19:02
举报
文章被收录于专栏:DBA随笔DBA随笔
Python之高级特性(2)

01

列表生成

加入我们想要生成一个list,它的内容是从1到8的整数,我们可以用list(range(1:9))来进行生成:

其中range是一个左闭右开的区间,从1开始,到9结束,不包含9本身,在这个基础上,如果我们生成[1*1,2*2,3*3,...8*8],而且不能使用循环的方法,此时我们需要怎么做呢?Python中提供了一种简单的方法来处理这种情况,也就是使用列表生成,如下:

直接在写的时候,就写成一个循环的样子,循环过程中的映射关系写在循环体的前面即可。值得注意的是,这样的写法后面还可以根据我们自己定义的条件进行数字筛选,例如下面这样:

除此之外,可以使用双层循环,从而对循环中的变量进行相应处理:

再来几个例子:

字符拼接类型

大写字母转化为小写:

02

生成器

当我们处理一个包含100个数字的列表的时候,我们可以通过列表生成,采用循环的方式,生成我们想要的list,但是由于计算机的内存是有限制的,一个很大的list必然浪费很多空间,所以如果可以通过某种算法计算出来列表的值,在使用的时候再拿到它的值,就会节省大量的存储空间。

在python中,提供了生成器来实现这种需求,也称之为generator

先来看看如下两个语句:

这两个语句只是最外层的括号不一样,我们可以看到L是一个lsit,g就是我们所说的生成器,那么我们需要怎么查看g的值呢?

可以使用next(g)来获取对应下标的g的值,实际上每次调用next(g)的时候,都是调用生成器里面的算法,但是这种方式不是很方便,可以使用更简洁的方法,也就是搭配for循环来获取g里面的值,能够这样做的前提是generator也是一个可迭代对象:

03

迭代器

目前,我们知道的可迭代对象包含:list,tuple,dict,set,str,generator

这些可以直接使用for进行循环的对象我们称之为可迭代对象:Iterable

我们可以使用isinstance来判断一个对象是否是Iterable对象,如下:

我们可以看到,最后的100是一个数字,显然不是一个可迭代对象。

这里引入生成器的概念,可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。请注意Iterable和Iterator不是相同的概念,前者是可迭代对象,后者是迭代器

我们重新判断上面的那些类型是不是迭代器:

可以看到,list类型、dict类型、str类型,虽然是Iterable,但是不是Iterator

把list、dict、str等Iterable变成Iterator可以使用iter()函数:

为什么list、dict、str等数据类型不是Iterator?

查阅资料,给出如下解释:因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档