- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在阅读有关生成器和迭代器以及 __next__()
的作用的文章.'__next__' in dir(mygen)
.是真的'__next__' in dir(mylist)
,是假的
当我深入研究它时,'__next__' in dir (mylist.__iter__())
是真的
__next__
仅可列出但仅适用于 __iter__()
和 mygen
但不是 mylist
.怎么样__iter__()
调用 __next__
当我们使用列表理解遍历列表时mygen.__next__()
.它不存在。它仅作为 mygen.__next__
存在这称为方法包装器。 mygen() and __iter__() ?
__next__
生成器和迭代器都提供了什么(以及它们唯一的属性)那么生成器和迭代器之间有什么区别?*__next__()
.我的错。查看日志,不知何故
mygen.__next__()
测试给了我停止迭代异常错误。但是我无法再次复制该错误。
最佳答案
特殊方法__iter__
和 __next__
是创建 iterator types 的迭代器协议(protocol)的一部分.为此,您必须区分两个不同的事物:迭代 和 迭代器 .
Iterables 是可以迭代的东西,通常,这些是某种包含项目的容器元素。常见的例子是列表、元组或字典。
为了迭代一个可迭代对象,您可以使用迭代器。迭代器是帮助您遍历容器的对象。例如,在迭代列表时,迭代器本质上会跟踪您当前所在的索引。
要获得迭代器,__iter__
在可迭代对象上调用方法。这就像一个工厂方法,它为这个特定的可迭代对象返回一个新的迭代器。具有 __iter__
的类型方法定义,把它变成一个可迭代的。
迭代器通常需要一个方法,__next__
,它返回迭代的下一项。此外,为了使协议(protocol)更易于使用,每个迭代器也应该是可迭代的,在 __iter__
中返回自身。方法。
举个简单的例子,这可能是一个列表的迭代器实现:
class ListIterator:
def __init__ (self, lst):
self.lst = lst
self.idx = 0
def __iter__ (self):
return self
def __next__ (self):
try:
item = self.lst[self.idx]
except IndexError:
raise StopIteration()
self.idx += 1
return item
ListIterator(self)
来自
__iter__
方法。当然,列表的实际实现是用 C 完成的,所以这看起来有点不同。但想法是一样的。
for
环形:
for item in lst:
print(item)
lst_iterator = iter(lst) # this just calls `lst.__iter__()`
while True:
try:
item = next(lst_iterator) # lst_iterator.__next__()
except StopIteration:
break
else:
print(item)
__next__
在那个可迭代对象上,直到它遇到
StopIteration
异常(exception)。这发生在表面之下也是您希望迭代器实现
__iter__
的原因。同样:否则你永远无法遍历迭代器。
yield
声明。一旦你调用那个生成器函数,你就会得到一个生成器。生成器本质上只是一个迭代器,尽管它很花哨(因为它不仅仅是在容器中移动)。作为迭代器,它有一个
__next__
“生成”下一个元素的方法,以及
__iter__
方法来返回自身。
def exampleGenerator():
yield 1
print('After 1')
yield 2
print('After 2')
yield
的函数体语句将其转换为生成器函数。这意味着当您拨打
exampleGenerator()
时你会得到一个生成器对象。生成器对象实现了迭代器协议(protocol),所以我们可以调用
__next__
在它上面(或使用上面的
next()
函数):
>>> x = exampleGenerator()
>>> next(x)
1
>>> next(x)
After 1
2
>>> next(x)
After 2
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
next(x)
StopIteration
next()
call 还没有打印任何东西。这是生成器的特殊之处:它们是惰性的,并且只根据需要进行评估以从可迭代对象中获取下一项。只有第二个
next()
调用,我们从函数体中得到第一个打印的行。我们需要另一个
next()
调用以耗尽可迭代对象(因为没有产生另一个值)。
StopIteration
最后的异常,它允许生成器(和生成器函数)用作
for
循环源和任何可以使用“正常”迭代的地方。
next()
),并且每隔一段时间,网站将不得不查询后端以检索更多项目供您使用滚动浏览。理想情况下,这会在您没有注意到的情况下发生。而这正是生成器所做的。它甚至允许这样的事情:
def counter():
x = 0
while True:
x += 1
yield x
class CounterGenerator:
def __init__ (self):
self.x = 0
def __iter__ (self):
return self
def __next__ (self):
self.x += 1
return self.x
关于python - __next__ 在生成器和迭代器中,什么是方法包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40255096/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!