一.迭代器

只要对象本身有_iter_()_方法,那它就是可迭代的

执行__iter__就会生成迭代器

迭代器有__next__用于获取值

__next__超出界限了会报StopIteration异常

迭代器是一次性的, 且只能一直往前迭代

获取生成器的方法:

迭代器 = 可迭代对象.__iter__()

迭代器 = iter(可迭代对象)
 
生成器获取下一个值的方法:
迭代器.__next__()

next(迭代器)
 
获取异常
d = {'a':1, 'b':2,'c':3}
i = iter(d)
while True:
try:
print(next(i))
except StopIteration:
break
 
 
 
for中的迭代器:

  for循环中in后面的就是迭代器

  实际上对于不是迭代器的for循环会自动处理成迭代器, 且在for中自动处理异常现象

d = {'a':1, 'b':2,'c':3}

for i in d:
print(i)
 
 
文件的迭代器:

  文件句柄本身就是一个迭代器

  迭代器既含有__next__也含有__iter__

常用数据类型与迭代器:

  可迭代对象:

    字符串, 列表, 元组, 字典, 集合, 文件

  迭代器:

    文件

  判断方法:

from collections import Iterable,Iterator

f=open('file')
#判断可迭代的
print(isinstance(f,Iterable))
#查看是否是迭代器
print(isinstance(f,Iterator))
 
二.生成器

生成器是在函数中, 修改return为yield

  效果:

    执行该函数之后, 并没有执行该函数体

    执行之后, 会返回一个生成器

    生成器调用next()函数之后, 会执行函数体到yield语句位置

    再调用next()函数之后, 会接着上次yield的位置继续执行函数体

    使用for循环调用生成会一次循环就是执行到一个yield 

    生成器是迭代器的一种

    生成器一样可能会产生StopIteration异常, 需要在执行next()语句中加入异常处理

def ger(max):

    for i in range(max):
yield i g = ger(2) try:
print(next(g))
print(next(g))
print(next(g))
print(next(g))
except StopIteration:
print("done")
 
 
生成器的应用
模拟tail -f的效果
import time

def tail(file):
with open(file, "r") as f:
f.seek(0, 2)
while True:
line = f.readline().strip()
if line:
yield line
else:
time.sleep(0.3)
continue g = tail('file')
for line in g:
print(line.strip())
 
模拟tail -f | grep的效果
import time

def tail(file):
with open(file, "r") as f:
f.seek(0, 2)
while True:
line = f.readline().strip()
if line:
yield line
else:
time.sleep(0.3)
continue def grep(pattern,lines):
for line in lines:
if pattern in line:
yield line g = tail('file')
g1 = grep('info', g) for line in g1:
print(line.strip())
 
 
三.协程函数

协程函数的定义:

    在生成器的基础上, 针对yield转换为赋值语句

  具体的表现形式如下

def eater(name):
print(name)
while True:
food, soup = yield
print("start to eat", food, soup)
print("done") g = eater("egon") next(g) g.send(("咖喱鸡肉盖饭","酸梅汤"))
 

协程函数的作用:

    yield 后面继续可以添加返回值

    yield前面的内容可以通过send函数来传递参数

    参数的个数和顺序要和定义的一致, 且不能有空缺

 

python之迭代器篇的更多相关文章

  1. 第十六篇 Python之迭代器与生成器

    一.迭代器 一. 递归和迭代 生活实例说明什么是递归和迭代 A想去腾达大厦,问B怎么走路,B 说我不知道,我给你问问C,C也不知道,C又去问D,D知道,把路告诉了C,C又告诉B,B最后告诉A, 这就是 ...

  2. 第六篇:Python函数进阶篇

    在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点:  一.Python的迭代器 ...

  3. python基础——迭代器

    python基础——迭代器 我们已经知道,可以直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list.tuple.dict.set.str等: 一类是generator,包括生成器 ...

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

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

  5. python之迭代器与生成器

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

  6. Python:迭代器的简单理解

    一.什么是迭代器 迭代,顾名思义就是重复做一些事很多次(就现在循环中做的那样).迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序 ...

  7. python——iterator迭代器|iterator详解——20140918|

    -----------------------------------------------------------------------------前言--------------------- ...

  8. Python+Selenium练习篇之1-摘取网页上全部邮箱

    前面已经介绍了Python+Selenium基础篇,通过前面几篇文章的介绍和练习,Selenium+Python的webUI自动化测试算是入门了.接下来,我计划写第二个系列:练习篇,通过一些练习,了解 ...

  9. Python人工智能第一篇:语音合成和语音识别

    Python人工智能第一篇:语音合成和语音识别 ​ 此篇是人工智能应用的重点,只用现成的技术不做底层算法,也是让初级程序员快速进入人工智能行业的捷径.目前市面上主流的AI技术提供公司有很多,比如百度, ...

随机推荐

  1. es6 let和const

    一.let 1.let块作用域 if(true){ var a=1; let b=2; } console.log("a:"+a);//a:1 console.log(" ...

  2. reconnecting-websocket.js

    websocket是HTML5下一个不错的网络协议解决方案,有一个场景很多猿猿都会遇到,手机锁屏后大约60秒,IOS会自动断开websocket连接,连接丢失了,那我们的数据也就断了.websocke ...

  3. mysql把查询结果集插入到表理

    把表B的内容插入到表A INSERT INTO 1111_0 SELECT*FROM report_0 把查询结果集插入到表中 insert into A(a,b,c) select from B(a ...

  4. url、querystring模块获取请求request.url中的不同部分图解

    url.parse(string).query | url.parse(string).pathname | | | | | ------ ------------------- http://loc ...

  5. ionic2+集成第三方sdk时,合并多个清单文件的方法

    具体方案android studio官网上已经给出,但需要架梯子,所以这篇文章直接把它搬到墙内,方便查看: 合并多个清单文件 合并优先级 合并冲突启发式算法 合并规则标记 节点标记 属性标记 标记选择 ...

  6. Python select解析

    一.首先列一下,sellect.poll.epoll三者的区别 1.select a.select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监控多个文件描述符的数组,当 ...

  7. 系统环境变量(就是不需要切换目录,敲击“python”就可以进入编码器)

    1.右击我的电脑,选择属性,选择“高级系统设置” 2.选择高级,选择环境变量 3.在系统变量中找到path,点击编辑.然后新建,将python的路径复制进去,点击确定.

  8. vue中使用axios最详细教程

    前提条件:vue-cli 项目 安装: npm npm 在main.js导入: // 引入axios,并加到原型链中 import axios from 'axios'; Vue.prototype. ...

  9. PHP页面间传值的几种方法

    方法一:require_once //Page a: <?php $a = "hello"; ?> //Page b: <?php require_once &q ...

  10. 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...