1、迭代器(Iterator)

  • 迭代是访问集合元素的一种方式
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

实例1:

basket = ['apple', 'orange', 'pear', 'banana']

it = iter(basket)  # 创建迭代器对象

# 输出迭代器的下一个元素
print(next(it)) # 输出迭代器的下一个元素
print(next(it))

以上代码,输出:

apple
orange

实例2:

basket = 'abc'
it = iter(basket) # 创建迭代器对象 print(next(it)) # 输出迭代器的下一个元素 print(next(it)) # 输出迭代器的下一个元素

以上代码,输出:

a
b

通常会和for语句搭配使用,如:

basket = 'abc'
it = iter(basket) # 创建迭代器对象
for n in it:
print(n)

以上代码,输出:

a
b
c

Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么?

因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,也就是说有多少是可知的。但迭代器不是,迭代器不知道要执行多少次,所以可以理解为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的。

判断是不是可以迭代,用Iterable

from collections import Iterable

print('{} 是Iterable?', isinstance({}, Iterable))
print('() 是Iterable?', isinstance((), Iterable))
print('100 是Iterable?', isinstance(100, Iterable))

以上代码,输出:

{} 是Iterable? True
() 是Iterable? True
100 是Iterable? False

判断是不是迭代器,用Iterator

from collections import Iterator

print('{} 是Iterable?', isinstance({}, Iterator))
print('() 是Iterable?', isinstance((), Iterator))
print('(x for x in range(10)) 是Iterable?', isinstance((x for x in range(10)), Iterator))

以上代码,输出:

{} 是Iterable? False
() 是Iterable? False
(x for x in range(10)) 是Iterable? True

凡是可以for循环的,都是Iterable

凡是可以next()的,都是Iterator

集合数据类型如list,truple,dict,str,都是Itrable不是Iterator,但可以通过iter()函数获得一个Iterator对象

Python中的for循环就是通过next实现的

for x in [1, 2, 3, 4, 5]:
pass

等价于

# 先获取iterator对象
it = iter([1, 2, 3, 4, 5])
while True:
try:
# 获取下一个值
x = next(it) except StopIteration:
# 遇到StopIteration就退出循环
break

2、生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

  • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
  • 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。
def fibonacci(n):  # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if counter > n:
return
yield a
a, b = b, a + b
counter += 1 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

什么情况下需要使用 yield?一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用。

python3 第十八章 - 迭代器与生成器的更多相关文章

  1. python3学习笔记10(迭代器和生成器)

    参考http://www.runoob.com/python3/python3-iterator-generator.html 迭代器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束 ...

  2. Python笔记(十)_迭代器与生成器

    迭代 用for...in来遍历一个可迭代对象的过程就叫迭代 可迭代对象:列表.元组.字典.集合.字符串.生成器 可以使用内置函数isinstance()判断一个对象是否是可迭代对象 >>& ...

  3. 吴裕雄--天生自然 PYTHON3开发学习:迭代器与生成器

    list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ") import sys # 引入 s ...

  4. python3 第二十八章 - 内置函数之List相关

    Python包含以下函数: 序号 函数 实例 1 list.append(obj)在列表末尾添加新的对象   2 list.count(obj)统计某个元素在列表中出现的次数   3 list.ext ...

  5. Python3基础教程(十六)—— 迭代器、生成器、装饰器

    在这个实验里我们学习迭代器.生成器.装饰器有关知识. 这几个概念是 Python 中不容易理解透彻的概念,务必把所有的实验代码都完整的输入并理解清楚其中每一行的意思. 迭代器 Python 迭代器(I ...

  6. Python3+迭代器与生成器

    转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...

  7. python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器

    一.元组: tuple Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组 tup2 = (111, 22, 33, ...

  8. python3.7 迭代器和生成器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 迭代器和生成器 #迭代器协议: ''' 1.迭代器协议是指:对象 ...

  9. 流畅python学习笔记:第十四章:迭代器和生成器

    迭代器和生成器是python中的重要特性,本章作者花了很大的篇幅来介绍迭代器和生成器的用法. 首先来看一个单词序列的例子: import re re_word=re.compile(r'\w+') c ...

随机推荐

  1. 知识点练习day9

    列表 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[]内可以有多个任意类型的值,逗号分隔 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] ...

  2. Promise实现小球的运动

        Promise简要说明 Promise可以处理一些异步操作:如像setTimeout.ajax处理异步操作是一函数回调的方式;当然ajax在jQuery版本升级过程中,编写方式也有所变动. P ...

  3. 海康、大华IPC的rtsp格式

    海康: rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例 ...

  4. Java中的集合框架(上)

    Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的 ...

  5. vue.js之路由

    Vue.js本身只提供数据与视图绑定及组件化等功能,如果想用它来开发一个完整的SPA(单页面应用),我们就还需要使用一些Vue.js的插件.今天我学习一种叫做Vue-router的插件,用来提供路由管 ...

  6. mongodb 聚合查询

    操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的字段排序结 ...

  7. 从头开始基于Maven搭建SpringMVC+Mybatis项目(2)

    接上文内容,本节介绍Maven的聚合和继承. 从头阅读传送门 互联网时代,软件正在变得越来越复杂,开发人员通常会对软件划分模块,以获得清晰的设计.良好的分工及更高的可重用性.Maven的聚合特性能把多 ...

  8. Java入门篇(二)——Java语言基础(上)

    本篇我们开始进入Java的学习,首先在学习如何编写Java语言前要先了解Java程序的基本结构. 一.Java程序的基本结构 一个Java程序的基本结构大体可以分为包.类.main()主方法.标识符. ...

  9. js分享功能

    引用JiaThis的分享功能: 直接在想要放置分享功能的地方加上如下代码即可: <!-- JiaThis Button BEGIN --> <div class="jiat ...

  10. [51nod1457]小K vs. 竹子

    小K的花园种着n颗竹子(竹子是一种茎部中空并且长得又高又快的热带植物).此时,花园中第i颗竹子的高度是hi米,并且在每天结束的时候它生长ai米. 实际上,小K十分讨厌这些竹子.他曾经试图去砍光它们,但 ...