python生成式,生成器,迭代器

列表生成式算法

生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]能够用list(range(1, 11))。须要生成[1x1, 2x2, 3x3, ..., 10x10]app

循环:函数

for x in range(1, 11):对象

    L.append(x * x)接口

print(L)generator

可是循环太繁琐。for循环

而列表生成式则能够用一行语句代替循环生成上面的list:编译

[x * x for x in range(1, 11)]变量

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就能够把list建立出来。循环

for循环后面还能够加上if判断,这样咱们就能够筛选出仅偶数的平方:

[x * x for x in range(1, 11) if x % 2 == 0]

还能够使用两层循环,能够生成全排列:

[m + n for m in 'ABC' for n in 'XYZ']

 

生成器(generator)

生成器和生成式最大的区别就是将[]替换为()

输出可迭代对象generator须要使用next方法

例子1

a = (x*x for x in xrange(10) if x*x%2 == 0)

print(type(a))

print(a.next())

print(a.next())

for i in a:

print(i)

#generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素为止

例子2

def fib(n):

    sum = 0

    i = 0

    while(i<n):

        sum = sum +i

        i+=1

        yield sum

for x in fib(10):

print(x)

print(type(fib(10)))

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

 

迭代器

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

凡是能够用 for 循环的 都是  Iterable(可迭代对象)   凡是须要经过next()函数得到值的可迭代对象都是 Iterator(迭代器)。 

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

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

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

相关文章
相关标签/搜索