python:容器、迭代器、生成器 简单介绍

python提供了多种数据类型来存放数据项。
之前已经介绍了几个python中常用的容器,分别是列表list、元组tuple、字典dict和集合set。
这几种数据结构在Python中是非常重要的部分,尤其是各自的特性部分。掌握好了,处理数据的时候会很方便。

容器 container

容器是一种把多个元素组织在一起的数据结构。容器中的元素可以通过for循环逐个地迭代获取,也可以通过in关键字来判断元素是否在容器中。
在Python中,常见的容器对象:

  • list、dequeue...
  • set、frozenset...
  • dict、defaultdict、OrderDict...
  • tuple、namedtuple...
  • str
  • file

引用一张之前从其他博文上截的图,觉得很形象,很好的解释了之间的关系。不过不好意思,出处找不到了

大部分容器都提供了某种方式可以获取到其中的每一个元素,但是这并不是容器本身提供的功能,而是可迭代对象赋予了容器这种能力。

迭代 iteration

什么叫迭代?

如果给定一个list或者tuple数据类型变量,我们可以通过for循环来遍历这个list或者tuple,那这种遍历可以成为迭代。

  • 在java中,迭代list是通过下标index来完成的,例如:
for (i=0;i<param.length;i++){val = param[index];
}
# 恰好最近在重新捡起java
  • 在Python中,迭代是通过for...in 循环完成的。Python中的for循环可以用在string、list、tuple、dict等其他可迭代对象上。例如:
>>> d = {'a':1,'b':2,'c':3}
>>> for key in d:     # dict
...     print(key)
...
a
b
c
>>> for ch in 'AB':   # str
... print(ch)
...
A
B

所以,当我们使用for循环时,我们不太去关心作用的对象究竟是list、tuple还是其他数据类型,只要作用于一个可迭代对象上,for循环就可以正常运行。
so...

可迭代对象 iterable

可迭代对象,Iterable。可直接使用for循环的对象统称为可迭代对象。
那么你可能会问,如何去判断一个对象是否是可迭代对象呢?
ans:方法是通过引入collections模块中的Iterable类型来判断,同时使用isinstance()。

>>> from collections import Iterable    # 引入Iterable
>>> isinstance('abc',Iterable)
True
>>> isinstance(123,Iterable)
False
  • 补充一小点知识,如何通过for循环,把list的索引和值都读出来呢?使用 enumerate() 来完成。

Python内置的enumerate()枚举函数可以把一个list编程索引-元素对,这样就可以在for循环中同时迭代索引和元素本身。如下:

>>> l=['a','b','c','d']
>>> for ind,val in enumerate(l):
...        print("%d %s"%(ind,val))
...
0 a
1 b
2 c
3 d

迭代器 iterator

可以被next()函数调用并不断返回下一个值的对象为迭代器,iterator。
Python中的iterator对象是一个带状态的对象,表示的是一个数据流,他实现了如下两个方法:

  • __iter__:返回迭代器本身;
  • __next__:返回容器的下一个元素;

虽然list、dict、tuple是可以迭代的对象,但不是迭代器。
但是可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。

如何创建迭代器

  • iter()

如何创建一个可迭代对象?通过调用iter()方法实现,如下图所示:

  • next()

可迭代对象可以被next()调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。如下:

我们可以想象迭代器数据流看做是一个有序的序列,但是不能提前知道序列到底有多长,只能不断通过next()函数来实现读取下一个数据。
所以Iterator的计算是一个惰性的,至于在需要返回下一个数据时,他才会计算。

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

生成器 generator

生成器是一种特殊的迭代器。
一个函数只返回一次,但一个生成器能暂停执行并返回一个中间的结果,当生成器的next()方法被调用时,它就又会从离开的地方继续运行,实现一边循环一边计算的机制,这种就称为生成器generator

生成器创建方法

生产器的创建方法有两种:一是生成器表达式;二是yield关键字。

  • 生成器表达式

    直接上例子啦:注意一点就是,生成器最外层的是“()”,list最外成是“[]”。

>>> g = ( x*x for x in range(10) )
>>> g
<generator object <genexpr> at 0x010B3690>
# 使用next()来获得generator的下一个返回值
>>> next(g)
0
>>> next(g)
1
# g保存的是算法,每次调用next(g),就计算出下一个元素的值,直到没有更多元素时抛错
  • yield关键字

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通的函数,而是一个generator。
例如,用函数实现斐波那契数列,我们可以使用如下方法:

def fib(max):n,a,b = 0,0,1
while n < max:print(b)a,b=b,a+bn = n + 1return 'done'

其中,fib()定义了斐波那契的推算规则。
那我们可以把fib()变成generator。如下:

def fib():prev,curr = 0,1while True:yield currprev,curr = curr , curr + prev

上述函数体中,返回值不是return关键字了,而是yield,函数返回值是一个生成器对象。
当执行f=fib()时返回的是一个生成器对象,此时函数体中的代码不会执行,只有显示或隐式调用next()的时候才会真正执行里面的代码。
在每次调用next()的时候执行,遇到yield语句返回,再次执行时,从上次返回的yield语句处继续执行。
我们可以通过一个例子演示说明:

>>> def odd():
...     print('step1')
...     yield 1
...     print('step2')
...     yield 2
...     print('step 3')
...     yield 3
...
>>> o = odd()
>>> next(o)
step1
1
>>> next(o)
step2
2

好啦,今天就写到这~


❤ thanks for watching, keep on updating...

python:容器、迭代器、生成器 简单介绍相关推荐

  1. php枚举属于什么类型,python枚举类型是什么?python枚举类型的简单介绍

    本篇文章给大家带来的内容是关于python枚举类型是什么?python枚举类型的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一:枚举类型的定义 二:枚举类和普通类的区别 ...

  2. python基础(迭代器,生成器,装饰器)

    python: 生成器: 因为当列表元素达到一定上限,列表会占很大内存空间来存储,所以列表是受到内存限制的来适当使用. 生成器可以按照一个算法,循环推导出元素,就不用一次生成整个列表,而通过生成器(g ...

  3. [python+nltk] 自然语言处理简单介绍和NLTK坏境配置及入门知识(一)

    本文主要是总结最近学习的论文.书籍相关知识,主要是Natural Language Pracessing(自然语言处理,简称NLP)和Python挖掘维基百科Infobox等内容的知识.此篇文章主要参 ...

  4. python网站设计理念_简单介绍下python Django框架的历史,设计理念及优势_Django讲解2...

    简单介绍下python Django框架的历史,设计理念及优势 Django是一个高层次的 Python Web 框架,它是一个鼓励快速开发和干净,实用的框架设计.Django可以更容易地快速构建更好 ...

  5. python 递归,迭代器,生成器,面向过程编程

    一.递归和迭代 1.递归:函数调用自身 2.迭代:一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而不是迭代print('== ...

  6. python自动化测试篇一 简单介绍

    一.什么是 Python Python 是一门编程语言,关于编程语言我们后面再详细讲.首先我们思考,为什么我们要学习 Python 1.为什么要学习 Python 1. 自动化 很多时候,虽然可以通过 ...

  7. python中的json_简单介绍Python中的JSON使用

    JSON进阶 Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化: import json class St ...

  8. alchemy php,Python下SQLAlchemy的简单介绍

    本篇文章给大家带来的内容是关于php协成实现的详解(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. SQLAlchemy是Python编程语言下的一款开源软件.提供了SQL工 ...

  9. 利用Python进行数据分析(1) 简单介绍

    一.处理数据的基本内容 数据分析 是指对数据进行控制.处理.整理.分析的过程. 在这里,"数据"是指结构化的数据,例如:记录.多维数组.Excel 里的数据.关系型数据库中的数据. ...

最新文章

  1. BCH社区为比特币现金的发展买单
  2. rstudio怎么安装ggplot2_如何基于ggplot2构建相关系数矩阵热图
  3. struts 2.x版本 datetimepicker日期控件的使用
  4. Unity3D的断点调试功能
  5. python rgb 图像_在Python中查找RGB图像的互补图像
  6. Tensorflow笔记(一): tensorflow的安装
  7. 京东回应“两年将回购20亿美元股份”;微软即刻关闭全球所有旗下商店;. Net 5首个预览版发布|极客头条...
  8. Python 迭代器和 C++ 迭代器,最大的不同竟然是......
  9. 自定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,quot;掏粪男孩Gifquot;顺便再提提onWindowFocusChanged)...
  10. sql2000海量存储过程(1500w数据,分页只需1秒)
  11. 概率论与数理统计(陈希孺)笔记2.1
  12. Ubuntu LogViewer调试工具
  13. springboot 配置 P6spy
  14. excel怎么批量插行_excel如何批量在文字前加上固定文字
  15. 利用GitHub搭建个人网站
  16. guid主分区表损坏如何处理_什么是GPT或GUID分区表
  17. <Linux开发>--驱动开发-- 字符设备驱动(3) 过程详细记录
  18. 前端搬运工:零基础的前端开发初学者应如何系统地学习?前端掌握技能的学习路线
  19. Arm中国开工礼:iPhone + AirPods Pro,我酸了!
  20. 思科交换机:vtp协议

热门文章

  1. kafka python client:PyKafka vs kafka-python
  2. “BASH: FORK: RESOURCE TEMPORARILY UNAVAILABLE”的解决方案
  3. 查看js 执行效率工具
  4. 基于Dynomite的分布式延迟队列
  5. 12python(第十二天日记)
  6. 新手产品经理怎样去选择一款原型工具
  7. 国科微电子:芯片将是国内企业下一个发力点
  8. 【权限设计】一个案例,三个角色,简单说下B端产品的权限设计
  9. 日期工具类---DateUtil
  10. android学习1:初识Activity