python系列九:python3迭代器和生成器
#!/usr/bin/python
import sys
'''
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器
'''
list1 = [1,2,3,4,5]
it1 = iter(list1) # 创建迭代器对象
#迭代器对象可以使用常规for语句进行遍历
for x in it1:
print(x, end = ",")
#列表自己也可以使用for循环进行遍历
for x in list1:
print(x, end = ":")
#也可以使用while循环进行遍历,使用 next() 函数
it2 = iter(list1)
'''
while True:
try:
print(next(it2)) # 输出迭代器的下一个元素
except StopIteration:
sys.exit()
'''
'''
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。
并在下一次执行 next()方法时从当前位置继续运行。
'''
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, count = 0, 1, 0
while True:
if count > n:
return
yield a
a, b = b, a + b
print(a, b)
count += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
while True:
try:
print(next(f), end = ":")
except StopIteration:
break;
#sys.exit()
#没有yield时,函数只是简单执行,没有返回迭代器f
def fibonacci2(n): # 生成器函数 - 斐波那契
a, b, count = 0, 1, 0
while True:
if count > n:
return
#yield a
a, b = b, a + b
print(a, b)
count += 1
f = fibonacci2(10) # f 是一个迭代器,由生成器返回生成
'''
while True:
try:
print(next(f), end = " ") #TypeError: 'NoneType' object is not an iterator
except StopIteration:
sys.exit()
'''
'''
什么情况下需要使用 yield?
一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),
并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),
这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到list的每个元素
而不是直接得到一个完整的list来节省内存,这个时候 yield 就很有用。
'''
def f(n):
a, b, count = 0, 1, 0
L = []
while True:
if count > n:
return
L.append(b)
a, b = b, a + b
count += 1
return L #返回一个n个数的list,当这个n很大的时候,会非常的占用内存。
fun = f(1000)
'''
while True:
try:
print(next(fun), end = " ") #这样我们实际上是先生成了一个1000个元素的 list:f,然后我们再去使用这个f。#TypeError: 'NoneType' object is not an iterator
except StopIteration:
sys.exit()
'''
#因为我们实际使用的是list的遍历,也就是list的迭代器。那么我们可以让这个函数f每次只返回一个迭代器——一个计算结果,
#而不是一个完整的 list,运行方式是每次的调用都在 yield 处中断并返回一个结果,然后再次调用的时候再恢复中断继续运行。
def f(n):
a, b, count = 0, 1, 0
while True:
if count > n:
return
yield b
a, b = b, a + b
count += 1
return L #返回一个n个数的list,当这个n很大的时候,会非常的占用内存。
fun = f(10)
while True:
try:
print(next(fun), end = " ") #这样我们实际上是先生成了一个1000个元素的 list:f,然后我们再去使用这个f。
except StopIteration:
sys.exit()
python系列九:python3迭代器和生成器的更多相关文章
- Python3+迭代器与生成器
转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...
- python014 Python3 迭代器与生成器
Python3 迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式..迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结 ...
- 完全理解 Python 迭代对象、迭代器、生成器(转)
完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...
- 完全理解 Python 迭代对象、迭代器、生成器
完全理解 Python 迭代对象.迭代器.生成器 2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 分享到: 原文出处: liuzhijun 本文源自RQ作者 ...
- 理解Python迭代对象、迭代器、生成器
作者:zhijun liu链接:https://zhuanlan.zhihu.com/p/24376869来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文源自RQ作 ...
- Python之模块,迭代器与生成器
本节涉及内容: 1. 迭代器和生成器 2. 递归 3. 字符串格式化 4. 模块 内置模块 自定义模块 第三方模块 5. 序列化的模块 json pickle (一). 迭代器和生成器: 迭代器: ...
- python学习笔记四 迭代器,生成器,装饰器(基础篇)
迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...
- python基础篇_005_迭代器和生成器
Python迭代器和生成器 1.迭代器 迭代:可以将某个数据集内的数据“一个挨着一个的取出来” for i in range(1, 10, 2): # in 后面的对象必须是一个可迭代的 print( ...
- 【笔记】Python基础四:迭代器和生成器
一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...
- Python开发——函数【迭代器、生成器、三元表达式、列表解析】
递归和迭代 小明问路篇解释说明 递归:小明——>小红——>小于——>小东:小东——>小于——>小红——>小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...
随机推荐
- Cocos2d-x3.2 LayerMultiplex使用说明
LayerMultiplex是层的控制器类 使用例如以下 LayerMultiplexTest.h // // LayerMultiplexTest.h // cpp4 // // Created b ...
- HDU 4925 Apple Tree(推理)
HDU 4925 Apple Tree 题目链接 题意:给一个m*n矩阵种树,每一个位置能够选择种树或者施肥,假设种上去的位置就不能施肥,假设施肥则能让周围果树产量乘2.问最大收益 思路:推理得到肯定 ...
- iOS开发-重写description方法,自定义控制台(log)信息
description是所有类都有的一个方法. 我们重写这个方法,可以自定义实例输出的信息. 比如我们创建一个Person类: 在.h文件中添加两个属性: #import <Foundation ...
- 经常使用传感器协议3:CJ/T-188 冷热量表协议解析2
本文详细阐述JY公司冷热量表(记热量)传输协议.并以此说明CJ/T-188协议在厂家详细应用时,并不一致. 本文及兴许文章将对这些不同点予以总结(文中所述协议与日志"CJ/T-188 ...
- Atitit.导出excel报表的设计与实现java .net php 总
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
- 基于RocketIO的高速串行协议设计与实现
随着对信息流量需求的不断增长, 传统并行接口技术成为进一步提高数据传输速率的瓶颈.过去主要用于光纤通信的串行通信技术—SERDES正在取代传统并行总线而成为高速接口技术的主流.SERDES 是串行器) ...
- 关于angularjs在IE里的坑——F12工具打开,功能正常,关闭之后,angularjs not working
前端时间在做项目的时候,用到了angularjs,期间,发现了一个奇葩的问题,就是在IE11浏览器下,点击下方图1上箭头所示的位置,将此处的开关变为图2中箭头所示的样子,但是发觉没有反应,开关还是灰色 ...
- linux跨主机复制文件
scp -r billing@10.200.171.111:/billdata2/user/yanhm/redis/* /newboss/billing/user/aabb 其中: 10.200.17 ...
- Asteroids - poj 3041(二分图最大匹配问题)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17258 Accepted: 9386 Description Be ...
- sed & awk & grep 专题( 鸟哥 )
grep, sed 与 awk 相当有用 ! gerp 查找, sed 编辑, awk 根据内容分析并处理. awk(关键字:分析&处理) 一行一行的分析处理 awk '条件类型1{动作1}条 ...