4EWQE 发表于 2017-11-7 10:39:00

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

列表生成式
生成list 可以用list(range(1, 11))。需要生成
循环:
for x in range(1, 11):
    L.append(x * x)
print(L)
但是循环太繁琐。
而列表生成式则可以用一行语句代替循环生成上面的list:

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来。
for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

还可以使用两层循环,可以生成全排列:


生成器(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类型,它们表示一个惰性计算的序列;


页: [1]
查看完整版本: python生成式、生成器和迭代器