当前位置: 首页 > 编程笔记 >

Python中xrange与yield的用法实例分析

能业
2023-03-14
本文向大家介绍Python中xrange与yield的用法实例分析,包括了Python中xrange与yield的用法实例分析的使用技巧和注意事项,需要的朋友参考一下

本文实例分析了Python中xrange与yield的用法。分享给大家供大家参考,具体如下:

range和xrange

Python提供了生成和返回整数序列的内置函数range及xrange,虽然这两个函数在功能上是差不多的,但其实现原理还是有差别的。range(n, m)返回的是一个从n到(m-1)的连续的整数列表,而xrange(n, m)返回的却是一个特殊的目的对象,即xrange对象本身.

>>> range(1, 5)
[1, 2, 3, 4]
>>> xrange(1, 5)
xrange(1, 5)
>>> type(xrange(1, 5))
<type 'xrange'>

但在python2.x中xrange返回的却不是一个迭代器,所以 x = xrange(n, m), x.next()会出错。假如需要返回一个迭代器,需要调用iter(xrange(….))

>>> x = iter(xrange(1, 5))
>>> x.next()
1
>>> x.next()
2

也就是,调用range和xrange程序在运行中占用的内存是不一样的。使用range,程序将首先生成一个list,然后再隐含调用list的iter获取元素。而使用xrange,程序在每次循环产生的是一个xrange对象,这个对象是iterable,根据返回的这个xrange对象我们可以获取元素。

生成器与yield

借助python的生成器,我们可以实现像内置xrange函数的生成器,但这个生成器返回的是一个又浮点型值组成的序列而不是整型序列。

>>> def frange(start, stop, step=1.0):
  while start < stop:
    yield start
    start += step
>>> frange(1.0, 5.0)
<generator object frange at 0x01343148>
>>> for i in frange(1.0, 5.0):
  print i,
1.0 2.0 3.0 4.0
>>> x = iter(frange(1.0, 5.0))
>>> x.next()
1.0
>>> x.next()
2.0

在python中,在函数体出现一个或者多个yield,这个函数就是生成器(generator)。在调用生成器的时,系统不会执行该生成器函数体。生成器被调用时将返回一个特殊的迭代器对象,这个个对象包含了生成器函数体、函数体的本地变量(包括函数体参数)以及当前的执行位置。

在调用返回的迭代器对象的next方法时,生成器将执行到下一个yield语句。

在执行完yield语句时,函数的执行将被“冻结”,保留执行的当前位置和未经使用的本地变量,并将yield语句的执行结果返回作为next方法的结果。继续调用next则继续调用yield,直到函数体运行结束或者执行了return语句(return语句不能含有表达式)。

最常见的,生成器可以用来构建迭代器。假如我们需要一个从1到N,然后从N到1的数字组成的序列,可以使用生成器:

>>> def updown(N):
  for x in xrange(1, N): yield x
  for x in xrange(N, 0, -1): yield x
>>> for i in updown(5):
  print i,

当一个函数需要返回一个列表的时候,使用生成器可能更灵活。生成器可以构建一个误解的迭代器,返回一个无限的结果序列。更进一步,生成器构建的迭代器执行的是懒计算:只有函数需要时才会计算结果。

所以假如需要对一个序列进行迭代功能,可以考虑迭代器。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

 类似资料:
  • 本文向大家介绍Python yield的用法实例分析,包括了Python yield的用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python yield的用法。分享给大家供大家参考,具体如下: yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。 只是粗略的知道yield可以用来为一个函数返回值塞数据,比如下面的例子: 取出

  • 本文向大家介绍python中xrange用法分析,包括了python中xrange用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python中xrange用法。分享给大家供大家参考。具体如下: 先来看如下示例: range()返回一个递增或递减的数字列表,列表的元素值由三个参数决定 start表示列表开始的值,默认为“0”。 stop 表示列表结束的值,该参数不可缺少 参数ste

  • 本文向大家介绍PHP5.5新特性之yield理解与用法实例分析,包括了PHP5.5新特性之yield理解与用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP5.5新特性之yield理解与用法。分享给大家供大家参考,具体如下: yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开

  • 本文向大家介绍Java线程让步yield用法实例分析,包括了Java线程让步yield用法实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java线程让步yield用法。分享给大家供大家参考,具体如下: 一 点睛 yield()方法是一个和sleep()方法有点类似的方法,它是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是让线程转入就

  • 本文向大家介绍C#中yield return用法分析,包括了C#中yield return用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#中yield return用法,并且对比了使用yield return与不使用yield return的情况,以便读者更好的进行理解。具体如下: yield关键字用于遍历循环中,yield return用于返回IEnumerable<T>,y

  • 本文向大家介绍window.onerror()的用法与实例分析,包括了window.onerror()的用法与实例分析的使用技巧和注意事项,需要的朋友参考一下 onerror语法使用 onerror 默认有三个入参: •msg: 错误信息 •url:错误所在文件 •line: 错误所在代码行,整型 window.onerror = function(msg, url, line){ // some