一.生成式和生成器
  列表生成式是python受欢迎的语法之一,通过一句简洁的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理。
 
#/usr/bin/python
#coding=utf-8
#@Time   :2017/11/2 21:05
#@Auther :liuzhenchuan
#@File   :列表生成式和生成器.py
 
#求1-100里所有偶数的平方
#列表生成式法
print [x*x for x in xrange(1,101) if x%2==0]
 
#定义函数 for遍历方法
def fun():
    a = []
    for i in xrange(1,101):
        if i%2==0:
            a.append(i*i)
    return a
print fun()
 
>>> [4, 16, 36, 64, 100, 144.....10000]
>>> [4, 16, 36, 64, 100, 144.....10000]
 
 
 
2.通过列表生成式,我们可以直接创建一个列表。但是,收到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的内存空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在python中,这种一遍循环一边计算的机制,称为生成器(generator)。
   要创建一个generator,有很多方法。第一种方法是把一个列表生成式的[]改成(),就创建了一个generator。
 
示例:
##列表生成器
#1.要创建一个列表生成器,最简单的办法就是把[] 换成()
lt =(x*x for x in xrange(1,101) if x%2==0)
print lt
print type(lt)
 
##通过next()方法,查看列表生成器,当next()最后一个时,next就会报错
print lt.next()
print lt.next()
print lt.next()
 
>>> <generator object <genexpr> at 0x0372F508>
<type 'generator'>
4
16
36
 
#通过循环方法读取列表生成器的值
lt1 = [51,2,3,5,10,18,60]
for x in lt1:
        print lt1
>>> [51, 2, 3, 5, 10, 18, 60]
    [51, 2, 3, 5, 10, 18, 60]
 
#generator保存的是算法,每次调用next(),就统计算出下一个元素的值。知道计算机到最后一个元素为止。
 
#2 定义generator的另一种方法,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
  #yield 的使用
  ##求10以内数的和
def fib(n):
    i =
    while i < n:
        sum += i
        i +=
        print sum
    print '和为:%d' % sum
fib(10)
 
print '########当我把第一个sum前加yield时'
 
def fib(n):
    i =
    while i < n:
        sum += i
        i +=
        yield(sum)
    print '和为:%d' % sum
fib(10)
print type(fib(10))
for i in fib(10):
    print i
 
>>>
0
1
3
6
10
15
21
28
36
45
和为:45
########当我把sum前加yield时,print fib 类型就是成了生成器了
<type 'generator'>
0
1
3
6
10
15
21
28
36
45
和为:45
 
   两次程序的结果和都一样,但是有什么不同呢,简而言之,包含yield语句的函数会被特地编程成生成器,当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口,每当遇到yield关键字的时候,你可以理解成函数的return语句,yield后面的值,就是返回的值。但是不像一般的函数在return后退出,生成器函数在生成值后悔自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次从yield下面的部分开始执行。
    解释:1 . 以上函数有关键字yield,所以生成的是一个生成器。
                2. 通过for循环调用生成器,当执行到yield的时候,返回sum的值,sum为0,此时暂停并记录sum的值
                3. 打印sum的值,然后继续往下执行,此时跳入一个循环while[1<10]
                4. 直到遇到yield 的时候,返回sum值。
                 5. 反复执行3,4步骤,知道循环结束,最终程序退出。
 
  二者的区别很明显:
       一个直接返回了表达式的结果列表,而另一个是一个对象,该对象包含了对表达式结果的计算引用,通过循环可以直接输出
        生成器不会一次性列出所有的数据,当你用到的时候,在列出来,更加节约内存的使用。
 
 

二.迭代器
iterable(可迭代对象) 和 iterator(迭代器) 主要区别是:
1. 凡是可以用for循环的都是iterable(可迭代对象)  ,凡是需要通过next() 函数获得值得可迭代对象都是iterator(迭代器)
  2. 所以生成器可以被next() 函数调用并不断返回下一个值得对象称为迭代器
  3. 可以简单的理解为生成器就是迭代器的可迭代对象
 
凡是可作用于for 循环的对像都是iterable 类型
 
凡是可作用于next()函数的对象都是iterator 类型,他们表示一个惰性计算的序列。
 
 
#生成式:一次生成所有的数据,然后保存在内存当中,适合小量的数据
#生成器:返回一个可迭代的对象,及'generator'对象,必须通过循环才可以一一 取出所有的结果
#可迭代对象:可以通过循环调用出来的,就是可迭代对象。 可迭代对象包括: []  () {}  生成式  生成器
# 迭代器: 可以简单理解为生成器 。必须通过next() 函数调用并不断返回下一个值得对象就是迭代器。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

  1. Python学习之路7 - 生成器&迭代器

    本章内容: 列表生成式 生成器 yield 迭代器 列表生成式 当我们要定义一个列表的时候,我们通常用这种方式a = [1,2,3],但是如果我们定义了一个比较长的列表的时候,手动定义列表就会比较麻烦 ...

  2. Python之旅Day5 列表生成式 生成器 迭代器 装饰器

    装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...

  3. python基础-装饰器,生成器和迭代器

    学习内容 1.装饰器 2.生成器 3.迭代器 4.软件目录结构规范 一:装饰器(decorator) 1.装饰器定义:本质就是函数,用来装饰其他函数,即为其他函数添加附加功能. 2.装饰器原则:1)不 ...

  4. python基础:列表生成式和生成器

    列表生成式(List Comprehension) 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成 list ...

  5. Python基础(8)_迭代器、生成器、列表解析

    一.迭代器 1.什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 l=[,,,] count= while count < len(l): print(l[count]) count ...

  6. Python基础_可迭代的/迭代器/生成器

    介绍 可迭代的:内部实现了__iter__方法 迭代器:内部实现了__iter__,__next__方法 生成器:yield,yield from 使用 __iter__() __next__() _ ...

  7. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  8. 列表生成式 生成器 迭代器 yield

    列表生成式 格式:通过一个或者若干个在List里边的for构建List而非List外部的for循环 举个例子:计算从1到10整数的平方构成一个List L=[ x*x for x in range(1 ...

  9. python基础--异常,对象和迭代器

    异常处理 面向对象 迭代器和生成器 python异常处理 下面代码触发了一个FileNotFoundError >>> open("notexist.txt") ...

随机推荐

  1. C# .NET4.0 改为 到.NET2.0 时 TypedTableBase 报错解决方法

    .NET 4.0 降版本 到.NET 2.0.不出意外,问题必然来了. 编译错误一: 错误 1 命名空间“System”中不存在类型或命名空间名称“Linq”(是缺少程序集引用吗?)解决: 删掉该引用 ...

  2. mysql查询练习题

    建库建表 a.建立一个公司数据库(gongsi)    CREATE DATABASE gongsi b.建立一张部门表(部门编号b_id,部门名称b_name) ,             其中b_ ...

  3. 2017广东工业大学程序设计竞赛决赛 F(LCA + 斐波那契数列性质)

    不能组成三角形的极端数列:1,1,2,3,5,8,13,21,……到第50项时候肯定到1e9了…… 如果两个点之间距离大于50,则直接Yes…… 否则的话直接暴力取出所有边,然后升序排序,判断一下就可 ...

  4. Network | 802.1x

    IEEE 802.1X是IEEE制定关于用户接入网络的认证标准(注意:此处X是大写),全称是“基于端口的网络接入控制”,属于IEEE 802.1网络协议组的一部分.于2001年标准化,之后为了配合无线 ...

  5. luogu P1854 花店橱窗布置

    题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...

  6. Xocde 自动注释插件

    github 地址 https://github.com/onevcat/VVDocumenter-Xcode   可以对xcode方法进行类似java那样的自动注释 源码下载下后编译运行一次  xo ...

  7. 在C#中使用C++编写的类——用托管C++进行封装[转]

    现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况 下,有很多开发人员就面临了如何在C#中使用C++开发好的 ...

  8. Redis性能调优建议

    一. Redis部署结构优化建议 1. Master不做AOF或RDB持久化,Slave做AOF持久化,建议同时做RDB持久化 2. 所有Master全部增加Slave 3. Master挂载Slav ...

  9. js 选项卡封装

    function tab(input,div){ for(var i = 0; i < input.length; i++){ input[i].index = i; input[i].oncl ...

  10. JAVA_Error initializing endpoint怎么办

    1 运行CMD,输入命令netstat –ano,找到这个TCP,后缀为8080的PID(我的是2660),然后打开任务管理器,在进程选项卡中打开PID查看   2 在右侧的进程窗口找到PID是左侧的 ...