带iterable的Python for循环是如何工作的?

带iterable的Python for循环是如何工作的?,python,for-loop,iterable,Python,For Loop,Iterable,feed.entry中的party的表示什么?for循环实际如何工作 for party in feed.entry: print(party.location.address.text) (我习惯C++的循环样式,但Python循环让我困惑)。 Fo..Enter是允许迭代的东西,包含某种类型的对象。这与c++大致相似: for (feed::iterator party = feed.entry.begin(); party != feed.entry.end(); ++party

feed.entry中的party的
表示什么?for循环实际如何工作

for party in feed.entry:
    print(party.location.address.text)

(我习惯C++的循环样式,但Python循环让我困惑)。

Fo..Enter是允许迭代的东西,包含某种类型的对象。这与c++大致相似:

for (feed::iterator party = feed.entry.begin(); party != feed.entry.end(); ++party) {
   cout << (*party).location.address.text;
}
for(feed::iterator party=feed.entry.begin();party!=feed.entry.end();++party){

coutfeed.entry是feed的属性,它的值是(如果不是,此代码将失败)实现迭代协议的对象(例如,数组),并且具有iter方法,该方法返回迭代器对象

迭代器有next()方法,返回下一个元素或引发异常,因此python for循环实际上是:

iterator = feed.entry.__iter__()
while True:
    try:
        party = iterator.next()
    except StopIteration:
        # StopIteration exception is raised after last element
        break

    # loop code
    print party.location.address.text

party只需在iterable提要上迭代。条目

看看解释。

在Python中,bucles与C/C++不同,它们最像PHP的foreach。您所做的不是像在一段时间内使用“(initialization;condition;increment)”那样迭代,它只是在列表中的每个元素上迭代(字符串类似于列表)

例如:

for number in range(5):
    print number
将输出

0
1
2
3
4

要将我的0.05美元添加到前面的答案中,您可能还需要查看


Python的
for
循环与
迭代器一起工作,迭代器必须实现
迭代器协议。有关更多详细信息,请参阅:


我只是想为新手提供一个更一般的解释

语法上,for
循环看起来像

for <name to be assigned to> in <some sequence>:

    <block of code, optionally referencing the name>
你也可以在赋值部分解包参数。用同样的方法,你可以做像

a, b = 1, 2
for a, b in [(1, 2), (3, 4), (5, 6)]: print(a + b)
…你也可以做像

a, b = 1, 2
for a, b in [(1, 2), (3, 4), (5, 6)]: print(a + b)
…它打印

3
7
11
Python中的A总是在--上运行,这意味着它可以在其项上提供一个。for
语句依次获取,将其分配给目标名称,并使用该名称运行套件(“正文”)

#   |name|   |iterable|
for party in feed.entry:
    # body...
    print(party.location.address.text)
在本例中,
feed.entry
是iterable,
party
是目标名称,
print…
是套件。iterator由
for
语句自动请求,并保存迭代状态,例如,如果iterable是列表,则保存下一个元素的索引


如果你来自C++,一个经典的表示:迭代状态<代码> i>代码>被保存在可迭代的外部。这对应于Python的<代码>,而<代码>循环:

# for (int i = 0; i < 10; ++i)
i = 0
while i < 10:
    i += 1
    # access the state of an iterable here
(请注意,从
\uuuu iterating=True
\uuuu iterating=False
的整个块对于包含的范围是不“可见”的。实现使用各种优化,例如CPython)

for
语句只定义了iterable和iterator的使用方式。如果您对外部迭代比较熟悉,那么它也有助于了解iterable和iterator


iter(iterable)
调用已经完成-这就好像
iter
对于各种结构类型都是重载的

  • 如果定义了
    type(iterable)。\uuu iter\uuu
    ,则将其作为方法调用,并将结果用作迭代器

  • 如果定义了
    type(iterable)。\uuu getitem\uuuuuuuuuuuu
    ,则它由一个泛型迭代器类型包装,该迭代器类型返回
    iterable[0]
    iterable[1]
    ,并在索引时引发
    索引器时引发
    停止迭代

无论哪种方式,
iter
返回或引发
TypeError
。迭代器是定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
(用于重用)和
\uuuuuuuuuuu。通常,迭代器是可以保存状态以计算
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
项的对象。例如,列表迭代器对应于此对象:

class ListIterator:
    """Python equivalent of ``iter(:list)``"""
    # iterator holds iteration state - e.g. iterable and current index
    def __init__(self, iterable: list):
        self.iterable = iterable
        self.index = 0

    # __next__ fetches item and advances iteration state - e.g. index += 1
    def __next__(self):
        # attempt to produce an item
        try:
            item = self.iterable[self.index]
        except IndexError:  # translate indexing protocol to iteration protocol
            raise StopIteration
        # update iteration state
        self.index += 1
        return item

    # iterators can be iterated on in ``for`` statements etc.
    def __iter__(self):
        return self
(请注意,人们会习惯性地将这样一个对象写为a。)


索引列表或增加某个指针只是iterable/iterator协议的一个非常基本的示例。例如,迭代器可以是无状态的,并使用
random.random()
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中生成无限的随机数流。迭代器还可以保存外部信息的状态,并以迭代方式遍历文件系统。如果我没记错的话,这是python的使用年限(2.0之前的版本)(使用length(),[]和counter)不一定是列表。最好称之为iterable。是的。但这似乎是一个初学者问题。我想让回答保持简单。字符串不是列表。字符串是iterable,列表也是,但字符串和列表在Python中肯定是两种不同的类型。嗯,在许多语言中,字符串是字符数组,在Python中是字符串迭代时的行为非常相似…编辑…是的,字符串和列表在迭代时非常相似,但在许多其他情况下非常不同。例如,您不能修改字符串。+1,因为给出等效的低级代码通常是最好的解释;希望我只给出+0.9,因为第一行应该是
iter(feed.entry)
(大多数情况下,当您直接调用一个特殊方法而不是通过一个内置的方法时,您是在错误地调用它,尽管也有例外;-)请注意,在Python 3中,魔法<代码> NeX//Cord>方法现在被称为“代码>”,“NEXTXYX feed。或者在使用C++之前,设置所有笨拙的C++脚手架()。
class ListIterator:
    """Python equivalent of ``iter(:list)``"""
    # iterator holds iteration state - e.g. iterable and current index
    def __init__(self, iterable: list):
        self.iterable = iterable
        self.index = 0

    # __next__ fetches item and advances iteration state - e.g. index += 1
    def __next__(self):
        # attempt to produce an item
        try:
            item = self.iterable[self.index]
        except IndexError:  # translate indexing protocol to iteration protocol
            raise StopIteration
        # update iteration state
        self.index += 1
        return item

    # iterators can be iterated on in ``for`` statements etc.
    def __iter__(self):
        return self