“range()”内部如何工作?

问题描述 投票:0回答:2

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 循环”?

python range
2个回答
6
投票

我不确定你为什么期望

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
循环都会返回一个新的、从头开始的迭代器。


0
投票

这就是您如何制作自己的自定义 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): 打印(一)

© www.soinside.com 2019 - 2024. All rights reserved.