一、什么是迭代器

迭代指的是一个重复的过程,每一次重复都是基于上一次的结果而来的

# 这里的循环也是一个迭代,每次基于上一次的结果而取值
li = 'hello' i = 0
while i < len(li):
print(li[i])
i += 1

迭代器指的是迭代取值的工具,该工具的特点是可以不依赖于索引取值

二、为何要用迭代器

  为了找出一种通用的、可以不依赖于索引的迭代取值方式

三、如何使用迭代器

可迭代的对象:但凡内置有 __iter__ 方法的对象都称之为可迭代的对象

  如:str、list、tuple、dict、set、文件对象

迭代器对象:既内置有 __iter__方法,又内置有 __next__ 方法

  如:文件对象

关于 __iter__ 方法:

  调用可迭代对象的 __iter__ 会的到一个迭代器对象

  调用迭代器对象的 __iter__ 会的到迭代器本身

可迭代对象可以转化为迭代器对象:调用可迭代对象内置的 __iter__ 方法会有一个返回值,该返回值就是对应的迭代器对象

dic = {'x':1, 'y':2, 'z':3}

iter_dic = dic.__iter__()
print(iter_dic) res1 = iter_dic.__next__()
print(res1) res2 = iter_dic.__next__()
print(res2) res3 = iter_dic.__next__()
print(res3)
# 每次取一个值, 取完了没有就会报错
res4 = iter_dic.__next__()
print(res4)

使用迭代器

dic = {'x':1, 'y':2, 'z':3}

# 注意:这样每次只会取到x,因为每次取值都是从dic去取,不是基于上一次的结果
print(dic.__iter__().__next__())
print(dic.__iter__().__next__())
print(dic.__iter__().__next__())

注意

四、for循环的本质

for循环的本质就是一个迭代器,原理如下:

  1、先调用for语句中in后面的值的 __iter__ 方法,得到迭代器对象

  2、执行迭代器 __next__ 方法得到一个返回值,然后赋值给一个变量,运行循环体代码

  3、循环往复,直到迭代器取值完毕抛出异常,然后捕捉异常自动结束循环

 五、生成器

常规定义函数,但是,使用yield语句而不是return语句返回结果。yield语句执行一次返回一个结果

yield关键字:只能用在函数内

在函数内但凡包含有yield关键字,再去执行函数,就不会立刻运行函数体代码,会得到一个返回值,该返回值成之为生成器对象,生成器本质就是迭代器

总结 yield:

  1、提供一种自定义迭代器的解决方案

  2、yield可用于返回值,和return相比,相同点是都可以用于返回值,不同点是yield可以暂停函数,可以返回多次值,而return只能返回值一次值函数就立刻终止

def func():  # 这是一个简单的函数
a = 1
return a print(func()) def func():
print('aaaaaaaaaaa')
a = 1
yield a # 返回第一个值
print('bbbbbb')
yield 12 # 返回第二个值 ret = func() # 得拿到一个生成器
# print(ret) # 返回的是一个地址
print(next(ret)) # 取第一个值
print(next(ret)) # 取第二个值
print(next(ret)) # 取第三个值,会报错,因为没有yield第三个值

初始生成器

练习:写一个功能,在Python3中实现Python2使用range函数的效果

Python2中使用 range 会将结果打印出来,Python3则不会

def my_range(start, stop, step=1):
while start < stop:
yield start
start += step res = my_range(1, 5, 2) # 1 3 next(res)
next(res)

补充:

三元表达式:将简单的 if--else 语句用一条语句完成

x = 10
y = 20
if x > y:
res = x
else:
res = y print(res) # ======================================================================================== x = 10
y = 20
res = x if x > y else y
print(res)

三元表达式

列表生成式

names = ['qiu', 'xi', 'qiuxi', 'zhi', 'fei']
l = []
for name in names:
if name != 'qiu':
res = '%s_1024' %name
l.append(res) print(l) # ======================================================================================== l = ['%s_1024' %name for name in names if name != 'qiuxi']
print(l)

列表生成式

字典生成式

items = [('name', 'qiuxi'), ('age', 22), ('sex', 'male')]

dic = {}
for k, v in items:
dic[k] = v
print(dic) # ======================================================================================== res = {k: v for k, v in items if k != 'sex'}
print(res)

字典生成式

生成器表达式

res=(i**2 for i in range(3))
print(res)
print(next(res))
print(next(res))
print(next(res))
print(next(res))

生成器表达式

Learning-Python【13】:迭代器和生成器的更多相关文章

  1. python之迭代器与生成器

    python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345.我们循环输出. list=[1,2,3,4,5] for i in list: print(i) for i i ...

  2. python基础—迭代器、生成器

    python基础-迭代器.生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样. 只要该对象可以实现__iter__方法,就可以进行迭代. 迭代对象调用__iter__方法会返 ...

  3. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  4. Python之迭代器和生成器

    Python 迭代器和生成器 迭代器 Python中的迭代器为类序列对象(sequence-like objects)提供了一个类序列的接口,迭代器不仅可以对序列对象(string.list.tupl ...

  5. 【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  6. Python之迭代器,生成器

    迭代器 1.什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. from collections import Iterable l = [1,2,3,4] t ...

  7. python之迭代器、生成器与面向过程编程

    目录 一 迭代器 二 生成器 三 面向过程编程 一.迭代器 1.迭代器的概念理解 ''' 迭代器从字面上理解就是迭代的工具.而迭代是每次的开始都是基于上一次的结果,不是周而复始的,而是不断发展的. ' ...

  8. day13 python学习 迭代器,生成器

    1.可迭代:当我们打印 print(dir([1,2]))   在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...

  9. Python之迭代器及生成器

    一. 迭代器 1.1 什么是可迭代对象 字符串.列表.元组.字典.集合 都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? from collections import Itera ...

  10. python基础----迭代器、生成器、协程函数及应用(面向过程实例)

    一.什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2.可迭代 ...

随机推荐

  1. 剑指offer——python【第21题】栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  2. jquery截取地址栏中url参数的值

    <script> /*http://127.0.0.9/index.php?s=/Home/Index/fangguan_shuju&zc=2*/ function getQuer ...

  3. django 初始命令

    1.安装django pip3 install django 2.创建一个Django对象 django-admin.py startproject 项目名称 django-admin.py star ...

  4. Web开发——HTML DOM基础

    文档资料参考: 参考:HTML DOM 参考手册 参考:HTML DOM 教程 目录: 1.HTML DOM (文档对象模型) 2.查找 HTML 元素 2.1 通过 id 查找 HTML 元素 2. ...

  5. Python_环境部署及报错汇总(0)

    一.安装Anaconda Anaconda是一个开源的包.环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换. Anaconda包括Conda.Python以及 ...

  6. alibaba dubbo admin的安装

    一.下载地址 https://github.com/apache/incubator-dubbo-admin 然后把项目作为maven项目 前端部分 使用Vue.js作为javascript框架,Vu ...

  7. RVIZ实现模拟控制小车

    RVIZ是一个强大的可视化工具,可以看到机器人的传感器和内部状态. 1.安装rbx1功能包Rbx1是国外一本关于ros的书中的配套源码,包含了机器人的基本仿真.导航.路径规划.图像处理.语音识别等等. ...

  8. expdp 字符集从ZHS16GBK到AL32UTF8

    源oracle数据库是GBK字符集,目标库是UTF8字符集,现在需要将源库的一个表空间数据导入到目标库.我的解决方法有点繁琐,首先直接导出源库的表空间 expdp trmuser/trmpass sc ...

  9. Apache环境下配置多个站点的SSL证书

    重新创建apache目录中conf/extra/下的httpd-ssl.conf文件 NameVirtualHost *:443 Listen 443 <VirtualHost *:443> ...

  10. python数据结构-如何为元组中的每个元素命名

    如何为元组中的每个元素命名 简述 当对象数据格式固定时,用元组比列表更节省内存空间, 我们使用索引访问元组元素,但是这种访问方式会降低程序的可读性. 举个栗子 对于学生的信息,我们有固定的数据格式,我 ...