生成式

来源:互联网 发布:kd衣柜画图软件 编辑:程序博客网 时间:2024/04/29 03:09

1. 生成式

通过列表生成式,我们可以直接创建一个列表。格式是:[exp for val in collection if condition]

相当于

result=[]for val in collection:    if(condition):        result.append(exp)

例子:

list1 = [x*x for x in xrange(1,11) if x %2 == 0]print (type(list1))print (list1)

结果:

<type 'list'>[4, 16, 36, 64, 100]

##通过生成式创建的列表,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。


2.生成器

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。


a.创建一个生成器

第一种方法是把一个列表生成式的[]改成(),就创建了一个generator

list1 = (x*x for x in xrange(1,11) if x %2 == 0)print (type(list1))print (list1.next())print (list1.next())print (list1.next())print (list1.next())print (list1.next())
结果:

<type 'generator'>4163664100
解释:generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素为止.

b.第二种方法,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

yield的使用例子

def fun(n):    sum = 0    i = 0    while i < n:        sum += i        i += 1        print (sum)fun(10)
结果为:

0136101521283645

这个程序就是求09所有数字之和,接下来,我们只要稍微改动一下,你看看有什么差别,

def fun(n):    sum = 0    i = 0    while i < n:        sum += i        i += 1        yield(sum)for x in fun(10):    print(x)print(type(fun(10)))
结果为:

0136101521283645<type 'generator'>

结果和上面的结果是一样的,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。每当遇到yield关键字的时候,你可以理解成函数的return语句,yield后面的值,就是返回的值。但是不像一般的函数在return后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次从yield下面的部分开始执行。

解释:

1.以上函数有关键字yield,所以生成的是一个生成器。

2.通过for循环调用生成器,当执行到yield的时候,返回sum的值,sum0,此时暂停并记录sum的值

3.打印sum的值,然后继续往下执行。此时跳入下一个循环while(1<10)

4.直到遇到yield的时候,返回sum的值。

5.反复执行3,4步骤,知道循环结束,最终程序退出


生成式与生成器的区别:

一个直接返回了表达式的结果列表, 而另一个是一个对象,该对象包含了对表达式结果的计算引用, 通过循环可以直接输出

生成器不会一次性列出所有的数据,当你用到的时候,在列出来,更加节约内存的使用率。



3.迭代器
Iterable(可迭代对象和Iterator(迭代器)主要区别是 :

凡是可以用 for 循环的 都是  Iterable(可迭代对象)凡是需要通过next()函数获得值的可迭代对象都是Iterator(迭代器)。

(所以生成器可以 next()函数调用并不断返回下一个值的对象称为迭代器 ) (可以简单理解为生成器 就是 迭代器的可迭代对象)

 凡是可作用于for循环的对象都是Iterable类型;

 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

a = [1,2,3,4,5]print type(a)b = iter(a)print type(b)
结果为

<type 'list'><type 'listiterator'>




原创粉丝点击