我习惯于for循环的C ++方式,但Python循环让我感到困惑。
for party in feed.entry:
print party.location.address.text
party
中的feed.entry
。它意味着什么以及它如何实际起作用?
答案 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上运行-这意味着它可以为其项目提供iterator。 for
语句连续获取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
来产生无限的随机数流。迭代器还可以保存外部信息的状态,例如,迭代遍历文件系统。