#!/usr/bin/env python
# -*- coding:utf-8 -*- #只要函数的代码里面出现了yield关键字,这个函数就不再是一个普通的函数了,叫做生成器函数
#执行生成器函数,获取到的东西就叫做生成器
#生成器的一个好处就是无需在内存中创键所有东西,什么时候需要什么时候创建
'''
def fun():
yield 1
yield 2 r = fun()
'''
#fun是生成器函数,r是生成器,生成器具有生成一些东西的能力 ###################生成器原理#######################
'''
#定义一个生成器函数
def fun():
print(11)
yield 1 print(22)
yield 2 print(33)
yield 3 #执行生成器函数,仅仅获取了一个生成器,不会输出任何值
r = fun() #执行生成器的__next__方法,碰到yield就退出,这里的yield相当于普通函数里面的return,但是不一样,yield可以保存上一次的执行状态,而return 是直接退出的返回值是第一个yield的值
ret = r.__next__()
print(ret) #再次执行生成器的__next__方法,返回值是第二个yield的值
ret = r.__next__()
print(ret)
'''
############################################################ ########################生成器实现####################### def xrange(n):
start = 0
while True:
if start > n:
return
yield start
start += 1 obj = xrange(5) n1 = obj.__next__()
n2 = obj.__next__()
n3 = obj.__next__()
n4 = obj.__next__()
n5 = obj.__next__() print(n1,n2,n3,n4,n5)
#!/usr/bin/env python
# -*- coding:utf-8 -*- #生成器仅仅具有一种生成能力
#如和将一个函数变为生成器,在函数里面出现了yield,这个函数就不再是普通的函数了,叫生成器函数,执行这个生成器函数就会得到一个生成器
#迭代器具有访问能力,迭代器是一个一个进行迭代,只能一个一个往后找,不能往前找
#迭代器特点:
#访问者不需要关心迭代器内部的结构,仅需要通过next()方法不断去取下一个内容
#不能随机的访问集合中的某个值,只能从头到尾依次访问
#访问到一半时,不能往后退
#便于循环比较大的数据集合,节省内存 #迭代器本质上也是通过next一个一个去取,我们在用的时候直接用for循环迭代就可以了
#生成器需要自己写,而迭代器直接用for循环就可以了 def xrange(n):
start = 0
while True:
if start > n:
return
yield start
start += 1 for x in xrange(10):
print(x)

生成器与迭代器综合练习:

#! usr/bin/env python
# -*-coding = utf-8 -*- #生成器 def range(n):
start = 0
while True:
if start < n:
yield start
start += 1
else:
return
#迭代器
for i in range(10):
print(i)  

对于生成器的理解要注意,在例程中,我们使用的是一些整数,既然是生成器,那么可不可以生成别的东西,比如类似于列表或者字典这样的数据结构,可以,如:

li = [1,2,3,4,5]
for item i li:
yield{
'index':item
}

比如上面类似的写法,也是个生成器,不过生成器中的数据结构是字典形式的 

  

转载于:https://www.cnblogs.com/ronghe/p/9259014.html

Python之路【第二十八篇】:生成器与迭代器的更多相关文章

  1. Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类

    一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...

  2. Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理

    一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...

  3. Python之路(第二十四篇) 面向对象初级:多态、封装

    一.多态 多态 多态:一类事物有多种形态,同一种事物的多种形态,动物分为鸡类,猪类.狗类 例子 import abc class H2o(metaclass=abc.ABCMeta): ​ def _ ...

  4. Python之路(第二十五篇) 面向对象初级:反射、内置方法

    [TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...

  5. Python之路(第二十六篇) 面向对象进阶:内置方法

    一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...

  6. Python之路(第二十二篇) 面向对象初级:概念、类属性

    一.面向对象概念 1. "面向对象(OOP)"是什么? 简单点说,“面向对象”是一种编程范式,而编程范式是按照不同的编程特点总结出来的编程方式.俗话说,条条大路通罗马,也就说我们使 ...

  7. Python之路(第十八篇)shutil 模块、zipfile模块、configparser模块

    一.shutil 模块 1.shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中,需要打开文件 import shutil shutil.co ...

  8. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  9. Python之路【第八篇】:堡垒机实例以及数据库操作

    Python之路[第八篇]:堡垒机实例以及数据库操作   堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient ...

  10. Android UI开发第二十八篇——Fragment中使用左右滑动菜单

    Fragment实现了Android UI的分片管理,尤其在平板开发中,好处多多.这一篇将借助Android UI开发第二十六篇——Fragment间的通信. Android UI开发第二十七篇——实 ...

随机推荐

  1. RMI 使用笔记

    Java 远程方法调用,即 Java RMI( Java Remote Method Invocation ) .顾名思义,可以使客户机上运行的程序能够调用远程服务器上的对象(方法). 下面主要介绍一 ...

  2. Redis系列(五):Redis的过期键删除策略

    本篇博客是Redis系列的第5篇,主要讲解下Redis的过期键删除策略. 本系列的前4篇可以点击以下链接查看: Redis系列(一):Redis简介及环境安装 Redis系列(二):Redis的5种数 ...

  3. CF633(div.2)B. Sorted Adjacent Differences

    题目描述 http://codeforces.com/contest/1339/problem/B 有一个长度为 \(n(3\le n \le 10^5)\) 的整数序列 \(a_1,a_2,..., ...

  4. python--Django从创建一个项目说起

    创建项目 首先进入一个空目录,打开操作命令行,输入: django-admin startproject 项目名称 建立数据库连接 进入项目目录打开settings.py文件,修改以下字段 DATAB ...

  5. GlusterFS 4.1 版本选择和部署

    GlusterFS 4.1 版本选择和部署 目录 GlusterFS 4.1 版本选择和部署 1 前言相关 1.1 glusterfs优势 1.2 版本选择 1.3 volume知识 2 服务部署 2 ...

  6. Array(数组)对象-->push() 方法

    1.定义和用法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度. 语法: array.push(item1, item2, ..., itemX) 参数:item1, item2, ...

  7. matplotlib TransformedBbox 和 LockableBbox

    TransformedBbox 和 LockableBbox 都是BboxBase的子类.TransformedBbox支持使用变换来初始化bbox, LockableBbox可实现锁定bbox的边不 ...

  8. ADO.NET 事务控制

    在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务.若要执行事务,请执行下列操作: 1.调用Connection 对象的BeginTransaction 方法 ...

  9. numpy basic sheatsheet

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.NumPy 通常与 SciPy(Scien ...

  10. 【原创干货】大数据Hadoop/Spark开发环境搭建

    已经自学了好几个月的大数据了,第一个月里自己通过看书.看视频.网上查资料也把hadoop(1.x.2.x).spark单机.伪分布式.集群都部署了一遍,但经历短暂的兴奋后,还是觉得不得门而入. 只有深 ...