range() 如何区分在这种情况下进行的调用?
示例:
def ex():
list = [1,2,3,4]
for val in range(len(list)):
print(val)
break
for val in range(len(list)):
print(val)
break
输出 -
0
0
简而言之,我的问题是为什么输出没有这样产生?
0
1
在“第一个 for 循环”中第一次调用 range() 期间,调用的是“range(len(list))”, 在“第二个 for 循环”中对 range() 的第一次调用中,调用是“range(len(list))”,这相当于“第一个 for 循环”中对 range() 的第二次调用。 range() 如何知道调用是否来自“第二个 for 循环”而不是“第一个 for 循环”?
我不确定你为什么期望
range
会记得它之前被调用过。该类不维护有关先前调用的任何状态;它只是按照你的要求做。每次调用 range(x)
都会返回一个新的 range
对象,当您对其进行迭代时,该对象会提供从 0 到 x-1
的数字。每个呼叫都独立于之前的任何呼叫。
要获得您所描述的行为,您需要在每个循环中为 range
对象重用 same
iterator。
Python 3.5.1 (default, Apr 18 2016, 11:46:32)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> l = [1,2,3,4]
>>> r = range(len(l))
>>> for val in r:
... print(val)
... break
...
0
>>> for val in r:
... print(val)
... break
...
0
>>> i = iter(r)
>>> for val in i:
... print(val)
... break
...
0
>>> for val in i:
... print(val)
... break
...
1
你可以想象类似的事情
for x in xs:
do_something(x)
是
的缩写i = iter(xs)
while True:
try:
x = next(i)
except StopIteration:
break
do_something(x)
如果它实际上已经是一个迭代器,则 iter
返回其参数,因此当您尝试迭代非迭代器可迭代时,每个 for
循环都会返回一个新的、从头开始的迭代器。
这就是您如何制作自己的自定义 range() 函数:)
类 Your_self_made_forLoop: def init(自身,开始,结束): self.start = 开始 self.end = 结束 def iter(自身): 返回循环(自身) 类循环: def init(self, iterable_obj): self.iterable = iterable_obj def iter(自身): 返回自我 def next(自身): 如果 self.iterable.start >= self.iterable.end: 引发停止迭代 当前 = self.iterable.start self.iterable.start += 1 返回电流
for i in Your_self_made_forLoop(1,6): 打印(一)