首页 > 编程语言 > 详细

Python学习之迭代器与生成器

时间:2021-06-25 16:53:16      阅读:19      评论:0      收藏:0      [点我收藏+]

迭代

给定一个对象,可以通过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=" ")

技术分享图片

 

Python学习之迭代器与生成器

原文:https://www.cnblogs.com/rissa/p/14892813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!