Python全栈之路----函数进阶----迭代器
我们已经知道,可以直接作用于 for 循环的数据类型有以下几种:
- 一类是集合数据类型,如 list , tuple , dict , set ,str 等;
- 一类是 generator ,包括生成器和带 yield 的 generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
可以使用 isinstance() 判断一个对象是否是 Iterable 对象:
>>> Iterable
<class 'collections.abc.Iterable'>
>>> isinstance('abc',Iterable) #str 是可迭代类型
True
>>> isinstance(100,Iterable) #int 不是可迭代类型
False
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续进行,返回下一个值了。
- 可以被 next() 函数调用并不断返回下一个值的对象成为迭代器:Iterator。
可以使用 isinstance() 判断一个对象是否是 Iterator 对象。
>>> from collections import Iterator
>>> isinstance( (x for x in range (10)),Iterator)
True
>>> isinstance( [],Iterator)
False
>>> isinstance( {},Iterator)
False
>>> isinstance('abc',Iterator)
False
生成器都是 Iterable 对象,但 list、dict、str 虽然是 Iterable ,但都不是 Iterator。
把 list、dict、str 等 Iterable 变成 Iterator 可以使用 iter() 函数。
>>> isinstance(iter('abc'),Iterator)
True
>>> isinstance(iter([]),Iterator)
True
你可能会问,为什么 list、dict、str 等数据类型不是 Iterator ?
这是因为Python的 Iterator 对象表示的是一个数据流,Iterator 对象可以被 next() 函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。可以把这个数据流看作是一个有序序列,但是我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要计算下一个数据时它才会计算。
Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用 list 时永远不可能存储全体自然数的。
Python全栈之路----函数进阶----迭代器的更多相关文章
- Python全栈之路----函数进阶----装饰器
Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...
- Python全栈之路----函数进阶----名称空间
又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的=地方 名称空间共3种,分别如下 ...
- Python全栈之路----函数进阶----作用域的查找空间
n = 10 def func(): n = 20 print('func:',n) def func2(): n = 30 print('func2:',n) def func3(): print( ...
- Python全栈之路----函数进阶----闭包
关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们之外被调用时,就会形成闭 ...
- Python全栈之路----函数进阶----生成器
生成器特点: 不能立即产生,取一次创建一次 只能往前走 等到走到最后,就会报错 >>> a = [i for i in range(1000)] >>> a [0, ...
- Python全栈之路----函数进阶----列表生成式
列表生成式 现在有个需求,看列表[0,1,2,3,4,5,6,7,8,9],要求你把列表里每个值都加1,你怎么实现?你可能会想到两种方法. 二逼青年版 >>> a = [0,1,2, ...
- Python全栈之路----函数----返回值
函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...
- python全栈开发-前方高能-函数进阶
python_day_10 一.今日主要内容 1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序: 位置,*args,默认值,**kwargs 在形参上 ...
- python全栈学习--day10(函数进阶)
一,引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了:NameError: name 'm ...
随机推荐
- 【Python】【自动化测试】【pytest】【常用命令行选项】
https://www.cnblogs.com/cnkemi/p/9989019.html http://www.cnblogs.com/cnkemi/p/10002788.html pytest 常 ...
- win8外包公司——技术分享:参数传递
页面之间传递参数 windows phone 的参数传递和web 差不多.用“?”号传递 多个参数的时候用 “&”做分隔. 我接着昨天的项目继续添加一个FourPage.xaml 在昨天的Th ...
- hdu 6010 Daylight Saving Time 泰勒公式
Daylight Saving Time Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- TestMap
public class TestMap { public static void main(String[] args) { Map map=new HashMap(); //在此映射中关联指定值与 ...
- 如何进入docker 使用root用户的方式
docker exec -it --user root <container id> /bin/bash
- Python自学:第三章 访问列表元素
#输出并首字母大写 bicycles = ['trek','cannondale','redline','specialized'] print(bicycles[0].title()) 输出为: T ...
- jQuery中异步问题:数据传递
最近写一个新页面,涉及到异步问题,为了获得异步过程中的数据,以下分享两种方法: 两种方法一句话总结: 方法一,Http请求后调用.then实现response的数据同步,然后根据resp接着处理: 方 ...
- Python3+mitmproxy安装使用教程(Windows)
一.安装 1.1 安装mitmproxy 直接使用pip安装即可 pip install mitmproxy pip本质上会一是安装mitmproxy库的相关代码,二是安装mitmproxy.exe/ ...
- css颜色的五种表示方法
一.最简单.最古老的颜色类型在CSS颜色的关键词,如red blue等. 二.十六进制值,如#0000. 三.RGB: rgb(255,0,0),这是给定的三个参数表示的红色,绿色和蓝色通道的颜色值每 ...
- python-模块2
from collections import namedtuple # # 类 # p = namedtuple("Point", ["x", "y ...