python 迭代器 一个奇怪的解决方法
一般我们在类里面写迭代器都是如下写法:
class IterableSomthing:
def __iter__(self):
return self def __next__(self):
return 1
但是,《流畅的python》给出了不同的见解。该书指出,在数据结构内实现迭代器是个很蠢的想法,因为需要引入游标指针记录位置的缘故,这么实现迭代器会造成数据结构空间性能下降,同时,因为游标指针的独立性使得改数据结构无法并发遍历,所以又造成了时间性能的下降。代码如下
class Node:
def __init__(self, item):
self.item = item
self.pre = None
self.next = None class Deque:
def __init__(self):
"""创建一个空的双端队列"""
self.head = None
self.tail = None
self.point = self.head #游标指针 def add_front(self, item):
"""从队头加入一个item元素"""
n0 = Node(item)
if self.head:
n0.next = self.head
self.head.pre = n0
self.head = n0
else:
self.head = n0
self.tail = n0
self.zero() def add_rear(self, item):
"""从队尾加入一个item元素"""
n0 = Node(item)
if self.tail:
n0.pre = self.tail
self.tail.next = n0
self.tail = n0
else:
self.head = n0
self.tail = n0
self.zero() def remove_front(self):
"""从队头删除一个item元素"""
if self.head:
if self.head == self.tail:
self.head = None
self.tail = None
else:
self.head.next.pre = None
self.head = self.head.next
self.zero() def remove_rear(self):
"""从队尾删除一个item元素"""
if self.tail:
if self.head == self.tail:
self.head = None
self.tail = None
else:
self.tail.pre.next = None
self.tail = self.tail.pre
self.zero() def is_empty(self):
"""判断双端队列是否为空"""
return self.head is None def size(self):
"""返回队列的大小"""
i = 0
n0 = self.head
while n0:
i += 1
n0 = n0.next
return i def tolist(self):
li = []
n0 = self.head
while n0:
li.append(n0.item)
n0 = n0.next
return li def gen(self):
n0 = self.head
while n0:
# print(id(self))
yield n0.item
n0 = n0.next
raise StopIteration def __iter__(self):
# n0 = self.head
# while n0:
# # print(id(self))
# yield n0.item
# n0 = n0.next
# raise StopIteration
return self def __next__(self):
if self.point:
n0 = self.point
self.point = self.point.next
return n0.item
else:
self.zero()
raise StopIteration def zero(self): #游标指针归零函数
self.point = self.head
这是个双端队列的python实现,如果实现了迭代器,就必须实现游标指针类属性,游标指针归零类方法,着实降低了开发效率
有没有别的解决方法呢?
有
只要改一处:
def __iter__(self):
__index_temp = self.__head
while __index_temp:
n0 = __index_temp
__index_temp = __index_temp.next
yield n0
else:
raise StopIteration
对你没看错,没有__next__函数!没有游标指针!没有归零函数!
这个__iter__函数需要返回一个迭代器,我们就给他一个,因为生成器也是迭代器!
此时,这个双端队列的python实现就不是一个迭代器了,而是一个可迭代对象,就可以用for循环迭代了
def test2():
s1 = DoubleLinkList()
for i in range(1000):
s1.append(i)
for ii in s1:
print(ii.item)
if ii.item == 500:
print('------------------------------------------------------------------------------')
break
for ii in s1:
print(ii.item)
而且每一个for循环都是独立的,因为每个for循环块获得的对象都是一个独立的生成器,相互之间不会干扰,虽然看起来都是调用同一个对象,但实际上完全不是这么一回事,这就和list的实现是一样一样的,这样的话做并发循环就容易多了。
思考:python里的魔术方法都很有用,但是我们是要为了实现某个功能专门实现对应的魔术方法呢,还是直接实现对应的功能函数呢?
魔术方法是为了其他方法服务的基本方法,还是锦上添花的增补手段呢?
python 迭代器 一个奇怪的解决方法的更多相关文章
- python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色)
python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色) 前言 在 python 开发中,有时候想通过cmd窗口来和用户交互,比如显示信息之类的,会比自己创建 GUI 来的方便,但是随之而 ...
- python __file__ is not defined 解决方法
python __file__ is not defined 解决方法 __file__ 是在python module 被导入的时候生成的一个变量,所以在 __file__ 不能被使用,但是又想获取 ...
- Python更新pip出现错误解决方法
Python更新pip出现错误解决方法 更新pip python -m pip install --upgrade pip 查看时报错 解决方法 在命令栏(即win+r)输入:easy_install ...
- Emgu CV的一个异常的解决方法
今年组里有大项目落我头上了,并不能像去年一样回家还能搞搞Cocos2dX,一把老泪流了下来... 回到正题,由于组里需要做一个显示板的自动测试项目,涉及到Computer Vision.不得不说,这才 ...
- python socket.error: [Errno 10054] 解决方法
我用的是python2.7 我搜网上10054错误解决方法的时候发现,大部分文章都是以python3为基础的,对于python2不适用. python socket.error: [Errno 1 ...
- 一个简单的解决方法:word文档打不开,错误提示mso.dll模块错误。
最近电脑Word无故出现故障,无法打开,提示错误信息如下: 问题事件名称: APPCRASH应用程序名: WINWORD.EXE应用程序版本: 11.0.8328.0应用程序时间戳: 4c717ed1 ...
- C# 该行已经属于另一个表 的解决方法[转]
该文转自:http://blog.sina.com.cn/s/blog_48e4c3fe0100nzs6.html DataTable dt = new DataTable(); dt = ds.Ta ...
- The “SignFile” task was not given a value for the required parameter “CertificateThumbprint”的一个简单的解决方法
这个只是其中一种解决方法,而且不是万能的 1. 由提示内容可以看出,这个一个 sign(认证)的问题, 在出现这个问题的项目上,鼠标右键,选择properties,然后选择signing. 2. 选择 ...
- python 进程内存增长问题, 解决方法和工具
转载:http://drmingdrmer.github.io/tech/programming/2017/05/06/python-mem.html#pyrasite-%E8%BF%9E%E6%8E ...
随机推荐
- Jmeter之正则表达式提取器应用
说到Jmeter正则表达式提取器的应用,就不得不说到关联.所谓关联,就是把应用中动态变化返回的数据获取到,把它保存为一个参数,提供给后面需要用到的地方进行使用. Jmeter中关联是通过“添加—后置处 ...
- winfrom程序Datagridview列名问题
之前在做程序的时候,有遇到过这个问题: 无法将类型“string”隐式转换为“System.Windows.Forms.DataGridViewTextBoxColume"解决方法 解决办法 ...
- iptables介绍
iptables防火墙可以用于创建过滤(filter)与NAT规则.所有Linux发行版都能使用iptables. iptables的结构:iptables-->Tables-->Chai ...
- 北航OO第二单元总结
电梯调度的设计策略 第一次作业是单部多线程傻瓜电梯 这次作业的电梯名副其实是一部傻瓜电梯,每次只能运一个人.出于线程安全的考虑,选择了阻塞队列.然后按照先来先服务的原则服务下一个指令.没有什么复杂的设 ...
- python1-集合、函数-(全局变量与局部变量)
集合 # s=set('hello')# print(s)## s=set(['alex','alex','sb'])# print(s) # s={1,2,3,4,5,6} #添加# s.add(' ...
- 俄罗斯方块win c 图形线程
环境准备:visual stdio 2015,easyx, //
- ng-repeat 中的track by
<div style="font-size:15px"ng-repeat="item in groups.items track by $index"&g ...
- Python爬虫开源项目代码,爬取微信、淘宝、豆瓣、知乎、新浪微博、QQ、去哪网等 代码整理
作者:SFLYQ 今天为大家整理了32个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快 1.WechatSogou [ ...
- PAT B1013
PAT B1013 标签(空格分隔): PAT 解法:埃氏筛法 注意点: 1. 由于不知道第n个素数有多大,所以要用一个大的数组来储存结果. 2. 注意输出格式,末尾不能有多余空格 #include ...
- IntelliJ IDEA及maven、git下载与配置
maven下载地址:http://maven.apache.org/download.cgi,下载bin文件然后解压 maven环境变量配置: MAVEN_HOME:D: \install\apac ...