01. 可迭代对象

在 python 中我们可以通过 for 循环来遍历列表,元组,这种遍历我们称为迭代(Iteration)。在 python 中凡是可以通过 for … in 进行迭代的对象,它就是可迭代对象。

1.1 如何判断一个对象是可迭代对象

from collections.abs import Iterable
isinstance('abc', Iterable)

1.2 迭代协议
python 中对象要提供迭代支持,必须定义一个 iter 方法,这个方法返回一个迭代器对象。

02. 迭代器(Iterator)

前面我们讲过可以通过 for 循环迭代的对象称为可迭代对象:Iteralbe。

在底层 for 循环是先通过内置函数 iter() 将可迭代对象转换成一个迭代器,然后将其传入 next() 函数调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。

In [8]: ls = [1,2,3]
In [9]: ls = iter(ls)
In [10]: ls
Out[10]: <list_iterator at 0x225a33d8bb0>
In [11]: next(ls)
Out[11]: 1
In [12]: next(ls)
Out[12]: 2
In [13]: next(ls)
Out[13]: 3
In [14]: next(ls)
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-14-2a26c7e4d7fa> in <module>
----> 1 next(ls)
StopIteration:

所以可以被 next() 函数调用并不断返回下一个值的对象称为迭代器:Interator。

2.1 如何判断一个对象是迭代器对象

from collections.abc import Iterator
ls = [1,2,3]
ls = iter(ls)
isinstance(ls, Iterator)

2.2 迭代器协议

迭代器对象自身需要支持以下两个方法,它们共同组成了迭代器协议:

  • iterator.inter()

返回迭代器对象本身。

  • iterator.next()

从对象中返回下一个值。如果没有可返回值,则引发 StopIteration 异常。

2.3 迭代器的作用

python 中迭代器对象表示的是一个数据流,迭代器对象可以被 next() 函数不断调用返回下一个数据,直到没有数据抛出 StopIteration 异常。

这个数据流像一个列表,但我们却不能提前知道它的长度,只能不断通过 next() 函数实现按需计算下一个数据,迭代器的计算是惰性的,只有在需要返回下一个数据时,它才会计算。

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

03. 生成器

在 python 中创建元素数量巨大的列表不仅占用很大的内存,如果仅仅只需要访问某几个元素,那其他绝大多数元素占用的空间就白白浪费了。

所以,如果列表中的元素可以按照某种算法推算出来,那如果可以在循环的过程中不断推算出后续的元素,就可以不用创建完整的列表,从而节省大量的空间。

在 python 中,这种一边循环一边计算的机制,称为生成器(generator)

要创建一个 generator,很多种方法。

3.1、生成器表达式

最简单的方式是把列表生成式的 [] 改成 (),就创建了一个 generator。

In [16]: g = (i**2 for i in range(10))In [17]: g
Out[17]: <generator object <genexpr> at 0x00000225A239A510>In [18]: next(g)
Out[18]: 0In [19]: next(g)
Out[19]: 1

生成器也是迭代器,当然也可以通过 for 循环进行迭代。

In [20]: for item in (g):...:     print(item)...:

3.2、生成器函数
如果推算的算法比较复杂,用生成器表达式无法实现的时候,还可以通过函数来 实现。
比如,斐波拉契数列,除第一个和第二数外,任意一个数都等于前两个数的和:

0,1,1,2,3,5,8,...def fib(n):a, b = 0, 1for _ in range(n):print(a)a,b = b, a+b
fib(10)

但是函数 fib 虽然包含了推算斐波拉契数列的算法规则,但是却是一次性算出了所有的值,和 generator 的逻辑很像。要将 fib 函数变成 generator,只需要将 print(a) 改成 yield a 就可以了:

In [24]: def fib(n):...:     a, b = 0, 1...:     for _ in range(n):...:         yield a...:         a,b = b, a+b...: g = fib(10)...: g
Out[24]: <generator object fib at 0x00000225A3D4E9E0>In [25]: next(g)
Out[25]: 0In [26]: next(g)
Out[26]: 1In [27]: for item in g:...:     print(item)...:

这就是定义 generator 的另一种方法。如果一个函数的定义中使用了 yield 关键字,那么这个函数就不再是一个普通的函数,而是一个生成器这时候调用函数返回的就是一个生成器对象

下面是测试资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

python 面试必问,不会真的要打脸~相关推荐

  1. Python | 面试必问,线程与进程的区别,Python中如何创建多线程?

    其实关于元类还有很多种用法,比如说如何在元类当中设置参数啦,以及一些规约的用法等等.只不过这些用法比较小众,使用频率非常低,所以我们 不过多阐述 了,可以在用到的时候再去详细了解.我想只要大家理解了元 ...

  2. 为什么换工作?(面试必问问题)

    为什么换工作?(面试必问问题) 最好的回答: 对老东家,我要回老家发展.对新东家,老东家要搬迁,做好要搬去哪里的回答.千万不能提钱,买不起房之类的抱怨,咬紧嘴巴,打死就这么一个理由. 次好回答: 对老 ...

  3. 互联网公司面试必问的mysql题目(上)

    又到了招聘的旺季,被要求准备些社招.校招的题库. 介绍:MySQL是一个关系型数据库管理系统,目前属于 Oracle 旗下产品.虽然单机性能比不上oracle,但免费开源,单机成本低且借助于分布式集群 ...

  4. 面试必问的 Linux 命令帮你整理好啦 (下)

    如果我说 Linux 操作系统和命令是面试必问的,你相信么?不信,我们来看看企业招聘需求: 随便在某招聘网站上搜了一下测试工程师的技能要求,基本都有 Linux 操作系统和命令的要求.说明,这个技能确 ...

  5. 【Android面试】Android中高级开发面试必问,7年外包一飞冲天

    Andorid 开发在前两年也非常火热,但随着客户端开发招聘回归理性,行业已经越来越成熟,岗位招聘也就自然而然地变"卷"了.这一点,身为程序员老鸟的我深有体会. 年初,我就开始投递 ...

  6. 看完946页“JAVA高级架构面试必问”,金九银十社招全拿下

    前言 我本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时 ...

  7. Java 面试必问题目,Java 后端校招面试题

    字节跳动一面: 自我介绍,主要讲讲做了什么和擅长什么 看你项目做 Spring 比较多, 问一下 Spring 相关的东西, IoC 是什么概念? Bean 的默认作用范围是什么?其他的作用范围? 索 ...

  8. 互联网公司面试必问的Redis题目

    https://juejin.im/post/5b99d4bce51d450e7a24b66e#heading-0 Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用 ...

  9. 面试必问一:Java 中 == 和 equals 的区别你知道吗

    面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...

最新文章

  1. Log4Net 配置
  2. linux lanmp 安装教程,linux服务器一键安装包lanmp系列教程之一
  3. Selenium应用代码(登录)
  4. 已知法向量 求投影_MIT—线性代数笔记15 子空间投影
  5. 5.2.7 原子操作的释放函数
  6. Unicode与GB18030、GBK、GB2312
  7. [读书笔记]Spring中的容器设计详解
  8. 小议中国人的乡土情结
  9. 计算机管理员权限设置在哪里设置方法,计算机管理员权限在哪里设置 电脑系统如何设置管理员权限...
  10. 现在AR/VR机会很少,可能全都是泡沫之互联网创业分析!
  11. 布尔教育mysql入门视频教程_布尔教育燕十八mysql入门视频教程的资源(源码课件)推荐...
  12. iPhone越狱开发环境搭建
  13. E/libc: Access denied finding property “persist.vendor.log.tel_dbg“Permission Denial: can‘t access
  14. 跳槽需要注意的一些事
  15. 基于三维gis平台的消防系统运用
  16. dwshd.sys,EASYDOWNS.sys,HBKernel32.sys,QQPlatform.exe,RDPWD.sys,easy2.exe等
  17. android控制台没有报出错误,小弟我有意制造了一个错误,但是它却不在Console控制台显示啊100分...
  18. 【牛客网题目详解】Q-前天是哪一天
  19. java对arrayList按数字大小逆序排序
  20. mysql pacemaker_关于pacemaker监控mysql修复的方法

热门文章

  1. socket编程(四)
  2. 计算机毕业设计中用Java 实现系统权限控制
  3. Django学习知识点、路线图、资料总结大全,建议收藏!
  4. linux tty驱动名称,Linux下TTY驱动程序分析
  5. activity 点击后传递数据给fragment_ViewModel+LiveData实现Fragment间通信
  6. php类的继承和,详细对比php中类继承和接口继承
  7. java swagger ui 教程_java集成Swagger的步骤详解
  8. ic卡消费管理系统_详述食堂消费系统的功能特点
  9. Halcon PDF文档(hdevelop_users_guide)学习总结之五——关于图形窗口
  10. 光电整纬机(日本世联电子株式会社)