'range()'如何在内部工作?

its*_*cvk 0 python range

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
Run Code Online (Sandbox Code Playgroud)

输出 -

0
0
Run Code Online (Sandbox Code Playgroud)

总之,我的问题是为什么输出不是这样产生的?

0
1
Run Code Online (Sandbox Code Playgroud)

在第一次调用'first for循环'中的range()期间,调用是'range(len(list))',并且在第一次调用'second for循环'中的range()时,调用是'range(len(list))',相当于'first for循环'中第二次调用range().range()如何知道调用是来自'second for loop'而不是'first for loop'?

che*_*ner 6

我不确定你为什么range 记得它以前被调用过.该课程没有保留任何先前电话的状态; 它只是做你要求的.每次调用都会range(x)返回一个新range对象,该对象x-1在迭代时提供从0到0的数字.每个呼叫都独立于之前的呼叫.

要获得您描述的行为,您需要在每个循环中为对象重用相同的 迭代器range.

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
Run Code Online (Sandbox Code Playgroud)

你可以形象像

for x in xs:
    do_something(x)
Run Code Online (Sandbox Code Playgroud)

是的缩写

i = iter(xs)
while True:
    try:
        x = next(i)
    except StopIteration:
        break
    do_something(x)
Run Code Online (Sandbox Code Playgroud)

iter实际上,如果它已经是迭代器,则返回它的参数,因此for当您尝试迭代非迭代器迭代时,每个循环都会返回一个新的,在开始时开始的迭代器.

  • 迭代器是提供`__next__`方法的东西,而*iterable*是提供`__iter__`方法的东西.`range`定义`__iter__`,但不定义`__next__`.(`range .__ iter__`返回`range_iterator`的实例,它是定义`__next__`的类). (2认同)
  • 忽略确切的实现,要理解的关键是 Python 区分“可以”迭代的对象和正在进行的迭代的状态。`range` 表示静态的数字序列;`range_iterator` 表示迭代一个范围的过程。您可以有多个活动迭代器来迭代同一个“范围”对象,每个迭代器都有自己对正在查看的“当前”值的想法。 (2认同)