1 生成器:

为什么要有生成器?

  就拿列表来说吧,假如我们要创建一个list,这个list要求格式为:[1,4,9,16,25,36……]这么一直持续下去,直到有了一万个元素的时候为止。如果我们要创建这个list,那么应该是这样的:

[i*i for i in range(1,10001)]     #列表生成式,不要忘了
#结果就不列出来了

  这样的话,这个list会占用极多的内存,如果我们能只将算法保存在list中,那么这个list所占的内存会大大减小,等我们需要用到list的值的时候,这个list会自动运行其中的算法,将第一个值输出,再次运行时,就会自动输出第二个值,以此类推…… 这个特殊的list就被我们称之为生成器(generator)。

如何创建生成器?

  创建生成器有很多方法:

 1 第一种方法:

#将list生成式中的‘[’换为‘(’
>>> (i*i for i in range(1,10001))
<generator object <genexpr> at 0x7fb0a69dc6e0>
>>> g=(i*i for i in range(1,10001))
#使用next()函数获取g的下一个值
>>> g.next()
1
>>> g.next()
4
>>> next(g)
9
#当没有元素可返回的时候,会报错
>>> g=(i for i in range(1,3))
>>> g.next()
1
>>> g.next()
2
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration #实际上,我们不推荐用next()函数,较为常用的是用for循环,实际上for循环的本质就是调用了next()函数。即:首先通过iter()将可迭代的数据转换为可迭代对象,然后调用next()
g=(i for i in range(1,11))
for i in g:
print(i)
#结果为:
1
2
3
4
5
6
7
8
9
10
#这样当没有值可供返回的时候就会退出循环并不会报错。

 2 第二种方法:

  这种方法用在函数中,比如说用函数实现杨辉三角:

            1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1……………………………………………………………1

  个人实现该函数的代码:

def yh():
l=[1]
n=[1]
while True:
yield n #这里有一个yield关键字!,yield就是定义generator的关键字,yield类似于return,
               #当函数运行到这里就会结束,但不同的是,当下次继续运行该函数时,就会从yield下方开始,也就是接续上次运行的地方继续运行。
l.append(0)
n=copy.copy(l) #注意这里为什么要用copy功能!!!!
for i in range(len(l)):
n[i]=l[i]+l[i-1]
l=n
import copy
n=0
for i in yh():
if n==10:
break
print(i)
n=n+1

  这里有一个yield关键字!,yield就是定义generator的关键字,yield类似于return,当函数运行到这里就会结束,但不同的是,当下次继续运行该函数时,就会从yield下方开始,也就是接续上次运行的地方继续运行。

  另外摘抄了一个比较短小精悍的代码:

def yh():
N = [1]
while True:
yield N
N.append(0)
N = [N[i-1] + N[i] for i in range(len(N))]
…………
…………

2  迭代器

  迭代器有什么用途?

  生成器存储了算法,而迭代器则负责一次输出一个该算法的结果。迭代器类似于生成器(事实上,并不仅仅只是生成器)与循环的结合,只不过这个循环“很懒”,一次只输出一个值。

  迭代和迭代器的区别:

  迭代:

    几乎所有的python对象都是可迭代的,像str dict list tuple generator set……等都是可迭代的。

  判断一个对象是否可迭代:

>>> from collections import Iterable
>>> isinstance([], Iterable)
True

  迭代器:

    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterable

  判断一个对象是否为迭代器对象:

>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

  生成器就是一个迭代器对象,他可以被next()函数调用。而像其他类型的对象,例如list,dict……需要使用iter()函数将其转换为迭代器对象。

>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True

本文参考了廖雪峰大神的python教程。详细请阅读:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

python基础之生成器迭代器的更多相关文章

  1. python基础(八)生成器,迭代器,装饰器,递归

    生成器 在函数中使用yield关键字就会将一个普通的函数变成一个生成器(generator),普通的函数只能使用return来退出函数,而不执行return之后的代码.而生成器可以使用调用一个next ...

  2. python高级之生成器&迭代器

    python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...

  3. 第三篇:python高级之生成器&迭代器

    python高级之生成器&迭代器   python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...

  4. 十三. Python基础(13)--生成器进阶

    十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

  5. 十二. Python基础(12)--生成器

    十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...

  6. 【笔记】Python基础四:迭代器和生成器

    一,迭代器协议和for循环工作机制 (一),迭代器协议 1,迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能往 ...

  7. python基础编程:生成器、迭代器、time模块、序列化模块、反序列化模块、日志模块

    目录: 生成器 迭代器 模块 time 序列化 反序列化 日志 一.生成器 列表生成式: a = [1,2,3,3,4,5,6,7,8,9,10] a = [i+1 for i in a ] prin ...

  8. (转)python基础学习-----生成器和迭代器

    在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了 ...

  9. python基础一 day13 迭代器

    # 双下方法# print([1].__add__([2]))# print([1]+[2]) # 迭代器# l = [1,2,3]# 索引# 循环 for# for i in l:# i## for ...

随机推荐

  1. 微信小程序——音阶练耳 宣传页面

    音阶练耳是什么? 音阶练耳小程序是一款听音练习音阶,拥有简介界面的交互式小程序,以虚拟钢琴为辅助乐器,应用于日常练习,涵盖了五个八度内26种调式.以及下行中的所有调式与和声小调式的衍生,提高辨认音阶的 ...

  2. 20135337朱荟潼Java实验报告二

    20135337朱荟潼 实验二 Java面向对象程序设计 一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L ...

  3. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  4. 第二阶段Sprint冲刺会议7

    进展:试着把视频录制功能加到时间提醒中,但是整合没有成功,今天没有进展.

  5. 《Spring1之第十次站立会议》

    <第十次站立会议> 昨天:试着把用C#写的代码转换为java语言. 今天:已基本转换为java语言了,也能够实现视频聊天这个功能了. 遇到的问题:在进行视频通话时没有考虑到声音优化功能,实 ...

  6. IO异常 的处理 test

    package com.throwsss; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFou ...

  7. 人and绩效and职业道德

    人行走在这个世界上 避免不了的是各种悲哀 人就像是一个茶几 上面放满了各种杯具 而要做的是要么把杯具打碎了咽下去,要么被杯具打晕 本布衣 躬耕于南阳 不求闻达于诸侯 每个人都可以选择自己的生活方式 或 ...

  8. Leetcode题库——7.反转整数

    @author: ZZQ @software: PyCharm @file: IntReverse.py @time: 2018/9/16 16:36 要求:整数反转(给定一个 32 位有符号整数,将 ...

  9. 31_网络编程(Socket套接字编程)_讲义

    今日内容介绍 1.网络三要素及传输协议 2.实现UDP协议的发送端和接收端 3.实现TCP协议的客户端和服务器 4.TCP上传文件案例 01网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用 ...

  10. win10频繁提示证书即将过期怎么办

    最近几天每次开机都会提示许可证即将过期 ”Windows+R”打开“运行”窗口,输入“slmgr.vbs -xpr”并点击“确定”,弹出的窗口确实显示过期时间在本月1.29过期 百度各种激活方法后,发 ...