Python for循环如何工作?

时间:2009-08-18 06:44:12

标签: python for-loop

我习惯于for循环的C ++方式,但Python循环让我感到困惑。

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

party中的feed.entry。它意味着什么以及它如何实际起作用?

8 个答案:

答案 0 :(得分:22)

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

Iterator有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

答案 1 :(得分:5)

feed.entry允许迭代,并包含某种类型的对象。这大致类似于c ++:

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

答案 2 :(得分:5)

要将我的0.05 $添加到之前的答案中,您可能还需要查看enumerate builtin function

for i, season in enumerate(['Spring', 'Summer', 'Fall', 'Winter']):
    print i, season

0 Spring
1 Summer
2 Fall
3 Winter

答案 3 :(得分:4)

派对只是遍历列表 feed.entry

看看Dive into Python解释。

答案 4 :(得分:2)

在Python中, for bucles与C / C ++不同,它们最像PHP的 foreach 。你做的不是在中迭代,而用“(初始化;条件;增量)”,它只是迭代列表中的每个元素(字符串像列表一样是ITERABLE)。

例如:

for number in range(5):
    print number

将输出

0
1
2
3
4

答案 5 :(得分:1)

我只是想为新手提供一个更通用的解释。

从语法上讲,for循环看起来像......

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

    <block of code, optionally referencing the name>

解释器为序列中的每个项目运行块一次(任何可以迭代的东西)。每次运行块时,它首先将序列中的下一个对象分配给名称,该名称可以是任何有效的变量名称。

执行for each in (1, 2, 3): print(each) [或多或少]与执行... {/ p>相同

i = 0
sequence = (1, 2, 3)
while True:
    try:
        each = sequence[i]
        print(each)
        i += 1
    except IndexError: pass

您还可以在分配部分中解压缩参数。就像你可以做的那样......

a, b = 1, 2

......你也可以做像...这样的事情。

for a, b in [(1, 2), (3, 4), (5, 6)]: print(a + b)

...打印......

3
7
11

答案 6 :(得分:0)

Python的for循环与iterators一起使用,iterator必须实现{{1}}协议。有关详细信息,请参阅:

答案 7 :(得分:0)

Python中的for statement始终在iterable上运行-这意味着它可以为其项目提供iteratorfor语句连续获取next element from the iterator,将其分配给目标名称并以此运行套件(“ body”)。

在示例中,feed.entry是可迭代的,party是目标名称,print ...是套件。 for语句自动请求迭代器,并保留迭代状态-例如如果可迭代对象是列表,则为下一个元素的索引。


如果您来自C ++,则经典的for (int i = 0; i < 10; ++i) loop代表external iteration:迭代状态i保持在可迭代之外。这对应于Python的while循环:

# for (int i = 0; i < 10; ++i)
i = 0
while i < 10:
    i += 1
    # access the state of an iterable here

较新的for (auto party : entry) range loop表示内部迭代:迭代状态由单独的迭代器保持。这对应于Python的for循环。但是,可迭代/迭代器协议显着不同:Python的for使用iter(iterable)来获取迭代器,该迭代器应支持next(iterator)-返回元素或引发StopIteration

用Python编写的definition of the for statement与此对应:

# for party in feed.entry:
__iterator = iter(feed.entry)  # iterator -- not visible in containing scope
__iterating = True             # graceful exit to enter `else` clause
while __iterating:
    try:                          # attempt to...
        item = next(__iterator)   # ... get the next item
    except StopIteration:         # ... or stop
        __iterating = False       #     with a graceful exit
    else:
        party = item
        <suite>                # run the body with names bound
else:                          # entered in a graceful exit only
    <else suite>

(请注意,从__iterating = True__iterating = False的整个块对于包含的作用域是“不可见的。实现使用了各种优化,例如CPython允许builtin iterators to return a C NULL instead of raising a Python StopIteration。)

for语句仅定义如何迭代和迭代器的使用。如果您最熟悉外部迭代,那么它也有助于研究可迭代和迭代器。


iter(iterable)调用具有multiple ways to derive an iterator-好像iter对于各种结构类型都已重载。

  • 如果定义了type(iterable).__iter__,则将其称为方法,并将结果用作迭代器。

  • 如果定义了type(iterable).__getitem__,则由通用迭代器类型包装,该迭代器类型返回iterable[0]iterable[1],...,如果{{ 1}}会在建立索引时引发。

无论哪种方式,StopIteration都会返回iterator或加注IndexError。迭代器是 any 类型,它定义iter(用于可重用性)和TypeError(用于实际迭代)。通常,迭代器是可以保持状态以计算__iter__项的对象。例如,列表迭代器与此对象相对应:

__next__

(请注意,习惯上会写一个generator function这样的对象。)

为列表建立索引或增加一些指针只是可迭代/迭代器协议的一个非常基本的示例。例如,迭代器可能是无状态的,并在__next__中使用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 来产生无限的随机数流。迭代器还可以保存外部信息的状态,例如,迭代遍历文件系统。