python-生成式、生成器、迭代器

来源:互联网 发布:js empty 编辑:程序博客网 时间:2024/06/05 04:55

1.列表生成式

通过一句简介的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理:

格式:

[exp for val incollection if condition]

相当于

result=[]

for val in collection:

if(condition):

result.append(exp)

在Python中,这种一边循环一边计算的机制,称为生成器(Generator)

生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成器【Generator】,简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。

要创建一个generator,下面给出2种方式的生成器:

1. 最简单的方法: 把原来生成式的[ ]换成()就可以 了

比如:

lt=(x*x for x in xrange(1,10) if x%2==0)print(lt)print(type(lt))print(lt.next())//generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素为止print(lt.next())print(lt.next())print(lt.next())
结果:

<generator object <genexpr> at 0x00000000024B2318><type 'generator'>4163664
也可以通过循环访问:

lt=(x*x for x in xrange(1,10) if x%2==0)print(lt)print(type(lt))for i in lt:    print i
结果:

<generator object <genexpr> at 0x00000000024B2318><type 'generator'>4163664

2.如果一个函数定义中包含yield 关键字,那么这个函数就不在是一个普通函数,而是一个generator.

def fib(n):    sum = 0    i = 0    while(i<n):        sum = sum +i        i+=1        print(sum)fib(10)

结果:

0136101521283645
将 print (sum )改为: yield(sum )

def fib(n):    sum = 0    i = 0    while(i<n):        sum = sum +i        i+=1        yield(sum)fib(10)print(type(fib(10)))

结果:

<type 'generator'>
需要使用循环来获取每个值

for x in fib(10):    print x
结果:

<type 'generator'>0136101521283645

解释:

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

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

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

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

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

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

return 与yield 二者之间的区别:

return: 一般在return ,直接退出

yield : 生成器函数在生成值后自动挂起并暂停他们的执行状态,他本地变量将保持状态信息,这些信息在函数恢复时将再度有效,下次从yield 下面的部分开始执行。



3. 迭代器:

迭代对象: 凡是可以用 for 循环的 都是  Iterable(可迭代对象)

迭代器:凡是需要通过next()函数获得值的可迭代对象都是 Iterator(迭代器)

生成式:一次性列出所有数据,

生成器: 返回一个可迭代对象,及generator 对象,必须通过循环才能取出所有的结果

可迭代对象: 可以通过循环调用出来的,即为可迭代的对象 [] /() /{} 生成式、生成器

迭代器:   就是生成器,必须通过next() 函数调用,并不断返回下一个值的对象,成为迭代器。






阅读全文
0 0
原创粉丝点击