Iterables/generators 说明
Iterables/generators explanation
有人可以解释一下 __next__
如何使用下面的代码吗?我知道 'next' 用于迭代器获取可迭代对象的下一项,通常使用 next()
。
我知道 __iter__
部分被执行是因为 list()
调用执行了 __next__
。但是 __next__
一直在执行,几乎就像一个 while 循环?直到执行 StopIteration?
此外,__next__
下的所有 'return' 元素都存储在哪里?是否全部存储在内存中,直到 __iter__
return self
returns 到调用函数?
class FRange(object):
def __init__(self, start, stop=None, step=None):
if stop is None:
self.i = 0
self.stop = start
self.step = 1
elif step is None:
self.i = start
self.stop = stop
self.step = 1
else:
self.i = start
self.stop = stop
self.step = step
def __iter__(self):
return self
def __next__(self):
if self.i < self.stop and self.step > 0:
self.i += self.step
return self.i - self.step
elif self.i > self.stop and self.step < 0:
self.i += self.step
return self.i - self.step
else:
raise StopIteration
def rangeFloat(args):
return list(FRange(*args))
上面的代码生成例如:
For args = [-1.1, 2.4, 0.3], the output is
rangeFloat(args) = [-1.1, -0.8, -0.5, -0.2, 0.1, 0.4, 0.7, 1, 1.3, 1.6, 1.9, 2.2].
list
基本上像
def list(thing):
result = []
for item in thing:
result.append(item)
return result
和一个for
循环:
for item in thing:
# loop body
效果像
iterator = iter(thing):
while True:
try:
item = next(iterator)
except StopIteration:
break
# loop body
将这些东西放在一起,list
调用您的 FRange
实例的 __iter__
方法来获取迭代器;在这种情况下,迭代器是您的 FRange
实例本身。然后它重复调用 __next__
并将所有 __next__
return 值附加到列表,直到 __next__
引发 StopIteration
。一旦引发 StopIteration
,list
return 就是它构建的列表。
有人可以解释一下 __next__
如何使用下面的代码吗?我知道 'next' 用于迭代器获取可迭代对象的下一项,通常使用 next()
。
我知道 __iter__
部分被执行是因为 list()
调用执行了 __next__
。但是 __next__
一直在执行,几乎就像一个 while 循环?直到执行 StopIteration?
此外,__next__
下的所有 'return' 元素都存储在哪里?是否全部存储在内存中,直到 __iter__
return self
returns 到调用函数?
class FRange(object):
def __init__(self, start, stop=None, step=None):
if stop is None:
self.i = 0
self.stop = start
self.step = 1
elif step is None:
self.i = start
self.stop = stop
self.step = 1
else:
self.i = start
self.stop = stop
self.step = step
def __iter__(self):
return self
def __next__(self):
if self.i < self.stop and self.step > 0:
self.i += self.step
return self.i - self.step
elif self.i > self.stop and self.step < 0:
self.i += self.step
return self.i - self.step
else:
raise StopIteration
def rangeFloat(args):
return list(FRange(*args))
上面的代码生成例如:
For args = [-1.1, 2.4, 0.3], the output is
rangeFloat(args) = [-1.1, -0.8, -0.5, -0.2, 0.1, 0.4, 0.7, 1, 1.3, 1.6, 1.9, 2.2].
list
基本上像
def list(thing):
result = []
for item in thing:
result.append(item)
return result
和一个for
循环:
for item in thing:
# loop body
效果像
iterator = iter(thing):
while True:
try:
item = next(iterator)
except StopIteration:
break
# loop body
将这些东西放在一起,list
调用您的 FRange
实例的 __iter__
方法来获取迭代器;在这种情况下,迭代器是您的 FRange
实例本身。然后它重复调用 __next__
并将所有 __next__
return 值附加到列表,直到 __next__
引发 StopIteration
。一旦引发 StopIteration
,list
return 就是它构建的列表。