资讯专栏INFORMATION COLUMN

python 学习笔记-列表生成器

MyFaith / 2913人阅读

摘要:定义列表生成器有两种方式,一种是算式列表生成器我起的名字,一种通过关键词。算式列表生成器算式列表生成器雨列表生成式类似,但需要换成。我们可以用一个包含关键字的函数来定义一个列表生成器。

通过列表生成式我们可以方便的生成列表。但是在有的时候,我们需要生成的列表非常长,而我们的计算机的内存是有限的。在操作列表的时候,我们往往只是操作了列表的一部分区域的数据。

例如我们需要生成这么一个列表,列表中除了第1个和第2个数字外,其余数字都是前两个数之和。

1,2,3,5,8,13...

如果这个数组只有几千个或者几万个数字的时候,我们或许还能将它们都生成存在内存中。但是我们如果需要连续计算几千万个数字的时候,我再按上面的思路来就不大现实了。

认真思考一下上面的数列,我们在遍历的时候,其实只要知道前两个数字的数值,我们就能源源不断地计算出下一个数值是多少。

Python其实已经给我们提供了现有的工具让我们生成数列。与之前的生成式不同,生成器(Generators)在定义的时候并不是直接在内存中生成数列,而是定义一个生成数列的算法。

定义列表生成器有两种方式,一种是算式列表生成器(我起的名字),一种通过yield关键词。

算式列表生成器

算式列表生成器雨列表生成式类似,但[]需要换成()

my_gernerator = (x*x for x in range(1,101))
generator object的迭代方式
1. next()函数

我们可以调用generator object的next()函数让指针下移。例如

print my_generator.next() #输出 1
print my_generator.next() #输出 4
print my_generator.next() #输出 9

每调用一次next(),计算出一个值,并记忆迭代到何处了。当迭代到最后一个元素后再调用next(),python则会抛出StopIteration错误。我们可以捕获这个错误来处理迭代终止。
next()这种手动调用的运用较少。

2. 用for循环

我们可以利用collections.Iterable来判断generator object是否是一个Iterable对象。

from collections import Iterable
g = (x**3 for x in range(1,101))
print isinstance(g, Iterable) #输出True

因此我们可以用for迭代generator object

for item in g:
    print item
包含yield的函数定义列表生成器

在定义一个比较复杂的列表生成器的时候,上述算式型的列表生成器已经不能满足我们的需求了。我们可以用一个包含yield关键字的函数来定义一个列表生成器。
例如我们来实现一下文章开头生成一个“每个数字都是前两个数字之和”的数列。

def fibonacci(max):
    n,a,b = 0,1,2
    while n Generator迭代到该处时,即产生一个数。并暂停在此处,等待下一次迭代,又从该处开始,又直到遇到下一个yield..不断反复,直到程序结束。
        a,b = b,a+b
        n = n+1

此时,fibonacci不再是一个普通函数,而是一个generator object
我们通常用for循环来迭代generator对象。

for n in fibonacci(10):
    print n

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44300.html

相关文章

  • python学习笔记列表生成

    摘要:在实际情况中,我们常常需要生成一些列表。先对进行判断,是偶数的则留下多重循环生存全排列列表比如我们需要生成全部乘法表,那么我们就可以使用两重循环。 在实际情况中,我们常常需要生成一些列表。除了比较低效的用for循环来一个一个往列表中append外,还有什么比较好的方法呢?python给我们提供了非常强大的创建列表的方式。 例如我们需要创建1~100的一个数据列表。 range(1,...

    starsfun 评论0 收藏0
  • python学习笔记 序列

    内置序列 容器序列 list, tuple, collections.deque等这些序列能存放不同类型的数据 扁平序列 str, byte, bytearray, memoryview, array.array, 这些序列只能容纳一种类型数据 以上,容器序列存放的是他们所含任意类型对象的引用,而扁平序列存放的是值而不是引用 列表(list)是最基础也是最重要的序列类型 列表推导 >>> symb...

    godiscoder 评论0 收藏0
  • Python 3 学习笔记之——基础语法

    摘要:迭代器和生成器字符串,列表或元组对象都可用于创建迭代器。创建自己的迭代器,需要在类中实现实现两个方法与。方法返回一个特殊的迭代器对象,这个迭代器对象实现了方法并通过异常标识迭代的完成。要反向遍历一个序列,首先指定这个序列,然后调用函数。 1. a, b = a, a + b 先计算右边表达式,然后再同时赋值给左边。 2. 条件控制和循环语句 条件控制 if condition_1: ...

    scola666 评论0 收藏0
  • Python学习笔记

    摘要:数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象。从开始,依次增加的值,直至等于或者大于将会输出。该函数输入姓名和各科的成绩,输出姓名和总共成绩。表明该参数是关键字参数,通常来讲关键字参数是放在函数参数列表的最后。 基础 局部变量与全局变量 函数中使用的变量是局部的 如果在外面的变量在函数中使用,需要加global关键字 APPLY = 100 # 全局变量 a ...

    anquan 评论0 收藏0

发表评论

0条评论

MyFaith

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<