python 中xrange 和range的用法区别 以及yield的用法

原创 2015年07月08日 11:49:27

在大部分情况下range和xrange的用法是一样的。用来生成一个list 供我们使用。区别是range返回的是一个list 而xrange返回的是一个 generator.

>>> range(5)
[0, 1, 2, 3, 4]
>>> xrange(5)
xrange(5)

Generator

为了解释Generator必须先解释一个概念: 可迭代(Iterate)

当你建立了一个list 你就可以调用里面的每一个元素,这个list就称为可迭代对象。

所有可以使用 for .. in .. 语法的脚注一个迭代器: list string 等等

Generator 是可以迭代的,但是只能读取一次因为他并不是把所有的值都存在内存中而是实时的生成数据。由于generator 并不是把值存在一个很长的list或者其他迭代器里面,这样使用generator可以减少内存的消耗。

>>> for i in mygenerator:
...     print i
... 
0
1
4
>>> for i in mygenerator:
...     print i
... 
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...     print i
... 
0
1
4
>>> for i in mygenerator:
...     print i
... \
... 

Yield 为python中的一个比较高级的用法最近在一次某传统IT公司的面试中就被问到了此问题,可惜当时对这一无所知。


yield 的作用类似return 但是yield返回的是个generator.需要注意的是在如果一个function的返回使用yield,在调用此function时 在function里面的code并没有被执行,而是返回一个generator。

当我们是用for 对generator进行迭代时 从函数开始到yield之前的code都会被run到并返回第一个值,下面的循环以此类推,直到没有可返回的值迭代退出。

在使用yield返回的generator 对象时也可以使用generator 的next()方法,函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。


Yield 在openstack 的heat代码中使用比较广泛.

下面是得到一个stack中所有resource 的code,通过yield返回一个generator(heat/engine/stack.py)

 def iter_resources(self, nested_depth=0):
        '''
        Iterates over all the resources in a stack, including nested stacks up
        to `nested_depth` levels below.
        '''
        for res in six.itervalues(self):
            yield res

            get_nested = getattr(res, 'nested', None)
            if not callable(get_nested) or nested_depth == 0:
                continue

            nested_stack = get_nested()
            if nested_stack is None:
                continue

            for nested_res in nested_stack.iter_resources(nested_depth - 1):
                yield nested_res

对其的迭代过程(heat/engine/service)通过for 对其迭代:


def list_stack_resources(self, cnxt, stack_identity, nested_depth=0):
        s = self._get_stack(cnxt, stack_identity, show_deleted=True)
        stack = parser.Stack.load(cnxt, stack=s)
        depth = min(nested_depth, cfg.CONF.max_nested_stack_depth)

        return [api.format_stack_resource(resource, detail=False)
                for resource in stack.iter_resources(depth)]











[Python] xrange和range的使用区别

range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表。 eg:>>> range(10) [0, ...
  • humanking7
  • humanking7
  • 2015年05月24日 12:09
  • 11839

range,xrange,arange比较

python range介绍range多用作循环,range(0,10)返回一个listpython xrange 介绍xrange也是用作循环,只是xrang(0,10)不返回list,返回xran...
  • duankaifei
  • duankaifei
  • 2015年02月17日 17:09
  • 6133

Python range和xrange的区别和联系

Python range和xrange的区别和联系一言以蔽之 range产生的是一个列表,而xrange产生的是一个类似迭代器的。 所以对于较大的集合时候,xrange比range性能好...
  • never_cxb
  • never_cxb
  • 2015年11月21日 09:57
  • 2090

Python--xrange()和range()的区别不同

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32 Type "copyright",...
  • xiaowanggedege
  • xiaowanggedege
  • 2013年12月06日 09:41
  • 1717

Python中range和xrange的用法

文章出处:http://www.cnblogs.com/michaely/archive/2013/10/16/3372588.html range     函数说明:range([start...
  • maoersong
  • maoersong
  • 2014年03月23日 13:51
  • 3708

函数range()与xrange()的比较

range与xrange的比较range函数用法: range(stop) range(start,stop[,step]) 函数说明: 这是一个创建包含数列的列表的通用函数。它最常用于for...
  • jlqCloud
  • jlqCloud
  • 2015年07月29日 11:24
  • 1181

怎样去使用Python的xrange和range

在Python2.7里面,有两个非常简便的方法去构造列表,或者去用于构造整数循环,这两个函数就是xrange和range,你猜到没? 下面我们就来说说两者的不同之处。...
  • IT_DREAM_ER
  • IT_DREAM_ER
  • 2016年11月04日 20:12
  • 1362

Learning Python 018 Python2 和 Python3 中 range()函数的使用

使用的电脑系统:Windows 10 64位 使用的开发集成环境:PyCharm 2016.1.4 使用的Python的版本:python 2.7.10 和 python 3.5.0 range() ...
  • github_35160620
  • github_35160620
  • 2016年11月30日 13:53
  • 9586

python中range()、xrange()和np.arange()区别

1、range多用作循环,range(0,10)返回一个range对象,如想返回一个list,前面加上list转换; 2、arange是numpy模块中的函数,使用前需要先导入此模块,ara...
  • suibianshen2012
  • suibianshen2012
  • 2016年06月29日 11:23
  • 9993

Python中Range和XRange的区别

Python中Range和XRange的区别(Difference between Range and XRange in Python)最近机器出了点问题,所以一直没有写新的东西出来。之前在读Pyt...
  • oatnehc
  • oatnehc
  • 2010年03月03日 16:42
  • 9348
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 中xrange 和range的用法区别 以及yield的用法
举报原因:
原因补充:

(最多只允许输入30个字)