Python 当在for循环中用作迭代器时,将列表项称为什么?
我不确定在下面的for循环中如何命名n。有一个术语吗Python 当在for循环中用作迭代器时,将列表项称为什么?,python,terminology,Python,Terminology,我不确定在下面的for循环中如何命名n。有一个术语吗 for n in [1,2,3,4,5]: print i 而且,列表本身是for循环的迭代器,我说的对吗 你举的例子是 n称为循环变量 列表扮演的角色更难命名 事实上,在与@juanpa.arrivillaga进行了一次有趣的对话之后,我得出结论,对于这个语法元素,没有一个明确正确的正式名称,也没有一个常用名称 话虽如此,我确实认为如果你在一个句子的上下文中把它称为循环迭代器,每个人都会知道你的意思 在这样做的过程中,您可能会让自
for n in [1,2,3,4,5]:
print i
而且,列表本身是for循环的迭代器,我说的对吗 你举的例子是 n称为循环变量 列表扮演的角色更难命名 事实上,在与@juanpa.arrivillaga进行了一次有趣的对话之后,我得出结论,对于这个语法元素,没有一个明确正确的正式名称,也没有一个常用名称 话虽如此,我确实认为如果你在一个句子的上下文中把它称为循环迭代器,每个人都会知道你的意思 在这样做的过程中,您可能会让自己或其他人感到困惑,因为处于该位置的语法元素实际上不是迭代器,而是集合或松散的集合,而是参考文章中的定义中的某种iterable 我想之所以没有这个名字,一个原因是我们几乎不需要在一句话中提到它。另一个原因是,它们可能出现在该位置的元素类型差异很大,因此很难用标签安全地覆盖所有元素 当n被称为循环变量时,列表绝对不是迭代器。它是iterable对象,即和iterable,但它不是迭代器。iterable本身可能是迭代器,但并不总是如此。也就是说,迭代器是可迭代的,但并非所有的可迭代都是迭代器。在列表的情况下,它只是一个iterable 它是一个iterable,因为它实现了一个_iter__)方法,该方法返回一个迭代器: 从表中可以看出: 一种能够一次返回一个成员的对象。例子 iterables包括所有序列类型,如list、str和tuple 还有一些非序列类型,如dict、文件对象和 使用_uiter或_getitem方法定义的任何类。 Iterables可用于for循环和许多其他需要 序列需要zip、map等。。。。当一个iterable对象 作为参数传递给内置函数iter,它返回 对象的迭代器。此迭代器适用于在 一组值。使用iterables时,通常不需要 调用iter或自己处理迭代器对象。for声明 这样做会自动为您创建一个临时的未命名变量 在循环期间保持迭代器 因此,请注意:
>>> x = [1,2,3]
>>> iterator = iter(x)
>>> type(iterator)
<class 'list_iterator'>
>>> next(iterator)
1
>>> next(iterator)
2
>>> next(iterator)
3
>>> next(iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
相当于:
iterator = iter(some_iterable)
while True:
try:
n = next(iterator)
# do something
except StopIteration as e:
break
迭代器通过调用对象的_iter _方法返回,也实现了通常返回自身的_iter _方法,但它们也实现了一个_next _方法。因此,检查某个对象是否是iterable的一种简单方法是查看它是否实现了下一个方法
这是:
>>> for c1 in my_list:
... for c2 in my_list:
... print(c1,c2)
...
a a
a b
a c
b a
b b
b c
c a
c b
c c
>>>
迭代器的行为方式几乎相同,因此我仍然可以这样做:
>>> it = iter(my_list)
>>> for c in it:
... print(c)
...
a
b
c
>>>
但是,迭代器不支持多次迭代。您可以将自己的迭代器设置为支持多次迭代的迭代器,但通常情况下,迭代器不支持:
>>> it = iter(my_list)
>>> for c1 in it:
... for c2 in it:
... print(c1,c2)
...
a b
a c
为什么呢?请回忆一下在引擎盖下使用for循环的迭代器协议所发生的事情,并考虑如下:
for n in some_iterable:
# do something
>>> my_list = ['a','b','c','d','e','f','g']
>>> iterator = iter(my_list)
>>> iterator_of_iterator = iter(iterator)
>>> next(iterator)
'a'
>>> next(iterator)
'b'
>>> next(iterator_of_iterator)
'c'
>>> next(iterator_of_iterator)
'd'
>>> next(iterator)
'e'
>>> next(iterator_of_iterator)
'f'
>>> next(iterator)
'g'
>>> next(iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> next(iterator_of_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
我看到它被称为一个项目。变量名通常取决于所迭代的内容,例如文件中的行、行中的行等@linusg我怀疑基本编程书是否指定了这些元素。仅举一个例子,没有命名它们。@GreenAsJade-同意,但了解Python中for循环的工作原理将是一个很好的开始。稍后,他可以学习所有这些花哨的名字,如迭代器等。谢谢大家的帮助。@linusg我相信我确实理解for循环是如何工作的,但我正试图向我班上的其他学生解释它的用法,因此能够给它起一个独特的名称是非常有用的,这样就不会将它与其他概念混淆。循环变量是程序员经常谈论的话题,但我不知道是否有官方的Python术语。注意,在Python中可以有多个循环变量:对于n,enumeratea_列表中的item,对于k,v,在a_dict.items中,对于x,y,z,在coords_列表中等等。注意:我认为您可以将列表称为迭代器,但循环迭代器更清晰,这是比较可取的,因为迭代器是一个重载严重的术语。列表不是迭代器。正如您在回答的注释中所讨论的,列表不是python迭代器,但它是这个基于迭代器的for循环构造中的循环迭代器。我想您混淆了迭代器这一不幸重载术语的两种用法。Python有一个迭代器的正式定义,列表确实不是其中之一。然而,在基本的分类术语中,Pythonfor循环是一个简单的循环。这个构造的组件是循环变量和循环迭代器。不幸的是,存在这些不同的定义/用法。。。但他们确实如此。而后一种方法符合OP的目的。你还没有提供
d你的回答中有一个替代方案。@GreenAsJade对不起,但我仍然不同意。来自您自己的链接:它的特点通常是使用隐式或显式迭代器,其中循环变量接受序列或其他数据集合中的每个值。在Python for each构造中,循环迭代器是隐式的。我们同意的循环变量,列表是序列或其他数据收集。这允许其他情况。在Python中,我们还可以使用列表。我同意这不是一个理想的术语冲突,但据我所知,这是问题的答案。我不知道这个构造有任何其他分类法。@GreenAsJade另外,如果您遵循到的链接,它的内容是:在计算机编程中,迭代器是一个使程序员能够遍历容器(特别是列表)的对象。迭代器不是容器,它是一个支持遍历的对象。显然不是。然而,它在基于迭代器的for循环构造中扮演着迭代器的角色。这是它正在扮演的角色的名称。Python恰好支持在该角色中放置列表。
>>> it = iter(my_list)
>>> for c1 in it:
... for c2 in it:
... print(c1,c2)
...
a b
a c
>>> my_list = ['a','b','c','d','e','f','g']
>>> iterator = iter(my_list)
>>> iterator_of_iterator = iter(iterator)
>>> next(iterator)
'a'
>>> next(iterator)
'b'
>>> next(iterator_of_iterator)
'c'
>>> next(iterator_of_iterator)
'd'
>>> next(iterator)
'e'
>>> next(iterator_of_iterator)
'f'
>>> next(iterator)
'g'
>>> next(iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> next(iterator_of_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> id(iterator)
139788446566216
>>> id(iterator_of_iterator)
139788446566216