python3:迭代器和生成器

迭代器

  • 可迭代(Iterable):直接作用于for循环的变量
  • 迭代器(Iterator):不但可以作用于for循环,还可以被next调用
  • list是典型的可迭代对象,但不是迭代器
  • 通过isinstance判断是否为迭代器或者是否可迭代。
  • iterable和iterator可以转换
    • 通过iter函数
# 可迭代
l = [ i for i in range(10)]

# l是可迭代的,但不是迭代器
for idx in l:
    print(idx)

# range是个迭代器
for i in range(5):
    print(i)
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
# isinstance案例
# 判断某个变量是否是一个实例
# 判断是否可迭代
from collections import Iterable
ll = [1,2,3,4,5]

print(isinstance(ll, Iterable))

from collections import Iterator
print(isinstance(ll, Iterator))
True
False
# iter函数

s = 'i love wangxiaojing'

print(isinstance(s, Iterable))
print(isinstance(s, Iterator))

s_iter = iter(s)
print(isinstance(s_iter, Iterable))
print(isinstance(s_iter, Iterator))
True
False
True
True

生成器

  • generator: 一边循环一边计算下一个元素的机制/算法
  • 需要满足三个条件:
    • 每次调用都生产出for循环需要的下一个元素或者
    • 如果达到最后一个后,爆出StopIteration异常
    • 可以被next函数调用
  • 如何生成一个生成器
    • 直接使用
    • 如果函数中包含yield,则这个函数就叫生成器
    • next调用函数,遇到yield返回
# 直接使用生成器

L = [x*x for x in range(5)] # 放在中括号中是列表生成器
g = (x*x for x in range(5))#  放在小括号中就是生成器

print(type(L))
print(type(g))
<class 'list'>
<class 'generator'>
# 函数案例
def odd():
    print("Step 1")
    print("Step 2")
    print("Step 3")
    return None

odd()
Step 1
Step 2
Step 3
# 生成器的案例
# 在函数odd中,yield负责返回
def odd():
    print("Step 1")
    yield 1
    print("Step 2")
    yield 2
    print("Step 3")
    yield 3

# odd() 是调用生成器
g = odd()
one = next(g)
print(one)

two = next(g)
print(two)

three = next(g)
print(three)
Step 1
1
Step 2
2
Step 3
3

上述代码执行过程如下图所示:
这里写图片描述
斐波那契数列示例:

# for循环调用生成器
def fib(max):
    n, a, b = 0, 0, 1 # 注意写法
    while n < max:
        print(b)
        a,b = b, a+b # 注意写法
        n += 1

    return 'Done'

fib(5)
1
1
2
3
5

'Done'
# 斐波那契额数列的生成器写法
def fib(max):
    n, a, b = 0, 0, 1 # 注意写法
    while n < max:
        yield b
        a,b = b, a+b # 注意写法
        n += 1

    #需要注意,爆出异常是的返回值是return的返回值
    return 'Done'

g = fib(5)

for i in range(6):
    rst = next(g)
    print(rst)
1
1
2
3
5

---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-19-51ae2dbd94ff> in <module>()
     12 
     13 for i in range(6):
---> 14     rst = next(g)
     15     print(rst)


StopIteration: Done
ge = fib(10)
'''
生成器的典型用法是在for中使用
比较常用的典型生成器就是range
'''
for i in ge: #在for循环中使用生成器
    print(i)

1
1
2
3
5
8
13
21
34
55

关于迭代器和生成器也是较为常用的,需要掌握和区分好程序运行时的流程。

猜你喜欢

转载自blog.csdn.net/sunshine_lyn/article/details/81282772