Python学习之迭代器与生成器

迭代

给定一个对象,可以通过for...in循环来遍历,称这种遍历方式为迭代。

实列:不同对象的迭代:

from collections.abc import Iterable
print("----------迭代list----------")
iter_list_demo = ['语文', '数学', '英语', '政治']
for key in iter_list_demo:
    print(key)
print("----------迭代tuple----------")
iter_tuple_demo = ('华为', '小米', '一加', 'vivo')
for key in iter_tuple_demo:
    print(key)

print("----------迭代dict----------")
iter_dict_demo = {'小红': 99, '小花': 98, '小明': 97, '小白': 100}
for val in iter_dict_demo.values():  # 迭代的是value
    print(val)  # 只输出value值

for key, value in iter_dict_demo.items():  # 迭代的是key和value
    print(key, ":", value)

print("------------迭代str--------")
iter_str_demo = "ABCDE12345"
for key in iter_str_demo:
    print(key)

判断元素是否可以迭代,使用collections模块的Iterable

from collections.abc import Iterable
a = 'abcdef'
b = [1, 2, 3, 4, 5, 6]
c = 123
print(isinstance(a, Iterable))  # true
print(isinstance(b, Iterable))  # true
print(isinstance(c, Iterable))  # false 整数不可以迭代

迭代器

迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本方法: iter()和next()

  • 用for循环遍历迭代器对象
list_demo = [1, 2, 3, 4, 5]
print('是否可迭代:%s' % isinstance(list_demo, Iterable))
it = iter(list_demo)    # 创建迭代器对象
# 迭代器对象可以使用常规for进行遍历
for x in it:
    print(x, end=" ")   # 为end传递一个空字符串,这样print函数不会在字符串末尾添加一个换行符,而是添加一个空字符串

  • 用next()函数遍历迭代器对象
list_demo = [1, 2, 3, 4, 5]
it = iter(list_demo)    # 创建迭代器对象
# 用next()函数进行遍历  for循环就是不断的调用next函数
while True:
    try:
        print(next(it), end=" ")
    except StopIteration:
        break

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

生成器

使用了 yield 的函数被称为生成器(generator),生成器是一个返回迭代器的函数,只能用于迭代操作,生成器就是一个迭代器。

调用一个生成器函数,返回的是一个迭代器对象。

  • 创建一个生成器,一种方法是把一个列表生成式的[]改成(),就创建了一个generator:
L = [x * x for x in range(11)]
g = (x * x for x in range(11))
print("L:", type(L))
print("g:", type(g))

使用for循环来遍历生成器对象

g = (x * x for x in range(11))
for n in g:
    print(n, end=" ")
  • 定义生成器的另一种方法,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

变成generator的函数,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

实例:使用生成器计算斐波拉契数列

def fib_test3(num):
    a, b = 0, 1
    while num > 0:
        a, b = b, a+b  # t = (b, a + b)  t是一个tuple a = t[0] b = t[1]
        num -= 1
        yield a

for i in fib_test3(20):
    print(i, end=" ")

print("\n")
def fib_test4(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done' for x in fib_test4(15): print(x, end=" ")

 

posted @ 2021-06-25 15:36  rissa  阅读(42)  评论(0)    收藏  举报

记录学习笔记,会有很多是参考重复,如有侵权,联系删除