您的位置:首页 > 编程语言 > Python开发

Python生成器与迭代器

2017-12-04 21:31 218 查看

1、生成器

生成器只有在用的时候会出现在内存中,对比列表全部存在内存中,减少了内存占用

next()函数 依次取生成器的值

s = (x*2 for x in range(1000))      # 中括号是列表解析,小括号表示生成一系列值,就是生成器
# s:   <generator object <genexpr> at 0x7fa20aa8b048>

print(next(s))      # 用next()函数取生成的值
print(next(s))      # 取出这个值后会记录这个位置,下次从后面依次取值

# 生成器就是一个可迭代的对象


yield方法 创建生成器对象

def foo():
# print('ok1')           # 不使用next方法,函数内部不会执行
yield 1     #  使用next方法后,才会执行yield前面的代码并返回值,函数停在该位置
# print('ok2')
yield 2       #

for i in foo():         # for循环就是封装的迭代器取值方法
print(i)

p = foo()
next(p)         # 取生成的值
print(next(p))


def fibo(m):
a,b,c=0,0,1
while a<m:
yield b         # 把计算出来的菲博列次数存到生成器对象中
b,c=c,c+b
a+=1
f = fibo(8)

for i in f:         # 依次迭代取出来
print(i)


send()函数 给yield前边的变量赋值

def foo():
print('ok1')
kk = yield 1        # 程序走到这里会返回该迭代器对象,并不会直接赋值
print(kk)
yield 2

n = foo()
n.send(None)        # 首先传一个空值进去,让函数记住迭代器对象的位置
# next(n)          # 也可以让next()函数走到第一个迭代器对象的位置,效果同上
n.send('eee')       # 然后在这里传一个值给记住的代器对象位置前面的变量


2、迭代器

# list, tuple, dict, string : Iterable(可迭代对象)
l = [1,2,3,4,5]
d = iter(l)         # iter()函数生成一个迭代器
print(d)        # <list_iterator object at 0x7fe7572b28d0>

print(l.__iter__())     # 效果同上

# 满足两个条件: 1.有iter方法 2.有next方法       就是一个迭代器

from collections import Iterable,Iterator

print(isinstance(d, Iterator))      # 判断是否为迭代器  True
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: