04. python 生成器&迭代器

生成器&迭代器

1. 常用函数

1.1 enumerate函数

a = [1, 2, 3, 4]
for index, item in enumerate(a):   # idex是下标
    print(index, item)
    a[index] += 1
print(a)

1.2 map+lambda函数

a = [1, 2, 3, 4]
a = map(lambda x:x+1, a)
for i in a:
    print(i)

1.3 列表生成式

a = [1, 2, 3, 4]
a = [i+1 for i in a]
print(a)

2. 生成器

2.1 迭代器与生成器的区别

注意列表生成式是[], 生成器是()

# 生成器(一边生成,一边计算)
# generator
L = [x*x for x in range(10)]              # 列表生成式
print(L)

# 这就是一个生成器
g = (x*x for x in range(10))              # <generator object <genexpr> at 0x000001D14DECDD48>
print(g)
#
# 访问生成器
for i in g:                                # 一直next(g),会一个一个出答案,直到没有结果抛出异常(stoplteration),自动跳出循环
    print(i)

2.2 斐波那契数列

# Fibonacci  斐波那契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        print(b)
        a, b = b, a+b
        n += 1
    return "done"
fib(8)

2.3 迭代器编写斐波那契

注意:可以执行函数时去执行其他的代码

# generator
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        # print(b)
        yield b              # 遇到yield就会终中断,再次调用next()时,继续执行上次的代码
        a, b = b, a+b
        n += 1
    return "done"
g = fib(10)
# print(g)                      # <generator object fib at 0x000001C43CDE74C8>
# 执行流程:每次调用next()的时候执行,遇到yield语句返回,再次被next()调用next()调用时从上次返回yield语句处继续执行
print(g.__next__())
print(g.__next__())
print("执行其它的")
print(g.__next__())
print(g.__next__())
'''
out : 
# 1
# 1
# 执行其它的
# 2
# 3
'''

2.4 获取生成器返回值

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        # print(b)
        yield b              # 遇到yield就会终中断,再次调用next()时,继续执行上次的代码
        a, b = b, a+b
        n += 1
    return "done"

# for n in fib(6):
    # print(n)                     # 发现没有return值
# 如果想拿到返回值,就要捕获错误

g = fib(6)
while True:
    try:
        x = next(g)
        print(x)
    except StopIteration as e:
        print(e.value)
        break

3. 迭代器

3.1 迭代器介绍

"""
可以作用于for循环的:
1. list, tuple, dict, set, str
2. generator, generator function
这些都叫    可迭代对象:iterable
"""

# 所有可以被next()函数调用并且不断返回下一个值的对象叫 迭代器:Iterator

3.2 迭代器代码

注意: iter()创建迭代器, next()输出迭代器的下一个元素

3.2.1

import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

3.2.2

注意:魔法方法 iter() 返回自身,next() 决定迭代的规则

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self

  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
  print(x)

3.2.3

class Fibs:
    def __init__(self, n=10):
        self.a = 0
        self.b = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > self.n:
            raise StopIteration
        return self.a

fibs = Fibs()
for each in fibs:
    print(each)
#第一次a = 0 b = 1
#当运行到next时先执行b的值给a,故a = 1 此时b = a+b =1
#第二次因赋值语句在前,a得到的是第一次运行时候a+b的值,所以a = 1
posted @ 2021-07-07 15:44  超暖  阅读(44)  评论(0)    收藏  举报