python协程初步---一个迭代器的实现
一般认为迭代器就是实现了两个方法__iter__和__next__
- 先创建这样一个类
from collections import Iterable
from collections import Iterator class classiterable(object):
def __iter__(self):
pass
def __next__(self):
pass class mycoach(object):
def __init__(self):
pass
def addname(self):
pass
def __iter__(self):
return classiterable()
cpc = mycoach() print("类对象可以被迭代" if isinstance(cpc,Iterable) else "无法被迭代")
输出结果:
类对象可以被迭代
通过在mycoach类的方法__iter__中返回classiterable实现了mycoach和classiterable类之间的联系
- 实现classiterator访问mycoach类中的属性
from collections import Iterable
from collections import Iterator class classiterable(object):
def __init__(self,obj):
self.obj = obj
self.count = #添加一个计数器,确保按顺序遍历数组 def __iter__(self):
pass
def __next__(self):
#防止迭代过头
if self.count<len(self.obj.coachname):
ret = self.obj.coachname[self.count]
self.count+=
return ret
else:
raise StopIteration class mycoach(object):
def __init__(self):
self.coachname=[]
def addname(self,name):
self.coachname.append(name)
def __iter__(self):
return classiterable(self)
cpc = mycoach()
cpc.addname('陈培昌')
cpc.addname('程劲')
cpc.addname('徐晓冬')
for i in cpc:
print(i)
print("类对象可以被迭代" if isinstance(cpc,Iterable) else "无法被迭代")
输出结果:
陈培昌
程劲
徐晓冬
类对象可以被迭代
- 完全进化版本---mycoach内部实现__next__魔术方法
class mycoach(object):
def __init__(self):
self.coachname=[]
self.count=
def addname(self,name):
self.coachname.append(name)
def __iter__(self):
return self
def __next__(self):
if self.count<len(self.coachname):
ret = self.coachname[self.count]
self.count+=
return ret
else:
raise StopIteration cpc = mycoach()
cpc.addname('陈培昌')
cpc.addname('程劲')
cpc.addname('徐晓冬')
for i in cpc:
print(i)
print("类对象可以被迭代" if isinstance(cpc,Iterable) else "无法被迭代")
输出结果:
陈培昌
程劲
徐晓冬
类对象可以被迭代
- 斐伯纳契数列
class mywenwa(object):
def __init__(self,num):
self.a,self.b=,
self.count=
self.times=num
def __iter__(self):
return self
def __next__(self):
if self.count <self.times:
self.a,self.b = self.a+self.b,self.a
ret = self.b
return ret
else:
raise StopIteration
saiwa = mywenwa()
print(next(saiwa))
print(next(saiwa))
print(next(saiwa))
print(next(saiwa))
print(next(saiwa))
print(next(saiwa))
print(next(saiwa))
print(next(saiwa))
print(next(saiwa))
.......
输出结果:
python协程初步---一个迭代器的实现的更多相关文章
- python协程初步---一个生成器的实现
和列表那种一下占据长度为n的内存空间不同的是,生成器在调用的过程中逐步占据内存空间,因此有着很大的优势 一个斐波纳契数列的例子 def myfibbo(num): a,b=, count= while ...
- python协程初步--gevent库使用以及解释什么是猴子补丁monkey_patch
协程工作的特点是遇到阻塞或耗时的任务时就切换,协程的生存依赖于线程,线程依赖于进程 一个似乎有点问题的例子 import gevent,time def kisscpc(num): for i in ...
- 关于python协程的一个例子的学习
例子来自https://blog.tonyseek.com/post/event-manage-with-greenlet/ 加了一些注释看懂了: 注释中的数字表示执行的顺序,这个简单的例子用到了py ...
- Python 协程总结
Python 协程总结 理解 协程,又称为微线程,看上去像是子程序,但是它和子程序又不太一样,它在执行的过程中,可以在中断当前的子程序后去执行别的子程序,再返回来执行之前的子程序,但是它的相关信息还是 ...
- 从yield 到yield from再到python协程
yield 关键字 def fib(): a, b = 0, 1 while 1: yield b a, b = b, a+b yield 是在:PEP 255 -- Simple Generator ...
- [转载] Python协程从零开始到放弃
Python协程从零开始到放弃 Web安全 作者:美丽联合安全MLSRC 2017-10-09 3,973 Author: lightless@Meili-inc Date: 2017100 ...
- Python协程详解(二)
上一章,我们介绍了Python的协程,并讲到用yield达到协程的效果,这一章,我们来介绍yield from的结构和作用 我们先来对比下yield和yield from的用法 def first_g ...
- python协程详解
目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...
- Python协程与Go协程的区别二
写在前面 世界是复杂的,每一种思想都是为了解决某些现实问题而简化成的模型,想解决就得先面对,面对就需要选择角度,角度决定了模型的质量, 喜欢此UP主汤质看本质的哲学科普,其中简洁又不失细节的介绍了人类 ...
随机推荐
- Tomcat部署WEB应用方式
罗列在Tomcat部署web应用的几种方法,供以后翻阅,本博文以helloapp应用为例 Tomcat目录介绍 简单目录介绍如下 bin目录:包含tomcat启动/关闭等脚本,支持linux.wind ...
- AirFlow后台运行调度程序
nohup airflow worker>>$AIRFLOW_HOME/airflow-worker.log >& & nohup airflow scheduler ...
- ora00972标识符过长
oracle10G对于表名的长度限制是30个字节 表名超过30结果不能创建,提示ora00972-标识符过长. 需要将表名控制在30个字节以内
- MongoDB操作-备份和恢复
Mongodb数据库操作-备份 恢复 导出 导入 mongodb数据备份和恢复主要分为二种:一种是针对库的mongodump和mongorestore,一种是针对库中表的mongoexport和mon ...
- redis哈希表数据类型键的设置
命令名称:hset 语法:hset key field value 功能: 1)将哈希表key中的域field的值设为value. 2)如果key不存在,一个新的哈希表被创建并进行hset操作. 3) ...
- sql注入测试(3)---现象分析
那为什么出现以上问题呢?这是程序代码层控制不当导致的.如果web前端对输入数据控制严格,会对数据库进行操作的字符串,在客户端做敏感字符转义处理,或者在操作数据库的dao层,使用动态参数的sql,不使用 ...
- (二)手动配置第一个HelloWorld程序
上例的HelloWorld是由Android sutudio 自动生成的,现在我们手动来配置. 1. 重新创建工程 2. 创建空的Activity 生成的MainActivity.java 文件: p ...
- (一)easyUI之树形网络
树形网格(TreeGrid)可以展示有限空间上带有多列和复杂数据电子表 一.案例一:按tree的数据结构来生成 前台 <%@ page language="java" con ...
- LeetCode 1047. Remove All Adjacent Duplicates In String
1047. Remove All Adjacent Duplicates In String(删除字符串中的所有相邻重复项) 链接:https://leetcode-cn.com/problems/r ...
- CentOS7/RHEL6下,如何查看目录与子目录大小
原文:CentOS7/RHEL6下,如何查看目录与子目录大小 通过强大的[du]命令,可以帮助我们快捷的查看目录的大小,非常实用. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du ...