#!/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. 【原创】Linux RCU原理剖析(一)-初窥门径

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  2. Zabbix监控平台

                                                                     Zabbix监控平台 案例1:常用系统监控命令 案例2:部署Zabbi ...

  3. mybatis源码分析--如何加载配置及初始化

    简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...

  4. java day04记录

    本文主要记录arr数组用法.count计算.arr倒排序技巧案例 package day4homework; import java.util.Scanner; /* 从键盘上输入10个整数,合法值位 ...

  5. @suppressWarnings("unchecked") java 中是什么意思 (一般放dao查询方法上)

    J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默. 一点背景:J2SE 5.0 为 Java 语言增加 ...

  6. 小程序—银行、券商们下一代APP的进阶方向

    传统金融机构们的App——尤其以手机银行.手机证券为最,发展到今天,已经产生一系列的问题:从用户角度看,体验普遍不好.高度同质化:从业务运营角度看,几乎没有什么“运营”的抓手:从IT角度看,投入产出比 ...

  7. B2. Character Swap (Hard Version)

    链接: http://codeforces.com/contest/1243/problem/B2 题目大意: 两个字符串,判断能否通过交换为从而使得这两个字符串完全一致,如不可以的话,直接输出NO, ...

  8. niuke---勾股定理

    勾股定理------: 当其中一个数a大于1并且为奇数时即a=2*n+1, 那么另外两个数分别为 b=2*n*n+2*n;   c=b+1; 当a为大于等于4的偶数时,即a=2*n时,那么另外两个数分 ...

  9. codeforces Equalizing by Division (easy version)

    output standard output The only difference between easy and hard versions is the number of elements ...

  10. Chrome 浏览器安装 ChroPath 插件

    1.下载地址 http://www.cnplugins.com/devtool/chropath/download.html 2.安装方法 a.把下载的文件更改后缀名变为压缩包,然后解压到本地:如下图 ...