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)]











相关文章推荐

【Python2】range与xrange用法对比

本文对python2中range和xrange的用法对比进行了总结整理,可供需要的朋友参考

Python中Range和XRange的区别

转载:http://www.52harry.com/program/python/2011-11-08/496.html Python中Range和XRange的区别(Difference betw...

Python基础语法笔记--xrange()与range()的区别、map、filter、reduce分析、lambda表达式

xrange与range的区别     在for循环中使用xrange与range函数,利用help函数,查的他们的用法如下: range: range(...) range(stop) ->...

Python range() 与xrange()的区别

range(...) range(stop) -> list of integers range(start, stop[, step]) -> list of integers ...

python迭代器、生成器、yield和xrange

1,迭代器: 支持next和__iter__方法的类, 其中next需要抛出StopIteration异常或返回迭代值, __iter__需要返回迭代器自己, 也可以实现send函数,但要保证send...

python 基础2 编码转换 pycharm 配置 运算符 基本数据类型int str list tupple dict for循环 enumerate序列方法 range和xrange

一 大纲 2 运算符 3 基本数据类型   整型:int   字符串:str   列表:list   元组:tuple   字典:dic 4 for e...

python循环for,range,xrange;while

>>> range(1,5) #代表从1到5(不包含5) [1, 2, 3, 4] >>> range(1,5,2) #代表从1到5,间隔2(不包含5) [1, 3] >>> range(5) #代表...

十二、Python的yield用法与原理

翻了一篇workflow上关于yield的用法,翻的有点烂,在这里贻笑大方了,慢慢来,总是期待着一点一点的进步。 为了理解yield的机制,我们需要理解什么是生成器。在此之前先介绍迭代器iter...

怎样去使用Python的xrange和range

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

python中xrange和range的异同

range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列。 range示例: 1.>>...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 中xrange 和range的用法区别 以及yield的用法
举报原因:
原因补充:

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