专栏首页DBA随笔Python之高级特性(2)

Python之高级特性(2)

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是永远不可能存储全体自然数的。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 8 终于支持 Docker!

    注意:我在本文中使用采用GNU GPL v2许可证的OpenJDK官方docker映像。在Oracle Java SE中,这里描述的docker支持功能在更新1...

    Java技术江湖
  • 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。在这之前,首先让我们来了解下在操作系统中进程和线程的区...

    Java技术江湖
  • ArrayList的Fast-fail(快速失败)策略

    3、为什么要报这个错?途中出错的地方是ArrayList.java:901定位到该处代码:

    用户6055494
  • 10 大 Java面试难题,打趴无数面试者!

    这是我收集的10个最棘手的Java面试问题列表。这些问题主要来自 Java 核心部分 ,不涉及 Java EE 相关问题。你可能知道这些棘手的 Java 问题的...

    用户4143945
  • Python的 5 种高级用法,效率提升没毛病!

    任何编程语言的高级特征通常都是通过大量的使用经验才发现的。比如你在编写一个复杂的项目,并在 stackoverflow 上寻找某个问题的答案。然后你突然发现了一...

    昱良
  • 可扩展的公有云媒体服务设计解析

    大家好,我是融云的联合创始人兼CTO 杨攀,本次我分享的主题是融云在公有云媒体服务设计的理念和思路。

    LiveVideoStack
  • 夯实Java基础系列16:一文读懂Java IO流和常见面试题

    术语“输入”和“输出”有时候会有一点让人疑惑。一个应用程序的输入往往是另外一个应用程序的输出 那么OutputStream流到底是一个输出到目的地的流呢,还是...

    Java技术江湖
  • 你没用过这个集合吧?IdentityHashMap

    https://blog.fondme.cn/apidoc/jdk-1.8-google/java/util/IdentityHashMap.html

    疯狂的KK
  • DevOps 工具链:SonarQube 代码质量检查工具总结

    SonarQube(sonar)是一个开源平台,用于管理源代码的质量。SonarQube不只是一个质量数据报告工具,更是代码质量管理平台。支持java, C#,...

    DevOps时代
  • 细思极恐 - 你真的会写 Java 吗?

    其实,本不想把标题写的那么恐怖,只是发现很多人干了几年 Java 以后,都自认为是一个不错的 Java 程序员了,可以拿着上万的工资都处宣扬自己了,写这篇文章的...

    哲洛不闹

扫码关注云+社区

领取腾讯云代金券