Python 基础(十六):迭代器与生成器

Python 基础(十六):迭代器与生成器,第1张

概述1迭代器迭代我们知道Python中有一些对象可以通过for来循环遍历,比如:列表、元组、字符等,以字符串为例,如下所示: foriin'Hello':print(i)执行结果: Hello这个遍历过程就是迭代。可迭代对象可迭代对象需具有__iter__()方法,它们均可使用for循环遍历,我们可以使 1 迭代器迭代

我们知道 Python 中有一些对象可以通过 for 来循环遍历,比如:列表、元组、字符等,以字符串为例,如下所示:

 
for i in 'Hello':    print(i)

执行结果:

 
Hello

这个遍历过程就是迭代。

可迭代对象

可迭代对象需具有 __iter__() 方法,它们均可使用 for 循环遍历,我们可以使用 isinstance() 方法来判断一个对象是否为可迭代对象,看下示例:

 
from collections import Iterable
print(isinstance('abc', Iterable))print(isinstance({1, 2, 3}, Iterable))print(isinstance(1024, Iterable))

执行结果:

 
TrueTrueFalse
迭代器

迭代器需要具有 __iter__() 和 __next__() 两个方法,这两个方法共同组成了迭代器协议,通俗来讲迭代器就是一个可以记住遍历位置的对象,迭代器一定是可迭代的,反之不成立。

__iter__():返回迭代器对象本身__next__():返回下一项数据

迭代器对象本质是一个数据流,它通过不断调用 __next__() 方法或被内置的 next() 方法调用返回下一项数据,当没有下一项数据时抛出 stopiteration 异常迭代结束。上面我们说的 for 循环语句的实现便是利用了迭代器。

我们试着自己来实现一个迭代器,如下所示:

 
class MyIterator:    def __init__(self):        self.s = '程序之间'        self.i = 0
def __iter__(self): return self
def __next__(self): if self.i < 4: n = self.s[self.i] self.i += 1 return n else: raise stopiteration
mi = iter(MyIterator())for i in mi: print(i)

输出结果:

 
程序之间
2 生成器

生成器是用来创建迭代器的工具,其写法与标准函数类似,不同之处在于返回时使用 yIEld 语句,关于 yIEld ,我们在Python 爬虫(六):Scrapy 爬取景区信息中已经作了一些介绍,我们再来熟悉一下:

yIEld 是一个关键字,作用和 return 差不多,差别在于 yIEld 返回的是一个生成器(在 Python 中,一边循环一边计算的机制,称为生成器),它的作用是:有利于减小服务器资源,在列表中所有数据存入内存,而生成器相当于一种方法而不是具体的信息,用多少取多少,占用内存小。

生成器的创建方式有很多种,比如:使用 yIEld 语句、生成器表达式(可以简单的理解为是将列表的 [] 换成了 (),特点是更加简洁,但不够灵活)。看下示例:

示例 1 
def reverse(data):    for i in range(len(data)-1, -1, -1):        yIEld data[i]for char in reverse('Hello'):    print(char)

执行结果:

 
olleH
示例 2 
# 列表lis = [x*x for x in range(5)]print(lis)
# 生成器gen = (x*x for x in range(5))for g in gen: print(g)

执行结果:

 
[0, 1, 4, 9, 16]014916

总结

以上是内存溢出为你收集整理的Python 基础(十六):迭代器与生成器全部内容,希望文章能够帮你解决Python 基础(十六):迭代器与生成器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1158897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存