很多童鞋不明白什么是python迭代器和生成器。他们之间是什么关系?
本文旨在让您以最简单的方式理解Python迭代器和生成器!
1、迭代器和迭代过程
维基百科解释:在Python中,迭代器是遵循迭代协议的对象。使用迭代器()获取迭代器(如列表、元组、字典、集合等。)从任何序列对象。另一种形式的输入迭代器是生成器。
许多容器(如列表和字符串)可以通过for循环迭代对象。for语句调用容器对象中的迭代器()函数,该函数返回一个定义了__next__()方法的迭代器对象,该方法将逐个访问容器中的元素。
因此,在python中,只要定义了__next__方法,任何对象都是迭代器。因此,列表、元组、字典、集合和字符串等python容器都可以称为迭代器。
在谈到迭代器之后,迭代更容易理解。迭代是从迭代器中获取元素的过程。
例如,我们使用For循环从列表[1,2,3]中获取元素。这个遍历过程称为迭代。
# List是一个迭代器。
对于[1,2,3]:中元素
打印(元素)
# tuple是迭代器
对于(1,2,3):中的元素
打印(元素)
#字典是迭代器。
键入{ '一' :1,'二' :2}:
打印(键)
# String是迭代器。
对于‘123’:中的充电
打印(字符)
#打开的文本也是一个迭代器。
对于open('myfile.txt ')中的行:
Print(行,end=' ')如果不想用for循环进行迭代,该怎么办?此时,您可以:
首先调用容器的iter()函数(以字符串为例),然后使用next()内置函数调用__next__()方法。当元素耗尽时,__next__()将抛出一个StopIteration异常。
s='abc '
it=iter
它
0x00A1DB50处的迭代器对象
下一个
a
下一个
' b '
下一个
c
下一个
追溯(最近一次通话最后一次):
模块中文件'标准输入',第1行
下一个
停止迭代
00-1010看看廖雪峰的解释:
通过列表生成,我们可以直接创建一个列表。但是由于内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表不仅会占用大量的存储空间,而且如果我们只需要访问前几个元素,那么后面大部分元素所占用的空间就会被浪费掉。因此,如果列表元素可以按照某种算法计算,我们是否可以在循环中连续计算后续元素?这样就不需要创建一个完整的列表,节省了很多空间。在Python中,这种循环计算的机制被称为生成器。
生成器也是一个迭代器,但是你只能迭代一次。这是因为它们不会将所有值存储在内存中,而是在运行时生成值。
您可以通过遍历来使用它们,要么通过for循环,要么通过将它们传递给任何可以迭代的函数和结构。大多数时候,生成器是作为一个函数来实现的。然而,它们不返回值,而是一个收益值。
每次调用生成器的next()时,它都会从上次停止的地方继续执行(它会记住上次执行语句时的所有数据值)。下面的例子展示了如何非常容易地创建一个生成器:
def反向(数据):
对于范围内的索引(len(data)-1,-1,-1):
产量数据[指数]
用于反向充电(“高尔夫”):
.打印(字符)
.
f
l
o
G可以用生成器做的事情也可以用上一节描述的基于类的迭代器来完成。但是生成器的方法更紧凑,因为它会自动构建__iter__()和__next__()方法。
00-1010发电机不一定要用复变函数表示。python提供了简洁的生成器表达式。
形式上,生成器表达式与列表派生类似,只是列表派生中的[]替换为(),但两者有很大区别。生成器表达式可以说是迭代函数和列表解析函数的结合。
生成器表达式可以认为是一种特殊的生成器函数,类似于希腊字母的第11个表达式和普通函数。但是和生成器一样,生成器表达式也是返回生成器发电机对象,一次只返回一个值。
范围(10)中我的和(i * i平方和
285
xvec=[10,20,30]
yvec=[7,5,3]
总和(x*y代表x,y在zip(xvec,yvec)中)#点积
260
来自数学导入圆周率
sine _ table={ x : sin(x * pi/180)x在范围(0,91)内}
unique _ words=set(逐行逐页逐行拆分())
毕业生代表=max((学生。gpa,学生。名称)
数据='高尔夫'
列表(范围内我的数据[一](镜头(数据)-1,-1,-1))
['f ',' l ',' o ',' g']END