一.迭代器

只要对象本身有_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. JDK1.8 JVM参数配置

    JAVA_OPTS=" -server #服务器模式 -Xmx4g #JVM最大允许分配的堆内存,按需分配 -Xms4g #JVM初始分配的堆内存,一般和Xmx配置成一样以避免每次gc后JV ...

  2. Lazy<T> 延迟加载

    namespace ConsoleAppTest { class Program { static void Main(string[] args) { Lazy<Student> stu ...

  3. 关于64位 MS SQL 导入导出 Oracle 引发 ORA-06413 的解决方法

    如果在X64系统下我们想利用 MS SQL 的DTS导入导出 Oracle 数据,由 oracle 不支持路径中包含")",会引发 ORA-06413:连接未打开错误 解决的办法很 ...

  4. LeetCode-450 二叉搜索树删除一个节点

    二叉搜索树 建树 删除节点,三种情况,递归处理.左右子树都存在,两种方法,一种找到左子树最大节点,赋值后递归删除.找右子树最小同理 class Solution { public: TreeNode* ...

  5. The connection string 'MysqlEF' in the application's configuration file does not contain the require异常

    在学习EF core first 对接mysql时,出现了这个异常. 原因是:连接字符串中缺少providerName="MySql.Data.MySqlClient" <a ...

  6. Spring boot自定义启动字符画(banner)

    spring boot项目启动时会打印spring boot的ANSI字符画,可以进行自定义. 如何自定义 实现方式非常简单,我们只需要在Spring Boot工程的/src/main/resourc ...

  7. jQuery中live函数的替代-【jQuery】

    在老版本的jQuery中,当需要对页面上某个由ajax加载的某片段的页面内容响应事件时,可以使用live函数来响应其事件,比如: $('a').live('click', function() { b ...

  8. 【Android】Android 4.0 Launcher2源码分析——启动过程分析

    Android的应用程序的入口定义在AndroidManifest.xml文件中可以找出:[html] <manifest xmlns:android="http://schemas. ...

  9. Telnet和SSH

    1. 协议用途 Telnet和SSH用于远程访问服务器的的两大常用协议.利用它们,我们可以管理并监控生产服务器和企业服务器,更新服务器内核,安装最新的软件包和补丁,能够远程登录服务器,开展软件开发.测 ...

  10. Codeforces 305E Playing with String 博弈

    我们可以把每段连续可以选的字符看成一个游戏, 那么sg[ i ]表示连续 i 个字符可选的sg值. 然后找找第一个就好啦. #include<bits/stdc++.h> #define ...