Iterator and Generator

# Iterator 一个对象,代表了遗传数据流,使用__next__()方法或内置函数next()
# 返回连续的对象,没有数据返回时,抛出StopIteration异常

# iterable 一个对象,能每次返回数据组中的一个成员 for 循环中每次返回一个值 或
# 内置函数iter()传入参数返回iterator对象

# generator 使用了yield或者生成器表达式,申城iterator对象 用一种方便的
# 方法实现了iterator,在for循环取数据或使用next()取数据

# Iterator和Generator的关系
# 针对函数的列表进行优化
# 针对读取大文件进行优化
def gen_num():
    yield 8
    yield 99
    yield 999
g = gen_num()
g
<generator object gen_num at 0x0000014F3F39EC50>
next(g) # 第一次运行
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-12-787e36cb69a2> in <module>()
----> 1 next(g) # 第一次运行

StopIteration: 
def gen_num2():
    for i in range(8):
        yield  i  # yield有类似返回值return的效果
for g in gen_num2():
    print(g)  # 每次取一个值的时候,才生成这个值,节省内存
0
1
2
3
4
5
6
7
my_list = [1,2,3]
next(my_list)  # 用 next方法验证是否为迭代器
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-17-4a97765cd86f> in <module>()
----> 1 next(my_list)

TypeError: ‘list‘ object is not an iterator
next(iter(my_list))
1
next(iter(my_list))
1
it = iter(my_list)
next(it)
1
next(it)
2
from collections import Iterator, Iterable
isinstance(my_list, Iterator)
False
isinstance(iter(my_list), Iterator)
True
isinstance((), Iterator)
False
isinstance((), Iterable)  # 元组不是迭代器,但是可迭代
True
isinstance(range(8), Iterable)
True
isinstance(range(8), Iterator)
False

针对函数的列表进行优化

# Python 3:Fibonacci series up to n
def fib(n):
    a, b = 0, 1
    while a < n:
        print(a, end=‘‘)
        a, b = b, a+b
        print()

fib(9)
0
1
1
2
3
5
8
def fil_list(n):
    a, b = 0, 1
    result = []
    while a < n:
        result.append(a)
        a, b = b, a+b
    return result
fil_list(55)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
fil_list(1000)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
def fib_gen(n):
    a, b = 0, 1
    while a< n:
        yield a
        a, b = b, a+b

fib_gen(80)
<generator object fib_gen at 0x0000014F3EA593B8>
for i in fib_gen(80):
    print(i)
0
1
1
2
3
5
8
13
21
34
55
[i for i in fib_gen(66)]  # 列表推导式
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

针对读取大文件进行优化

import os
base_dir = r‘D:\全栈\全栈资料\第三阶段 python进阶\文件与日志-演示代码\02-auto\data‘
log_path = os.path.join(base_dir, ‘access.log‘)
log_file = open(log_path)
log_data = log_file.readlines()
log_file.close()
len(log_data)
864
def read_log(log_path):
    with open(log_path) as f:
        print(‘Iterator:‘, isinstance(f, Iterator))  # open方法已经为我们生成一个迭代器
        for line in f:
            print(line)
            break

read_log(log_path)
Iterator: True
220.181.7.76 - - [20/May/2010:07:26:23 +0100] "GET / HTTP/1.1" 200 29460 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)"

列表推导式

[i for i in fib_gen(6)]
[0, 1, 1, 2, 3, 5]
m = [i for i in fib_gen(6)]
for i in m:
    print(i)
0
1
1
2
3
5

生成器表达式

(i for i in fib_gen(5))
<generator object <genexpr> at 0x0000014F3EAC9C50>
n = (i for i in fib_gen(9))
for i in n:
    print(i)
0
1
1
2
3
5
8

原文地址:http://blog.51cto.com/13118411/2167884

时间: 2024-10-06 21:44:25

Iterator and Generator的相关文章

Python Iterator and Generator

Python Iterator and Generator Iterator ? 迭代器(Iterator)和可迭代对象(Iterable)往往是绑定的.可迭代对象就是我们平时经常用的list ,string, tuple这种.事实上迭代器的概念会比可迭代对象宽泛很多,一会举几个例子就能明白. ? 在使用list这种数据类型的时候,我们经常会使用下面这种迭代方式: # eg 1 mylist = [1,2,3,4] for x in mylist: print(x) >>>1 >&

babel转码时generator的regeneratorRuntime

今天写generator函数时发现出错:regeneratorRuntime. 在stackoverflow网友说需是本地babel软件包没有安装完全. package.json: "devDependencies": { "babel-core": "^6.0.20", "babel-polyfill": "^6.0.16", "babel-preset-es2015": "

Generator

一.Generator概述 1.Generator函数是一个普通函数,但是有以下几个特征: function关键字与函数名之间有一个星号 //一般星号紧挨function关键字 函数体内部使用yield语句,定义不同的内部状态 //使用实例的next()方法可依次取得不同的状态 返回值是'遍历器对象' 返回值是本身Generator函数的一个实例 每一次调用都会产生新的'遍历器对象' 无论何种遍历方式  都只能遍历一次 //for...of||next()||...运算符  //只能被遍历一次

Struts2 分割字符串标签s:generator

Struts2 分割字符串标签s:generator  有些时候会从后台返回一个字符串,可以通过Strut2的标签s:generator进行分割.   generator标签,该标签可以将指定字符串按指定分隔符分割成多个字串.生成的多个字串可以用iterator标签进行迭代输出.可以这么理解:generator标签将一个字符串转换成一个List集合.在该标签体内,整个临时生成的集合将为Valuestack的顶端,但一旦该标签结束,生成的集合将被移除Valuestack.generator标签有如

ES6笔记(6)-- Set、Map结构和Iterator迭代器

系列文章 -- ES6笔记系列 搞ES6的人也是够无聊,把JS弄得越来越像Java.C++,连Iterator迭代器.Set集合.Map结构都出来了,不知道说什么好... 一.简单使用 1. iterator 学过C++的人应该知道这是个迭代器对象,拥有一个指针,指向数据结构中的某个成员 JS中的iterator也有类似的功能,JS内部为一些数据结构实现了iterator迭代器的接口,让我们可以方便的使用 var [a, b, ...c] = [1, 2, 3, 4]; c // [3, 4]

【转】PHP生成器 (generator)和协程的实现

原文地址:https://phphub.org/topics/1430 1.一切从 Iterator 和 Generator 开始 为便于新入门开发者理解,本文一半篇幅是讲述迭代器接口(Iterator)和 Generator 类的,对此已经理解的话,可以直接跳过. 在理解本文大多数概念前,有必要知道迭代和迭代器.事实上,迭代大家都知道是什么,可是我不知道(真的,在此之前对这个概念没有系统了解).迭代是指反复执行一个过程,每执行一次叫做一次迭代.实际上我们经常做这种事情,比如: <?php $m

Struts2 标签

使用struts2的标签需要先在jsp界面添加下面定义 <%@ taglib prefix="s" uri="/struts-tags"%> struts2的标签共分为五大类: 一.逻辑控制标签 1)条件标签:用于执行基本的条件流转 <s:if>:拥有一个test属性,其表达式的值用来决定标签里内容是否显示. <s:if test="#request.username=='hzd'">欢迎hzd</s:i

python中的迭代器

1.可以直接作用于for循环的数据类型 第一类:集合数据类型,如list.tuple.dict.set.str等: 第二类:generator,包括集合定义generator和带yield的generator(也就是generator function). 以上这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 可以使用isinstance()判断一个对象是否是Iterable对象: 1 >>> from collections import Iterable 2 &

Struts2标签小结

前边总结Struts2的时候将标签这一部分给丢了,当时因为开发的时候很少使用,这里简单总结一下.先看一下Struts2标签的分类吧.然后分类总结一下即可. 由于控制标签用的比较多,所以放在了前边.好首先看一下控制标签吧. 一,控制标签,JSTL大家应该都使用过,其实Struts2的控制标签和那个特别像的,主要是对EL表达式满足不了的进行补充使用.这里简单看一下吧: 1, if--elseif--else,用来控制选择输出的标签: <html xmlns="http://www.w3.org